本文相关代码:gitee
文章目录
前言
本章我们为系统集成第三方的消息中间件。
与注册中心一样,go-micro框架为消息中间件提供了标准的接口Broker
。只要实现这个接口就可以接入任意消息中间件。
下面我们以官方已经实现的nats为例,它是go语言开发的高性能消息中间件,也是我司项目的默认消息中间件。
具体步骤
一、NATS
1.1 简介
nats是一个开源的,云原生的消息系统。以下定义来自知乎用户Lucas分享:
nats核心基于EventMachine开发,原理是基于消息发布订阅机制,每台服务器上的每个模块会根据自己的消息类别向MessageBus发布多个消息主题,而同时也向自己需要交互的模块,按照需要的主题订阅消息。 能够达到每秒8-11百万个消息,整个程序很小只有3M,它不支持持久化消息,如果你离线,你就不能获得消息。
一些适用nats的场景有:
- 高吞吐量的消息分散 —— 少数的生产者需要将数据发送给很多的消费者。
- 寻址和发现 ——将数据发送给特定的应用实例,设备或者用户,也可用于发现并连接到基础架构中的实例,设备或用户。
- 命令和控制(控制面板)——向程序或设备发送指令,并从程序/设备中接收状态,如SCADA,卫星遥感,物联网等。
- 负载均衡 ——主要应用于程序会生成大量的请求,且可动态伸缩程序实例。
- N路可扩展性 ——通信基础架构能够充分利用go的高效并发/调度机制,以增强水平和垂直的扩展性。
- 位置透明 ——程序在各个地理位置上分布者大量实例,且你无法了解到程序之间的端点配置详情,及他们所生产或消费的数据。
- 容错
使用nats streaming可以做到持久化,缓存等功能,附加场景有:
- 从特定时间或顺序消费
- 持久性
- 有保证的消息投递
1.2 启动
nats的官方地址:NATS
官方有极其详尽的文档帮助我们对nats进行开发和使用,考虑到下载速度,仍然使用docker国内镜像启动nats,以下命令完全来自 官方文档
> docker run -p 4222:4222 -ti nats:latest
[1] 2020/09/25 02:59:19.212638 [INF] Starting nats-server version 2.1.8
[1] 2020/09/25 02:59:19.212671 [INF] Git commit [c0b574f]
[1] 2020/09/25 02:59:19.227179 [INF] Starting http monitor on 0.0.0.0:8222
[1] 2020/09/25 02:59:19.227325 [INF] Listening for client connections on 0.0.0.0:4222
[1] 2020/09/25 02:59:19.227333 [INF] Server id is NBGZSRZ7YMP2G64PVWABX5PQFZBPYO6EBLB6HOGYYRPMDEJIT25DQ36C
[1] 2020/09/25 02:59:19.227335 [INF] Server is ready
[1] 2020/09/25 02:59:19.277974 [INF] Listening for route connections on 0.0.0.0:6222
二、配置消息中间件
消息中间件的配置同样支持硬编码、命令行参数和环境变量,下面是简单演示:
2.1 代码中配置
消息的订阅方和发送方,配置也基本一致,下面以我们之前的task-srv
和achievement-srv
之间的finished
消息为例分别展示。
2.1.1 消息订阅
编辑go-todolist/achievement-srv/main.go
,加入nats配置使用nats去订阅之前的任务完成消息:
...
service := micro.NewService(
micro.Name("go.micro.service.achievement"),
micro.Version("latest"),
// 配置nats为消息中间件,默认端口是4222
micro.Broker(nats.NewBroker(
// 地址是我本地nats服务器地址,不要照抄
broker.Addrs("nats://172.18.0.58:4222"),
)),
)
...
由于achievement-srv是一个纯消息驱动的服务,我们不配置etcd服务发现相关内容
2.1.2 消息发送
编辑go-todolist/task-srv/main.go
在初始化服务的地方加入nats配置:
...
service := micro.NewService(
micro.Name("go.micro.service.task"),
micro.Version("latest"),
// 配置etcd为注册中心,配置etcd路径,默认端口是2379
micro.Registry(etcd.NewRegistry(
// 地址是我本地etcd服务器地址,不要照抄
registry.Addrs("172.18.0.58:2379"),
)),
// 配置nats为消息中间件,默认端口是4222
micro.Broker(nats.NewBroker(
// 地址是我本地nats服务器地址,不要照抄
broker.Addrs("nats://172.18.0.58:4222"),
)),
)
...
2.2 命令行参数
在启动命令中增加如下参数:
--broker=nats
--registry_address=172.18.0.58:4222
启动演示略
2.3 环境变量
在环境变量中配置注册中心:
MICRO_BROKER
- 注册方式MICRO_BROKER_ADDRESS
- 中心地址
启动演示略
三、使用micro web测试
上一章我们使用micro web
命令启动了一个简易的web端micro控制台。
这个控制台除了能看到注册的服务,还提供了一个简单的服务调用界面,可以直接在在网页上对服务发起调用。
3.1 启动服务
> micro --registry=etcd --registry_address=172.18.0.58:2379 web
3.2 调用接口
打开http://localhost:8082/client
,会看到一个简易的接口调用界面,说明见图:
总结
到这里我们就完成了nats的引入,go-micro还实现了其他很多消息中间件的接入,如http, nats, rabbitmq,接入方式都差不多,有兴趣可以自行阅读源码或官方文档
支持一下
原创不易,买杯咖啡,谢谢:p