微服务实战Go Micro v3 系列(一)- 基础篇

celverbamboo · · 4853 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近完成了公司租房微服务项目,由于使用 **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)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4853 次点击  ∙  3 赞  
加入收藏 微博
2 回复  |  直到 2021-08-14 16:49:11
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传