第一课 Go容器化微服务系统实战-基本介绍和使用
作者:互联网
第一课 Go容器化微服务系统实战-基本介绍和使用
tags:
- GO
- 慕课网
categories:
- GO
- 微服务
- go-micro
文章目录
第一节 GO微服务
1.1 微服务介绍
- 微服务首先他是一种架构模式
- 微服务相比较单体架构,微服务架构更独立,能够单独更新和发布
- 微服务里面的服务仅仅用于某一个特定的业务功能
- 特点
- 逻辑清晰
- 快速迭代
- 多语言灵活组合
1.2 微服务与DDD
- 领域驱动设计(Domain Driven Design,简称DDD )
- 还有个定律:康威定律(Conway’s Law)。就是说组织架构对应我们微服务拆分。
- DDD的作用:真正决定软件复杂性的是设计方法
- 有助于指导我们确定系统边界
- 能够聚焦在系统核心元素上
- 帮助我们拆分系统
- DDD常用概念-领域
- 领域:领域是有范围界限的,也可以说是有边界的
- 核心域:核心域是业务系统的核心价值
- 通用子域:所有子域的消费者,提供着通用服务(比如电商领域的短信、邮件就属于这个)
- 支撑子域:专注于业务系统的某一重要的业务
- DDD常用概念-界限上下文
- 理解∶语文中的语境的意思
- 方式∶领域+界限上下文
- 目的:不在于如何划分边界,而在于如何控制边界
- DDD常用概念-领域模型
- 理解∶领域模型是对我们软件系统中要解决问题的抽象表达。
- 领域∶反应的是我们业务上需要解决的问题
- 模型:我们针对该问题提出的解决方案
- DDD域微服务四层架构
- 上面架构继续拆分就是下面微服务架构。
1.3 微服务的设计原则
- 要领域驱动设计,而不是数据驱动设计,也不是界面驱动设计
- 数据驱动设计:系统下来模块拆分完,就设计表结构字段。
- 界面驱动设计:界面页面缺啥补啥
- 要边界清晰的微服务,而不是泥球小单体
- 要职能清晰的分层,而不是什么都放的大箩筐
- 要做自己能hold住的微服务,而不是过度拆分的微服务
第二节 go-micro基础:gRPC和ProtoBuf
2.1 RPC和gRPC介绍
- RPC介绍
- RPC代指远程过程调用(Remote Procedure Call )
- 包含了传输协议和编码(对象序列号)协议
- 允许运行于一台计算机的程序调用另一台计算机的子程序
- 使用RPC有什么好处? 简单、通用、安全、效率
- gRPC介绍
- gRPC是一个高性能、开源、通用的RPC框架(背景:谷歌)
- 基于HTTP2.0协议标准设计开发
- 支持多语言,默认采用Protocol Buffers 数据序列化协议
2.2 ProtoBuf总体介绍
-
ProtoBuf是一种轻便高效的序列化结构化数据的协议
-
通常用在存储数据和需要远程数据通信的程序上
-
跨语言,更小、更快、也更简单
-
优点:
- 加速站点之间数据传输速度
- 解决数据传输不规范问题
-
Protocol Buffers常用概念:
- Message定义∶描述了一个请求或响应的消息格式
- 字段标识: 消息的定义中,每个字段都有一个唯一的数值标签
- 常用数据类型: double , float , int32/64, bool, string,bytes
- Service服务定义∶在Service中可以定义一个RPC服务接口
-
Protocol Buffers Message中字段修饰符
- singular:表示成员有0个或者一个,一般省略不写
- repeated:表示该字段可以包含0~N个元素
-
新建一个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文件-环境
- https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-win64.zip
- 下载解压,配置bin文件夹环境变量。
- cmd运行protoc --version
- 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
- 编译生成go文件。
# proto的路径 生成go文件路径 micro风格go文件路径 生成的proto文件
protoc product.proto --gofast_out=. --micro_out=.
- 当然你也可以使用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(运行时)
- Micro是用来构建和管理分布式程序的系统, 它包括一下几个部分。
- Runtime(运行时)︰用来管理配置,认证,网络等
- Framework(程序开发框架):用来方便编写微服务
- Clients(多语言客户端):支持多语言访问服务端
- Micro中Runtime(运行时)介绍。它是工具集,工具名称是"micro"。
- 官方docker版本是docker pull micro/micro
- Micro中Runtime(运行时),它的工具组成部分有:
- api : api 网关
- broker :允许异步消息的消息代理
- network :通过微网络服务构建多云网络
- new :服务模板生成器
- proxy :建立在Go Micro 上的透明服务代理
- registry :一个服务资源管理器
- store :简单的状态存储
- web : Web仪表板允许您浏览服务
3.2 Micro介绍-Framework
- Micro其中Framework(go-micro)介绍
- 它是对分布式系统的高度抽象
- 提供分布式系统开发的核心库
- 可插拔的架构,按需使用
- Micro其中Framework(go-micro)组件
- 注册(Registry)︰提供了服务发现机制
- 选择器(Selector) :能够实现负载均衡
- 传输(Transport )︰服务与服务之间通信接口
- Broker:提供异步通信的消息发布/订阅接口
- 编码(Codec ) :消息传输到两端时进行编码与解码
- Server(服务端),Client(客户端)
- Micro其中Framework(go-micro)组件架构图
- Micro其中Framework(go-micro)通信图
3.3 go-micro简单Helloworld-服务端
- go-micro整体过程
- Proto编写
- 服务端编写
- Client端编写
- 环境借鉴:https://zhuanlan.zhihu.com/p/252428619
- 微服务借鉴:https://learnku.com/docs/go-micro/2.x/hello-world/8462
- 构建目录结构,编写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=.
- 在顶层目录newmicro下初始化包管理工具go mod
go mod init cap-imooc
# 导入将要使用的包go-micro
go get github.com/micro/go-micro/v2
go mod download
- 创建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-客户端
- client.go
- 运行如果报错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