2.2 简单介绍了解go-micro
go-micro核心组件介绍
前面已经说过Micro
和go-micro的区别了
。micro
是使用go-micro
框架编写的运行时工具集,它最主要的作用是辅助微服务开发。比如想自己马上构建一个web
环境或者api
环境进行调试,或者查看服务的健康状态,注册信息之类的。
而我们开发微服务时,使用的框架是go-micro
。它可以很好地帮助我们创建服务、服务注册与发现、负载均衡、扩展网关功能等等。
我们来简单了解一下go-micro
框架中的核心组件
我们来简单看一下右边的代码:
func main() {
service := micro.NewService( // 表示创建一个go-micro的服务
micro.Name("micro.service.account"), // 服务注册到注册中心时的名字,为空表示不注册
)
service.Run() // 运行 server
}
代码最后是service.Run()
实际上是开启server
服务,供其他服务的client
进行调用。
我们现在来说一下左边核心组件各自的功能:
- Client:发送RPC请求与广播消息
- Server:接收RPC请求与消费消息
- Broker:异步通信组件
- Codec:数据编码组件
- Registry:服务注册组件
- Selector:客户端均衡器
- Transport:同步通信组件
其中,Broker
和Transport
都是通讯组件,区别就是一个是异步
,另一个是同步
。所以我们在业务中使用Transport
组件会比较频繁,因为业务需要关心调用结果。
Codec
是数据编码组件,它可以自动将请求及其参数,转换为需要的格式。例如,当我们需要调用其他服务时,Transport
默认的是使用grpc2
,grpc2
使用的通讯格式是Protobuf
,所以Codec
会帮我们将数据转为Protobuf
格式进行发送。
Registry
是服务注册组件,它既可以帮我们把我们的服务注册到服务中心,又可以在服务中心中获取已经注册的服务列表,供我们进行调用。
Selector
客户端均衡器配合服务注册组件。当从服务中心中获取已经注册的服务列表时,由于相同的一个服务可能是高可用的架构,所以需要一个均衡调度器,根据不同的均衡权重算法,来帮我们选择一个合适的节点进行调用。
下面我们来通过核心组件调用关系
来加深一下理解
go-micro核心组件调用关系
Server
当执行service.Run()
时,Registry
服务注册组件会将我们之前设置的micro.Name
,当前服务所在的IP
与端口
信息注册到服务中心,供其他服务的Client
进行调用。
Client
Client
是当我们需要其他服务时使用的。它会先通过Registry
服务注册组件,从注册中心获取到服务以及其对应的地址列表,然后Selector
客户端均衡器会根据算法选择一个合适的地址。确定之后,再通过Broker
或者是Transport
通讯组件,在Codec
数据编码组件的编码过后,进行发送。
服务端收到的请求,经过Codec
数据编码组件的解码后,计算得出结果。如果是Transport
,则再通过通讯组件、数据编码组件的编码后进行发送。调用方获得获得结果。
go-micro核心组件的默认使用
由于go-micro
的扩展性支持Registry
、Transport
、Broker
、Server
都可以是使用不同协议或不同工具的。所以我们有必要来了解一下默认都是使用哪一些协议或工具。
我提前使用下一章编写好的的account
服务注册通过etcd
的注册方式到服务中心后,通过micro
工具查看注册信息
> micro --registry=etcd get service micro.service.account
service micro.service.account
version latest
ID Address Metadata
micro.service.account-37cf2bd5-87bd-4912-b324-4dac0af013b5 192.168.1.40:49648 protocol=grpc,registry=etcd,server=grpc,transport=grpc,broker=http
Endpoint: AccountService.AccountRegister
Request: {
message_state MessageState {
no_unkeyed_literals NoUnkeyedLiterals
do_not_compare DoNotCompare
do_not_copy DoNotCopy
message_info MessageInfo
}
int32 int32
unknown_fields []uint8
username string
password string
}
Response: {
message_state MessageState {
no_unkeyed_literals NoUnkeyedLiterals
do_not_compare DoNotCompare
do_not_copy DoNotCopy
message_info MessageInfo
}
int32 int32
unknown_fields []uint8
code int32
message string
}
通过protocol=grpc,registry=etcd,server=grpc,transport=grpc,broker=http
我们可以看出:
- 通讯协议默认是
grpc
server
默认是grpc
transport
默认是grpc
broker
默认是http
registry
实际上默认是mdns
,我通过参数指定的方式让它使用的是etcd
(因为后面使用的基本都是etcd)。
这篇文章也只是大致简单的介绍了一下go-micro
框架。如果对micro
有兴趣的小伙伴去Micro中国以及micro中文资源进行更加深入、系统的学习和使用。