阅读 1402

【go-micro实践】micro 微服务架构实践

Github完整代码地址 个人博客

微服务架构

micro拥有完整的微服务生态,使用它构建一整套完整的微服务架构。下图是作者在博客中给出的使用micro的微服务架构图。

在这里插入图片描述
使用micro框架提供的工具Micro API(命令 micro api 运行)即可启动启动一个API网关。

$ go get -u github.com/micro/micro​ 
$ micro api --help
NAME:
   micro api - Run the api gateway

USAGE:
   micro api [command options] [arguments...]

OPTIONS:
   --address 	Set the api address e.g 0.0.0.0:8080 [$MICRO_API_ADDRESS]
   --handler 	Specify the request handler to be used for mapping HTTP requests to services; {api, event, http, rpc} [$MICRO_API_HANDLER]
   --namespace 	Set the namespace used by the API e.g. com.example.api [$MICRO_API_NAMESPACE]
   --resolver 	Set the hostname resolver used by the API {host, path, grpc} [$MICRO_API_RESOLVER] 
复制代码

micro工具是使用go-micro构建,所有同样具有服务发现等功能。如上图,micro api会把外部的http请求转发的内部Order API服务等,API服务内部实现会调用更底层的Service。一般我们将这里的API服务(Order API ...)称为聚合层服务或者业务层服务,更加底层的Serivce称为支撑服务或者基础服务。

可以看出从逻辑上大致分为三层,网关层,聚合服务层,基础服务层,如图:

在这里插入图片描述
使用硬件或者软件负载均衡将流量分摊到API网关,由网关统一鉴权,然后再将请求路由到后端对应的服务上。相同的服务可以有多个实例,网关会按一定规则分摊到不同的实例,规则是通过插件可更改的,默认是随机。充值服务等聚合层的服务会根据业务逻辑调用底层的用户服务获取用户数据,调用账单服务创建账单等,与底层服务的调用采用RPC调用,micro采用protobuf来编解码,传输方式是可选的,mciro默认为http,可以使用grpc,tcp,nats,utp等。

所有的服务都可以多实例部署,go-micro已经帮我们处理好服务发现,RPC调用等问题,开发起来非常方便。当然我们还需要鉴权,熔断,链路追踪,监控等功能,才能真正的可以投入使用。micro框架的插件机制,可以非常方便的实现这些功能。

扩展micro自带的API网关

一般鉴权,熔断等功能都需要内置在API网关中,micro自带的网关并没有提供这些功能,但是我们可以自己写插件或者使用框架自带的插件来实现。计划为micro API网关增加如下功能:

  1. JWT鉴权
  2. Jaeger 链路追踪
  3. hystrix熔断dashboard展示
  4. prometheus监控

聚合层服务

聚合层服务主要是业务层逻辑,具体实现就是对外的HTTP API供前端调用。虽然micro API网关提供的将HTTP转换成内部RPC调用功能,但是写起来总觉得变扭。幸运的是micro同样提供gin等常用golang web 框架的集成方法,此处有作者的例子https://github.com/micro/examples/tree/master/greeter/api。使用这种方式,网关在工作时就不需要将外部HTTP请求转换成RPC方法,所以需要在启动mciro API网关增加一个参数:micro api --handler=http ,handler默认是rpc模式。