其他分享
首页 > 其他分享> > 第一课 Go容器化微服务系统实战-基本介绍和使用

第一课 Go容器化微服务系统实战-基本介绍和使用

作者:互联网

第一课 Go容器化微服务系统实战-基本介绍和使用

tags:

categories:

文章目录

第一节 GO微服务

1.1 微服务介绍

  1. 微服务首先他是一种架构模式
  2. 微服务相比较单体架构,微服务架构更独立,能够单独更新和发布
  3. 微服务里面的服务仅仅用于某一个特定的业务功能
  4. 特点
    • 逻辑清晰
    • 快速迭代
    • 多语言灵活组合

1.2 微服务与DDD

  1. 领域驱动设计(Domain Driven Design,简称DDD )
  2. 还有个定律:康威定律(Conway’s Law)。就是说组织架构对应我们微服务拆分。
  3. DDD的作用:真正决定软件复杂性的是设计方法
    • 有助于指导我们确定系统边界
    • 能够聚焦在系统核心元素上
    • 帮助我们拆分系统
  4. DDD常用概念-领域
    • 领域:领域是有范围界限的,也可以说是有边界的
    • 核心域:核心域是业务系统的核心价值
    • 通用子域:所有子域的消费者,提供着通用服务(比如电商领域的短信、邮件就属于这个)
    • 支撑子域:专注于业务系统的某一重要的业务
  5. DDD常用概念-界限上下文
    • 理解∶语文中的语境的意思
    • 方式∶领域+界限上下文
    • 目的:不在于如何划分边界,而在于如何控制边界
  6. DDD常用概念-领域模型
    • 理解∶领域模型是对我们软件系统中要解决问题的抽象表达。
    • 领域∶反应的是我们业务上需要解决的问题
    • 模型:我们针对该问题提出的解决方案
  7. DDD域微服务四层架构
    在这里插入图片描述
  8. 上面架构继续拆分就是下面微服务架构。
    在这里插入图片描述

1.3 微服务的设计原则

  1. 要领域驱动设计,而不是数据驱动设计,也不是界面驱动设计
    • 数据驱动设计:系统下来模块拆分完,就设计表结构字段。
    • 界面驱动设计:界面页面缺啥补啥
  2. 要边界清晰的微服务,而不是泥球小单体
  3. 要职能清晰的分层,而不是什么都放的大箩筐
  4. 要做自己能hold住的微服务,而不是过度拆分的微服务

第二节 go-micro基础:gRPC和ProtoBuf

2.1 RPC和gRPC介绍

  1. RPC介绍
    • RPC代指远程过程调用(Remote Procedure Call )
    • 包含了传输协议和编码(对象序列号)协议
    • 允许运行于一台计算机的程序调用另一台计算机的子程序
  2. 使用RPC有什么好处? 简单、通用、安全、效率
  3. gRPC介绍
    • gRPC是一个高性能、开源、通用的RPC框架(背景:谷歌)
    • 基于HTTP2.0协议标准设计开发
    • 支持多语言,默认采用Protocol Buffers 数据序列化协议
      在这里插入图片描述

2.2 ProtoBuf总体介绍

  1. ProtoBuf是一种轻便高效的序列化结构化数据的协议

  2. 通常用在存储数据和需要远程数据通信的程序上

  3. 跨语言,更小、更快、也更简单

  4. 优点:

    • 加速站点之间数据传输速度
    • 解决数据传输不规范问题
  5. Protocol Buffers常用概念:

    • Message定义描述了一个请求或响应的消息格式
    • 字段标识: 消息的定义中,每个字段都有一个唯一的数值标签
    • 常用数据类型: double , float , int32/64, bool, string,bytes
    • Service服务定义∶在Service中可以定义一个RPC服务接口
  6. Protocol Buffers Message中字段修饰符

    • singular:表示成员有0个或者一个,一般省略不写
    • repeated:表示该字段可以包含0~N个元素
      在这里插入图片描述
  7. 新建一个proto文件demo。product.proto

syntax = "proto3"; // 版本号

package go.micro.service.product; // 包名

// 定义一个service 驼峰写法 定义服务
service Product {
  rpc AddProduct(ProductInfo) returns (ResponseProduct) {}
}

// 消息格式
message ProductInfo {
  int64 id = 1 ; // 这里不是赋值 而是字段标识符 修饰符省略
  string Product_name = 2; // 这里最好不要超过15 超过15会开两个字节存我们的字段
}

message ResponseProduct {
  int64 product_id = 1;
}

2.3 使用Proto生成编译后的go文件-环境

  1. https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-win64.zip
  2. 下载解压,配置bin文件夹环境变量。
  3. cmd运行protoc --version
  4. window环境不使用docker参考:https://www.jianshu.com/p/72ba2d7b9051
# windows
SET GO111MODULE=on
SET GOPROXY=https://goproxy.cn
# 这个版本要对应 要用v2 否则后面会报错 更新go-micro, micro, protoc-gen-micro到v2版本
go get github.com/micro/go-micro/v2
go get github.com/micro/protoc-gen-micro/v2
go get -u github.com/golang/protobuf/protoc-gen-go
# 原因未知,protoc-gen-go插件无法生成.pb.go文件,换用protoc-gen-gofast插件。
go get github.com/gogo/protobuf/protoc-gen-gofast

# liunx
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
# 这个版本要对应 要用v2 否则后面会报错
go get github.com/micro/go-micro/v2
go get github.com/micro/protoc-gen-micro/v2
go get -u github.com/golang/protobuf/protoc-gen-go
# go get github.com/gogo/protobuf/protoc-gen-gofast
  1. 编译生成go文件。
# proto的路径 生成go文件路径 micro风格go文件路径 生成的proto文件
protoc product.proto --gofast_out=. --micro_out=. 
  1. 当然你也可以使用docker创建环境,进行编译。https://hub.docker.com/r/znly/protoc/
# 注意版本 最新的是3.0
docker run --rm --user `id -u ${USER}` -v `pwd`:`pwd` -w `pwd` znly/protoc -I. --go_out=plugins=grpc:. my_server.proto

在这里插入图片描述

第三节 Go微服务框架go-micro

3.1 Micro介绍-Runtime(运行时)

  1. Micro是用来构建和管理分布式程序的系统, 它包括一下几个部分。
    • Runtime(运行时)︰用来管理配置,认证,网络等
    • Framework(程序开发框架):用来方便编写微服务
    • Clients(多语言客户端):支持多语言访问服务端
  2. Micro中Runtime(运行时)介绍。它是工具集,工具名称是"micro"。
    • 官方docker版本是docker pull micro/micro
  3. Micro中Runtime(运行时),它的工具组成部分有:
    • api : api 网关
    • broker :允许异步消息的消息代理
    • network :通过微网络服务构建多云网络
    • new :服务模板生成器
    • proxy :建立在Go Micro 上的透明服务代理
    • registry :一个服务资源管理器
    • store :简单的状态存储
    • web : Web仪表板允许您浏览服务

3.2 Micro介绍-Framework

  1. Micro其中Framework(go-micro)介绍
    • 它是对分布式系统的高度抽象
    • 提供分布式系统开发的核心库
    • 可插拔的架构,按需使用
  2. Micro其中Framework(go-micro)组件
    • 注册(Registry)︰提供了服务发现机制
    • 选择器(Selector) :能够实现负载均衡
    • 传输(Transport )︰服务与服务之间通信接口
    • Broker:提供异步通信的消息发布/订阅接口
    • 编码(Codec ) :消息传输到两端时进行编码与解码
    • Server(服务端),Client(客户端)
  3. Micro其中Framework(go-micro)组件架构图
    在这里插入图片描述
  4. Micro其中Framework(go-micro)通信图
    在这里插入图片描述

3.3 go-micro简单Helloworld-服务端

  1. go-micro整体过程
    • Proto编写
    • 服务端编写
    • Client端编写
    • 环境借鉴:https://zhuanlan.zhihu.com/p/252428619
    • 微服务借鉴:https://learnku.com/docs/go-micro/2.x/hello-world/8462
  2. 构建目录结构,编写Proto文件,并编译生成go文件。go版本使用: go1.13.12
    在这里插入图片描述
syntax = "proto3";

package go.micro.service.imooc;

service Cap {
  rpc SayHello(SayRequest) returns (SayResponse) {}
}

message SayRequest{
  string message = 1;
}

message SayResponse {
  string answer = 1;
}
protoc *.proto --gofast_out=. --micro_out=. 
  1. 在顶层目录newmicro下初始化包管理工具go mod
go mod init cap-imooc
# 导入将要使用的包go-micro
go get github.com/micro/go-micro/v2
go mod download
  1. 创建server.go文件。GoLand中如果运行报错,看下设置中的Go Modules是否开启。启动后重新导包。
package main

import (
	imooc "cap-imooc/proto/cap"
	"context"
	"fmt"
	"github.com/micro/go-micro"
)


type CapServer struct {}
// 需要实现的方法 参数可以从上面imooc.pb.micro.go中获取
func (c *CapServer) SayHello(ctx context.Context, req *imooc.SayRequest , res *imooc.SayResponse) error {
	// 业务逻辑代码
	res.Answer = "我们口号是: \"" + req.Message + "\""
	return nil
}


func main(){
	// 创建新的服务
	service := micro.NewService(
		micro.Name("cap.imooc.server"),
		)
	// 初始化方法
	service.Init()
	// 注册我们的服务 RegisterCapHandler 就是我们自己在imooc.proto中生成的服务cap
	// imooc为我们自动生成的别名 原来为cap_imooc_service_imooc 重新起个别名
	imooc.RegisterCapHandler(service.Server(), new(CapServer))
	// 运行服务
	if err := service.Run(); err != nil {
		fmt.Println(err)
	}
}

3.4 go-micro简单Helloworld-客户端

  1. client.go
  2. 运行如果报错500
    • go run main.go --registry=etcd使用etcd当注册中心,
    • 否则默认的注册中心是 mdns(在 Windows 系统中默认不可用
package main

import (
	imooc "cap-imooc/proto/cap"
	"context"
	"fmt"
	"github.com/micro/go-micro"
)

func main(){
	// 实例化
	service := micro.NewService(
		micro.Name("cap.imooc.client"),
		)
	// 初始化
	service.Init()

	// 写需要访问的service
	capImooc := imooc.NewCapService("cap.imooc.server", service.Client())
	res, err := capImooc.SayHello(context.TODO(), &imooc.SayRequest{Message: "Go语言 微服务学习 你学废了吗!"})
	if err != nil {
		fmt.Println(err)
	}else{
		fmt.Println(res.Answer)
	}
}

标签:protoc,服务,micro,化微,第一课,go,Go,com,imooc
来源: https://blog.csdn.net/aa18855953229/article/details/118501300