我们已经通过多节课,学习了go-micro框架的核心功能和相关机制的使用方法。我们利用本节课的内容,对go-micro框架做一个整体的说明和总结。
# 微服务架构
微服务系统在实践过程中,会将我们所学习的内容进行综合使用和实践。常见的微服务架构如下图所示:
我们结合微服务的架构,根据我们所学的go-micro框架相关的知识,进行总结和说明。
# go-micro架构
go-micro架构图之前我们就已经介绍过。框架特性和接口定义:
- 服务发现:通过服务发现自动注册和名称解析
- 负载均衡:基于发现组件构建的服务的负载均衡机制
- 同步通信:基于RPC调用的通信,支持双向流
# 服务发现
服务的注册与发现机制提供了解析服务名称和服务地址的功能,服务注册和发现功能可以由consul、etcd、zookeeper、dns、gossip等提供支持。程序服务在启动时向注册/发现组件注册相关信息,在服务关闭时进行反注册关闭。
go-micro框架中使用Registry接口来实现服务注册和发现机制,开发者可以通过micro.NewRegistry()实例化具体的服务发现组件。在本课程中,我们实现使用Consul进行服务发现。Consul工作原理如下图所示:
在我们课程的第10节《创建微服务》和第11节《健康检查机制和可选项配置》中详细讲解了服务发现机制的设计与编程实现。
# 服务通信
在go-micro框架中,同步通信和异步消息同喜是分开的。
同步通信
在go-micro框架中,Transport接口用于建立服务实例之间点对点的通信。
我们编写的server.go中实现了服务的定义,并实现服务的注册和运行;client.go程序提供向服务端发起请求的请求调用。
客户端和服务器之间进行请求信息传输和通信,采用RPC实现调用和返回,在同步通信过程中,不仅支持数据结构体的传输,还支持客户端流、服务端流和双向流的通信流实现。
客户端流
客户端流是客户端在发起请求时,以流数据的形式进行写入,在proto文件中进行服务定义时,做stream定义说明。
...
//订单服务service定义
service OrderService {
rpc GetOrderInfos (OrderRequest) returns (stream OrderInfo) {}; //服务端流模式
}
...
2
3
4
5
6
服务端流
服务端流模式是指服务端返回数据以流模式的方式进行返回,同样是在proto文件中服务定义时以stream进行说明。
//订单服务service定义
service OrderService {
rpc AddOrderList (stream OrderRequest) returns (OrderInfo) {}; //客户端流模式
}
2
3
4
双向流
双向流是在客户端流和服务端流的基础上,客户端和服务端通信均采用流的方式进行写入和接收的方式,是客户端流、服务端流的综合使用。
同步通信的实现在创建微服务并进行通信时就已经详细讲解过。客户端流、服务端流和双向流通信在本课程的第6节内容《客户端流、服务端流与双向流模式》中详细讲解了相关内容和实现步骤。主要采用插件化和protobuf结合进行实现。
异步通信
除了同步通信之外,go-micro框架还支持服务间进行异步通信。micro中采用代理转发的形式实现异步消息的通信。具体到go-micro框架中的实现,代理转发由Broker接口进行指定和自定义。用户可以在定义服务时通过micro.Broker进行自定义设置Broker。
go-micro支持的第三方的broker可以通过安装插件进行集成和设置。在课程的第12节《解耦利器事件驱动机制的应用》中详细讲解了如何安装mqtt,并通过mqtt.NewBroker实例化broker组件。
Broker机制的实现本质是事件驱动性质的消息订阅和发布过程。go-plugins插件库中包含很多第三方的broker插件实现方案,比如:mqtt、redis、kafka等。
# 负载均衡
go-micro框架中,基于Selector接口实现了客户端的负载均衡,并默认支持Random算法,除此之外还支持轮训算法。如果开发者想要实现自己的负载均衡策略,可以实现Selector接口。同时,Selector中的Cache提供了服务列表缓存功能,Mark方法提供标记黑名单的功能。
在课程的第13节内容《Micro负载均衡组件–Selector》中,我们对Selector接口和相关实现作了详细的说明。
# 微服务与web
对用户而言,最常见的是使用JSON格式进行HTTP接口请求通信,但是分布式微服务中各服务实例之间使用Protobuf进行通信。因此,需要进行一次转换。在go-micro框架中,提供了API网关的功能,go-micro通过API网关为后台的微服务功能提供代理。API网关负责将微服务的RPC方法代理成为支持HTTP协议的web请求,并将web端使用到的url向外暴露。
具体的内容我们在第14节《RESTful API设计标准和实践》课程内容中进行了详细的讲解和编程实践。
# 消息编码
消息编码是指在通信的过程中,消息数据传输到客户端与服务器端时所进行的编码和解码工作,可以是json格式,也可以是protobuf,bson,xml等。在go-micro框架中支持RPC通信的格式,例如JSON-RPC等。和编码通信相关的框架我们学习了gRPC框架,gRPC提供高性能,低延迟的可靠性服务。
# 身份认证和安全管理
在系统开发过程中,需要使用到权限认证和身份证,以及一些安全的认证。我们在课程的第7节《TLS验证和Token认证》讲解了两种认证方式,分别是TSL验证和JWT的Token认证。当然,go-micro也是支持身份认证和安全管理认证的。