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用于客户端向服务发起请求的负载均衡,负载均衡算法课意识随机、轮询等TransportTransport是服务与服务之间同步请求/响应的通信接口。和Golang的net包类似,但是提供更高级的抽象,可以切换通信机制,比如http、rabbitmq、websockets、NATs。传输也支持双向流,这一强大的功能使得客户端可以向服务端推送数据。Codec处理编码与解码。Server包是使用编写服务的构建包,可以命名服务,注册请求处理器,增加中间件等等。服务构建在以上说的包之上,提供独立的接口来服务请求。现在服务的构建是RPC系统,在未来可能还会有其它的实现。服务端允许定义多个不同的编码来服务不同的编码消息。client客户端提供接口来创建向服务端的请求。与服务端类似,它构建在其它包之上,它提供独立的接口,通过注册中心来基于名称发现服务,基于选择器(selector)来负载均衡,使用transport、broker处理同步、异步消息。
从上面可以看出 go-micro 的设计是致力于可插拔,无论是Registry、broker、selector、通信机制,都是可以替换的。
其它
- 配置库
Go Config,类似viper,可以支持多种方式读取多种类型的配置,并且具有监听配置改动的能力。 grpc支持,可以很轻松地将go-microservice 替换为grpcservice。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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: