golang micro 整体概念

前言

最近接触了一下 golang micro ,其实接触 golang micro 的目的是学习一下微服务概念和其相关组件。在我理解看来主要分为API 网关服务注册服务发现服务治理服务追踪 以及服务间通信 ,所以基本上各种微服务组件都是为了解决上述几个问题的:

  • api 网关作为入口可以做一些统一操作,比如鉴权,比较有名的有kongzuul
  • 微服务间通信的首要条件是要知道对方的 ipport ,而这些如果写死在配置文件里面是很不利于后期维护的,最好的方法是各服务启动的时候自动注册到服务中心,停止服务的时候从服务中心解除注册,当服务 A 想和服务 B 通信的时候就从服务中心查找 B 服务的 ipport ,一般服务中心会对已经注册的服务定期健康检查 来保证已经注册的服务是可用的,还会提供watch 机制来让服务查询者感知服务的变化(服务的上下线),比较常用的服务注册服务发现 组件有 consuletcderuaka
  • 服务治理,比较有名的是Netflix 开源的Hystrix ,提供了重试服务熔断限流 等功能,也有golang 版本的开源
  • 当微服务数量一多,服务调用链路会越来越长,如何有效追踪服务链就是一个问题了。jaeger 应运而生。
  • 服务间通信主要有 rpc 方式和 http 方式,微服务间常用的通讯方式是 rpc ,因为他传输的是二进制,比http 传输的json 效率更高。比较有名的 rpc 框架有grpcthrift ,现在一般都是 grpc + protobuf

了解到golang 微服务生态主要有 go-kitgo-micrio 前者是一个微服务标准库,提供独立包供开发者自己组建微服务,而 micro 是一个面向微服务的可插拔的 rpc 框架,简而言之go-kit 是库,可高度定制和全盘掌控,而micro 是框架,已经集成了一些微服务组件,并且是可插拔式的。先学习了解下 micro ,后面再去学习go-kit

micro

先上官网的一张图:runtime3

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 使用的请求handlerapi ,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 架构图: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 的设计是致力于可插拔,无论是Registrybrokerselector、通信机制,都是可以替换的。

其它
  • 配置库 Go Config ,类似 viper,可以支持多种方式读取多种类型的配置,并且具有监听配置改动的能力。
  • grpc 支持,可以很轻松地将 go-micro service 替换为 grpc service。
  • Go pluginsgo-micromicro 的插件集合,正是因为这些插件造就了插拔式 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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!