最近完成了公司租房微服务项目,由于使用 **go-micro v3**遇到了不少的问题,在这里利用一个实战项目帮助大家融会贯通的使用 **go-micro v3**
另外,由于 Micro3.0直接放弃维护 go-micro,所以网上很多文章都是已经过时的了。
<!--more-->
## 源码地址
* [源码地址](https://github.com/CleverBamboo/go-micro-examples)
* [爱租房](https://github.com/CleverBamboo/renting)
## 系列文章
* [微服务实战Go Micro v3 系列(一)- 基础篇](https://cleverbamboo.github.io/2021/04/27/GO/微服务实战Go-Micro-v3-系列(一)-基础篇/#more)
* [微服务实战Go Micro v3 系列(二)- HelloWorld](https://cleverbamboo.github.io/2021/04/27/GO/微服务实战Go-Micro-v3-系列(二)-HelloWorld/#more)
* [微服务实战Go-Micro v3 系列(三)- 启动HTTP服务](https://cleverbamboo.github.io/2021/04/28/GO/微服务实战Go-Micro-v3-系列(三)-启动HTTP服务/#more)
* [微服务实战Go Micro v3 系列(四)- 事件驱动(Pub/Sub)](https://cleverbamboo.github.io/2021/05/12/GO/微服务实战Go-Micro-v3-系列(四)-事件驱动-Pub-Sub/#more)
* [微服务实战Go Micro v3 系列(五)- 注册和配置中心](https://cleverbamboo.github.io/2021/06/02/GO/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Go-Micro-v3-%E7%B3%BB%E5%88%97%EF%BC%88%E4%BA%94%EF%BC%89-%E6%B3%A8%E5%86%8C%E5%92%8C%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/#more)
* [微服务实战Go Micro v3 系列(六)- 综合篇(爱租房项目)](https://cleverbamboo.github.io/2021/06/08/GO/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98Go-Micro-v3-%E7%B3%BB%E5%88%97%EF%BC%88%E5%85%AD%EF%BC%89-%E7%BB%BC%E5%90%88%E7%AF%87%EF%BC%88%E7%88%B1%E7%A7%9F%E6%88%BF%E9%A1%B9%E7%9B%AE%EF%BC%89/#more)
## Go Micro 简介与设计理念
Go Micro 是一个基于 Go 语言编写的、用于构建微服务的基础框架,提供了分布式开发所需的核心组件,包括 RPC 和事件驱动通信等。
它的设计哲学是「可插拔」的插件化架构,其核心专注于提供底层的接口定义和基础工具,这些底层接口可以兼容各种实现。例如 Go Micro 默认通过 consul 进行服务发现,通过 HTTP 协议进行通信,通过 protobuf 和 json 进行编解码,以便你可以基于这些开箱提供的组件快速启动,但是如果需要的话,你也可以通过符合底层接口定义的其他组件替换默认组件,比如通过 etcd 或 zookeeper 进行服务发现,这也是插件化架构的优势所在:不需要修改任何底层代码即可实现上层组件的替换。
## Go Micro 基础架构介绍
Go Micro 框架的基础架构如下,由 8 个核心接口组成,每个接口都有默认实现:
![](https://z3.ax1x.com/2021/04/27/g9DPAJ.png)
它的设计哲学是「可插拔」的插件化架构,其核心专注于提供底层的接口定义和基础工具,这些底层接口可以兼容各种实现。例如 Go Micro 默认通过 consul 进行服务发现,通过 HTTP 协议进行通信,通过 protobuf 和 json 进行编解码,以便你可以基于这些开箱提供的组件快速启动,但是如果需要的话,你也可以通过符合底层接口定义的其他组件替换默认组件,比如通过 etcd 或 zookeeper 进行服务发现,这也是插件化架构的优势所在:不需要修改任何底层代码即可实现上层组件的替换。
* 最顶层的 **Service** 接口是构建服务的主要组件,它把底层的各个包需要实现的接口,做了一次封装,包含了一系列用于初始化 Service 和 Client 的方法,使我们可以很简单的创建一个 RPC 服务;
* **Client** 是请求服务的接口,从 Registry 中获取 Server 信息,然后封装了 Transport 和 Codec 进行 RPC 调用,也封装了 Brocker 进行消息发布,默认通过 RPC 协议进行通信,也可以基于 HTTP 或 gRPC;
* **Server** 是监听服务调用的接口,也将以接收 Broker 推送过来的消息,需要向 Registry 注册自己的存在与否,以便客户端发起请求,和 Client 一样,默认基于 RPC 协议通信,也可以替换为 HTTP 或 gRPC;
* **Broker** 是消息发布和订阅的接口,默认实现是基于 HTTP,在生产环境可以替换为 Kafka、RabbitMQ 等其他组件实现;
* **Codec** 用于解决传输过程中的编码和解码,默认实现是 protobuf,也可以替换成 json、mercury 等;
* **Registry** 用于实现服务的注册和发现,当有新的 Service 发布时,需要向 Registry 注册,然后 Registry 通知客户端进行更新,Go Micro 默认基于 consul 实现服务注册与发现,当然,也可以替换成 etcd、zookeeper、kubernetes 等;
* **Selector** 是客户端级别的负载均衡,当有客户端向服务端发送请求时,Selector 根据不同的算法从 Registery 的主机列表中得到可用的 Service 节点进行通信。目前的实现有循环算法和随机算法,默认使用随机算法,另外,Selector 还有缓存机制,默认是本地缓存,还支持 label、blacklist 等方式;
* **Transport** 是服务之间通信的接口,也就是服务发送和接收的最终实现方式,默认使用 HTTP 同步通信,也可以支持 TCP、UDP、NATS、gRPC 等其他方式。
Go Micro 官方创建了一个 [Plugins](https://github.com/microhq/go-plugins) 仓库,用于维护 Go Micro 核心接口支持的可替换插件:
| 接口 | 支持组件 |
| --------- | ------------------------------------ |
| Broker | NATS、NSQ、RabbitMQ、Kafka、Redis 等 |
| Client | gRPC、HTTP |
| Codec | BSON、Mercury 等 |
| Registry | Etcd、NATS、Kubernetes、Eureka 等 |
| Selector | Label、Blacklist、Static 等 |
| Transport | NATS、gPRC、RabbitMQ、TCP、UDP |
| Wrapper | 中间件:熔断、限流、追踪、监控 |
各个组件接口之间的关系可以通过下图串联:
![](https://z3.ax1x.com/2021/04/27/g9yTvq.jpg)
## 小结
通过上述介绍,可以看到,Go Micro 简单轻巧、易于上手、功能强大、扩展方便,是基于 Go 语言进行微服务架构时非常值得推荐的一个 RPC 框架,基于其核心功能及插件,我们可以轻松解决之前讨论的微服务架构引入的需要解决的问题:
* 服务接口定义:通过 Transport、Codec 定义通信协议及数据编码;
* 服务发布与调用:通过 Registry 实现服务注册与订阅,还可以基于 Selector 提高系统可用性;
* 服务监控、服务治理、故障定位:通过 Plugins Wrapper 中间件来实现。
接下来,我们将基于 Go Micro 微服务框架演示如何基于 Go 落地微服务架构。
## 参考链接
* [Micro 不能用了?关于 Go 语言微服务框架 Micro 的一些情况说明](https://www.mdeditor.tw/pl/pnjv)
* [go-micro 到底是个啥?](https://zhuanlan.zhihu.com/p/58985155)
有疑问加站长微信联系(非本文作者))