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

tags:

  • GO
  • 慕课网

categories:

  • GO
  • 微服务
  • go-micro


文章目录

  • 第一课 Go容器化微服务系统实战-基本介绍和使用
  • 第一节 GO微服务
  • 1.1 微服务介绍
  • 1.2 微服务与DDD
  • 1.3 微服务的设计原则
  • 第二节 go-micro基础:gRPC和ProtoBuf
  • 2.1 RPC和gRPC介绍
  • 2.2 ProtoBuf总体介绍
  • 2.3 使用Proto生成编译后的go文件-环境
  • 第三节 Go微服务框架go-micro
  • 3.1 Micro介绍-Runtime(运行时)
  • 3.2 Micro介绍-Framework
  • 3.3 go-micro简单Helloworld-服务端
  • 3.4 go-micro简单Helloworld-客户端


第一节 GO微服务

1.1 微服务介绍

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

1.2 微服务与DDD

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

1.3 微服务的设计原则

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

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

2.1 RPC和gRPC介绍

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

2.2 ProtoBuf总体介绍

  1. ProtoBuf是一种轻便高效的序列化结构化数据的协议
  2. 通常用在存储数据和需要远程数据通信的程序上
  3. 跨语言,更小、更快、也更简单
  4. 优点:
  • 加速站点之间数据传输速度
  • 解决数据传输不规范问题
  1. Protocol Buffers常用概念:
  • Message定义描述了一个请求或响应的消息格式
  • 字段标识: 消息的定义中,每个字段都有一个唯一的数值标签
  • 常用数据类型: double , float , int32/64, bool, string,bytes
  • Service服务定义∶在Service中可以定义一个RPC服务接口
  1. Protocol Buffers Message中字段修饰符
  • singular:表示成员有0个或者一个,一般省略不写
  • repeated:表示该字段可以包含0~N个元素
  1. 新建一个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微服务实战pdf go微服务实战38讲_go微服务实战pdf

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

3.1 Micro介绍-Runtime(运行时)

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

3.2 Micro介绍-Framework

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