golang micro 整体概念
前言
最近接触了一下 golang micro
,其实接触 golang micro
的目的是学习一下微服务概念和其相关组件。在我理解看来主要分为API 网关
、服务注册
、服务发现
、服务治理
、 服务追踪
以及服务间通信
,所以基本上各种微服务组件都是为了解决上述几个问题的:
api
网关作为入口可以做一些统一操作,比如鉴权,比较有名的有kong
、zuul
等- 微服务间通信的首要条件是要知道对方的 ip 和 port ,而这些如果写死在配置文件里面是很不利于后期维护的,最好的方法是各服务启动的时候自动注册到服务中心,停止服务的时候从服务中心解除注册,当服务 A 想和服务 B 通信的时候就从服务中心查找 B 服务的 ip 和 port ,一般服务中心会对已经注册的服务定期
健康检查
来保证已经注册的服务是可用的,还会提供watch
机制来让服务查询者感知服务的变化(服务的上下线),比较常用的服务注册
和服务发现
组件有consul
、etcd
、eruaka
- 服务治理,比较有名的是
Netflix
开源的Hystrix
,提供了重试、服务熔断、限流 等功能,也有golang
版本的开源 - 当微服务数量一多,服务调用链路会越来越长,如何有效追踪服务链就是一个问题了。
jaeger
应运而生。 - 服务间通信主要有
rpc
方式和http
方式,微服务间常用的通讯方式是rpc
,因为他传输的是二进制,比http
传输的json
效率更高。比较有名的rpc
框架有grpc
和thrift
,现在一般都是grpc + protobuf
了解到golang
微服务生态主要有 go-kit
和 go-micrio
前者是一个微服务标准库,提供独立包供开发者自己组建微服务,而 micro
是一个面向微服务的可插拔的 rpc
框架,简而言之go-kit
是库,可高度定制和全盘掌控,而micro
是框架,已经集成了一些微服务组件,并且是可插拔式的。先学习了解下 micro
,后面再去学习go-kit
。
micro
先上官网的一张图:
micro
提供了工具库,就是上图的Micro Runtime
这一层,由以下几个部分组成:
-
API 使用服务发现中查询的地址,将请求动态路由到具体服务。比如先开发好一个服务
api.go
,然后micro api --handler=api
开启micro api
,再go run api.go
开启服务,现在就可以直接向micro api
发起http请求,curl "http://localhost:8080/greeter/say/hello?name=John"
(micro api 默认8080端口,这里假设你的服务名是greeter)那么mocro api
将会通过服务发现找到可用的服务,最终路由到Say.Hello
这个方法上(Say
是结构体,Hello
是该结构体上的方法)上面开启micro api
的时候加了一个--handler=api
参数,这表示micro api
使用的请求handler
为api
,micro api
可以配置以下请求handler
:- `api` 负责把内部的RPC服务对外暴露成http接口,它接收并处理http请求,根据URL转成内部RPC请求,并把RPC服务的响应结果返回客户端。 - `rpc` 处理json及protobuf格式的POST请求,并转向RPC。 - `proxy` 方向代理 - `event` 处理任意的http请求并向消息总线分发消息。 - `web` http 方向代理,同时支持`websocket`
关于各个
handler
的区别和联系以及具体的服务映射规则可以参考 Micro API ,另外通过/rpc
方式可以绕过handler
与任何服务直接会话(通过post方式),如下:curl -d 'service=go.micro.srv.greeter' \ -d 'method=Say.Hello' \ -d 'request={"name": "Bob"}' \ http://localhost:8080/rpc
-
Bot
提供通过slack
消息来操作微服务的能力 -
CLI
交互式命令行,提供了一些命令访问和查询正在运行的微服务,例如micro list services
(列出服务)等命令。 -
web
提供web 界面查看服务运行状态,展示端点信息,请求与响应状态,甚至直接向服务进行查询。
下面到了 micro services
这一层,这一层也是我们开发者编写微服务的一层了,没错,通过 go-micro
来编写微服务。先上一张官网的 go-micro
架构图:
Registry
注册提供了服务发现机制来解析服务名到地址上。它可以使用Consul、etcd、zookeeper、dns、gossip等等提供支持。服务使用启动注册关机卸载的方式注册。服务可以选择性提供过期TTL和定时重注册来保证服务在线,以及在服务不在线时把它清理掉。Selector
用于客户端向服务发起请求的负载均衡,负载均衡算法课意识随机、轮询等Transport
Transport是服务与服务之间同步请求/响应的通信接口。和Golang的net包类似,但是提供更高级的抽象,可以切换通信机制,比如http、rabbitmq、websockets、NATs。传输也支持双向流,这一强大的功能使得客户端可以向服务端推送数据。Codec
处理编码与解码。Server
包是使用编写服务的构建包,可以命名服务,注册请求处理器,增加中间件等等。服务构建在以上说的包之上,提供独立的接口来服务请求。现在服务的构建是RPC系统,在未来可能还会有其它的实现。服务端允许定义多个不同的编码来服务不同的编码消息。client
客户端提供接口来创建向服务端的请求。与服务端类似,它构建在其它包之上,它提供独立的接口,通过注册中心来基于名称发现服务,基于选择器(selector)来负载均衡,使用transport、broker处理同步、异步消息。
从上面可以看出 go-micro
的设计是致力于可插拔,无论是Registry
、broker
、selector
、通信机制,都是可以替换的。
其它
- 配置库
Go Config
,类似viper
,可以支持多种方式读取多种类型的配置,并且具有监听配置改动的能力。 grpc
支持,可以很轻松地将go-micro
service 替换为grpc
service。Go plugins
是go-micro
和micro
的插件集合,正是因为这些插件造就了插拔式go-micro
,插件集合
总结
micro
是一个微服务生态系统,它提供了:
go-micro
基于GO
语言的可插拔rpc
微服务框架micro
工具集提供一系列工具:api
网关cli
命令行提供命令行方式和微服务交互slack bot
提供 slack 消息和微服务交互的能力web
提供web UI
查看微服务状态,web 界面
交互微服务的能力
go-plugins
提供一系列插件如 etcd、kubernetes、nats、rabbitmq、grpc 等
micro
是一个强大的微服务生态系统,本文旨在介绍微服务和micro
基本概念,算是对我这段时间来接触的一个总结和理解,水平有限,如果有误,欢迎指正。关于micro
更多介绍可以去 官网 查看。
本作品采用《CC 协议》,转载必须注明作者和本文链接