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默认是grpctransport默认是grpcbroker默认是httpregistry实际上默认是mdns,我通过参数指定的方式让它使用的是etcd(因为后面使用的基本都是etcd)。
这篇文章也只是大致简单的介绍了一下go-micro框架。如果对micro有兴趣的小伙伴去Micro中国以及micro中文资源进行更加深入、系统的学习和使用。
手摸手教你从开发到部署(CI/CD)GO微服务系列
关于 LearnKu
推荐文章: