2.2 简单介绍了解go-micro

未匹配的标注

go-micro核心组件介绍

前面已经说过Microgo-micro的区别了micro是使用go-micro框架编写的运行时工具集,它最主要的作用是辅助微服务开发。比如想自己马上构建一个web环境或者api环境进行调试,或者查看服务的健康状态,注册信息之类的。

而我们开发微服务时,使用的框架是go-micro。它可以很好地帮助我们创建服务、服务注册与发现、负载均衡、扩展网关功能等等。

我们来简单了解一下go-micro框架中的核心组件
2.2 简单介绍了解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:同步通信组件

其中,BrokerTransport都是通讯组件,区别就是一个是异步,另一个是同步。所以我们在业务中使用Transport组件会比较频繁,因为业务需要关心调用结果。

Codec是数据编码组件,它可以自动将请求及其参数,转换为需要的格式。例如,当我们需要调用其他服务时,Transport默认的是使用grpc2,grpc2使用的通讯格式是Protobuf,所以Codec会帮我们将数据转为Protobuf格式进行发送。

Registry是服务注册组件,它既可以帮我们把我们的服务注册到服务中心,又可以在服务中心中获取已经注册的服务列表,供我们进行调用。

Selector客户端均衡器配合服务注册组件。当从服务中心中获取已经注册的服务列表时,由于相同的一个服务可能是高可用的架构,所以需要一个均衡调度器,根据不同的均衡权重算法,来帮我们选择一个合适的节点进行调用。

下面我们来通过核心组件调用关系来加深一下理解

go-micro核心组件调用关系

2.2 简单介绍了解go-micro

Server

当执行service.Run()时,Registry服务注册组件会将我们之前设置的micro.Name,当前服务所在的IP端口信息注册到服务中心,供其他服务的Client进行调用。

Client

Client是当我们需要其他服务时使用的。它会先通过Registry服务注册组件,从注册中心获取到服务以及其对应的地址列表,然后Selector客户端均衡器会根据算法选择一个合适的地址。确定之后,再通过Broker或者是Transport通讯组件,在Codec数据编码组件的编码过后,进行发送。

服务端收到的请求,经过Codec数据编码组件的解码后,计算得出结果。如果是Transport,则再通过通讯组件、数据编码组件的编码后进行发送。调用方获得获得结果。

go-micro核心组件的默认使用

由于go-micro的扩展性支持RegistryTransportBrokerServer都可以是使用不同协议或不同工具的。所以我们有必要来了解一下默认都是使用哪一些协议或工具。

我提前使用下一章编写好的的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中文资源进行更加深入、系统的学习和使用。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~