2021-06-28 17:29:14 +08:00
|
|
|
|
# NATS 详解
|
|
|
|
|
|
|
|
|
|
TODO:
|
|
|
|
|
|
2021-06-29 16:52:00 +08:00
|
|
|
|
<https://docs.nats.io/nats-concepts/intro>
|
2021-06-28 17:32:24 +08:00
|
|
|
|
|
2021-06-29 16:52:00 +08:00
|
|
|
|
<https://blog.csdn.net/weixin_43465618/article/details/105173862>
|
|
|
|
|
|
|
|
|
|
<https://www.cnblogs.com/ailumiyana/p/12046578.html>
|
|
|
|
|
|
|
|
|
|
<https://cloud.tencent.com/developer/article/1500309>
|
|
|
|
|
|
|
|
|
|
<https://learnku.com/docs/go-micro/1.x/nats/8245>
|
|
|
|
|
|
|
|
|
|
<https://cloud.tencent.com/developer/article/1506392>
|
|
|
|
|
|
|
|
|
|
## 1.基本概念
|
|
|
|
|
|
|
|
|
|
### 1.1.What is NATS
|
|
|
|
|
|
|
|
|
|
### 1.2.Subject-Based Messaging
|
|
|
|
|
|
|
|
|
|
### 1.3.发布(Publish)-订阅(Subscribe)
|
|
|
|
|
|
|
|
|
|
NATS 实现了一对多发布订阅消息模型。当 publisher 往 subject 上发布一条消息后,此 subject 上所有 subscriber 都能收到 此消息,属于一种广播。
|
|
|
|
|
|
|
|
|
|
### 1.4.请求(Request)-响应(Reply)
|
|
|
|
|
|
|
|
|
|
一般来说,消息系统是以异步的形式工作,也就是说,publisher 往 subject 上发布一条消息后,并不在意 subscriber 的 reply 是什么。如果 publisher 在意 subscriber 的 reply 是什么的话,那么消息系统就应该以同步的形式工作,在具体实现中,是通过两次发布订阅来完成的:当 publisher 发布消息后,它会订阅一个特定的 subject,当 subscriber 处理完消息后,它会把 reply 发布到这个特定的 subject。当然,整个过程对使用者是透明的。
|
|
|
|
|
|
|
|
|
|
### 1.5.Queue Groups
|
|
|
|
|
|
|
|
|
|
如果我们把 subscriber 分组,那么当 publisher 往 subject 上发布一条消息后,同一组里只有一个 subscriber 会收到此消息(每个成员都有相同的机会接收该消息),从而实现了负载均衡。
|
|
|
|
|
|
|
|
|
|
### 1.6.Acknowledgements
|
|
|
|
|
|
|
|
|
|
### 1.7.Sequence Numbers
|
|
|
|
|
|
|
|
|
|
## 2.NATS 的安装和运行
|
|
|
|
|
|
|
|
|
|
安装服务程序:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Ubuntu
|
|
|
|
|
aria2c -c -x16 -s16 https://github.com/nats-io/nats-server/releases/download/v2.3.0/nats-server-v2.3.0-amd64.deb
|
|
|
|
|
apt install ./nats-server-v2.3.0-amd64.deb
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
安装客户端支持库:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Golang
|
|
|
|
|
go get github.com/nats-io/nats.go/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
启动 NATS 服务:
|
|
|
|
|
|
|
|
|
|
```bash
|
2021-07-21 17:03:11 +08:00
|
|
|
|
# 基本用法
|
2021-06-29 16:52:00 +08:00
|
|
|
|
nats-server
|
2021-07-21 17:03:11 +08:00
|
|
|
|
# 绑定监听地址,指定监听端口
|
|
|
|
|
nats-server -a <addr> -p <port>
|
|
|
|
|
# 显示调试信息
|
|
|
|
|
nats-server -V
|
|
|
|
|
nats-server -VV
|
2021-08-05 19:56:02 +08:00
|
|
|
|
# 指定 http/https 监控端口,配合 Web 浏览器或 nats-top 工具使用
|
|
|
|
|
nats-server -m <port>
|
|
|
|
|
nats-server -ms <port>
|
2021-06-29 16:52:00 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3.Golang Client API
|
|
|
|
|
|
|
|
|
|
### 3.1.同步订阅
|
|
|
|
|
|
|
|
|
|
### 3.2.异步订阅
|
|
|
|
|
|
|
|
|
|
### 3.3.取消订阅
|
|
|
|
|
|
|
|
|
|
### 3.4.在 N 个消息后取消订阅
|
|
|
|
|
|
|
|
|
|
### 3.5.回复消息
|
|
|
|
|
|
|
|
|
|
### 3.6.通配符订阅
|
|
|
|
|
|
2021-07-21 17:03:11 +08:00
|
|
|
|
可用 “\*” 和 “\>” 作为通配符,其中 “\>” 用作宽容匹配,而 “\*” 用作严格的匹配。如:
|
|
|
|
|
|
|
|
|
|
* foo.\* 匹配 foo.bar、foo.baz,但是不匹配 foo.bar.baz
|
|
|
|
|
* foo.\> 匹配 foo.bar、foo.baz、foo.bar.baz、foo.bar.1
|
|
|
|
|
|
2021-06-29 16:52:00 +08:00
|
|
|
|
### 3.7.队列订阅
|
|
|
|
|
|
|
|
|
|
如果我们把 subscriber 分组,那么当 publisher 往 subject 上发布一条消息后,同一组里只有一个 subscriber 会收到此消息(每个成员都有相同的机会接收该消息),从而实现了负载均衡:
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
nc, err := nats.Connect("demo.nats.io")
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
defer nc.Close()
|
|
|
|
|
|
|
|
|
|
// Use a WaitGroup to wait for 10 messages to arrive
|
|
|
|
|
wg := sync.WaitGroup{}
|
|
|
|
|
wg.Add(10)
|
|
|
|
|
|
|
|
|
|
// Create a queue subscription on "updates" with queue name "workers"
|
|
|
|
|
if _, err := nc.QueueSubscribe("updates", "workers", func(m *nats.Msg) {
|
|
|
|
|
wg.Done()
|
|
|
|
|
}); err != nil {
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Wait for messages to come in
|
|
|
|
|
wg.Wait()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.8..断开连接前排空(drain)消息
|
|
|
|
|
|
|
|
|
|
### 3.9..结构化数据
|
|
|
|
|
|
|
|
|
|
## 4.NATS Tools
|
|
|
|
|
|
|
|
|
|
### 4.1.Introduction
|
|
|
|
|
|
|
|
|
|
### 4.2.nats
|
|
|
|
|
|
2021-07-21 17:03:11 +08:00
|
|
|
|
nats 工具是以前 nats-sub 和 nats-pub 等工具的集合,可通过该工具订阅和发布消息。通过 [官方 gihub](https://github.com/nats-io/natscli) 下载对应安装包进行安装。
|
|
|
|
|
|
|
|
|
|
#### 4.2.1.创建 Context
|
|
|
|
|
|
|
|
|
|
使用 nats 工具之前需要先创建 Context,一个 Context 可以理解为一个通信上下文,Context 中指定的通信的目标服务器,可以有多个 Context 存在,但同时只有一个 Context 处于激活状态:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 添加 Context
|
|
|
|
|
nats context add <name> --server <localhost:6000> --description <"description">
|
|
|
|
|
# 查看全部已添加的 Context
|
|
|
|
|
nats context ls
|
|
|
|
|
# 激活某 Context
|
|
|
|
|
nats context set <name>
|
|
|
|
|
# 删除某 Context
|
|
|
|
|
nats context rm <name>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 4.2.2.订阅/发布主题
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 订阅主题
|
|
|
|
|
nats sub [<flags>] [<subject>]
|
|
|
|
|
# 如
|
|
|
|
|
nats sub cli.demo
|
|
|
|
|
# 发布主题
|
|
|
|
|
nats pub [<flags>] <subject> [<body>]
|
|
|
|
|
# 如
|
|
|
|
|
nats pub cli.demo "hello world"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 4.2.2.请求/回复主题
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 回复主题(一般用作服务)
|
|
|
|
|
nats reply [<flags>] <subject> [<body>]
|
|
|
|
|
# 如:提供北京天气的服务
|
|
|
|
|
nats reply 'cli.weather.beijing' 'Sunny'
|
|
|
|
|
# 请求主题(客户端)
|
|
|
|
|
nats request [<flags>] <subject> [<body>]
|
|
|
|
|
# 如:客户端获取北京天气信息
|
|
|
|
|
nats request "cli.weather.beijing" 'Weather Service' --raw
|
|
|
|
|
```
|
|
|
|
|
|
2021-06-29 16:52:00 +08:00
|
|
|
|
### 4.3.nk
|
|
|
|
|
|
|
|
|
|
### 4.4.nsc
|
|
|
|
|
|
|
|
|
|
### 4.5.nats-account-server
|
|
|
|
|
|
|
|
|
|
### 4.6.nats-top
|
|
|
|
|
|
2021-08-05 19:56:02 +08:00
|
|
|
|
nats-top is a top-like tool for monitoring nats-server servers.
|
|
|
|
|
|
|
|
|
|
通过 [官方 gihub](https://github.com/nats-io/nats-top) 下载对应安装包进行安装。该工具需要配合 nats-server 使用:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nats-server -m 8888
|
|
|
|
|
nats-top -m 8888
|
|
|
|
|
```
|
|
|
|
|
|
2021-06-29 16:52:00 +08:00
|
|
|
|
### 4.7.nats-bench
|
|
|
|
|
|
|
|
|
|
### 4.8.natsboard
|
|
|
|
|
|
|
|
|
|
说到监控,除了前面提到的 nats-top 之外,还有诸如 natsboard 之类的 UI 可供选择:
|
|
|
|
|
|
|
|
|
|
![natsboard](./img/NATS_详解/001.png)
|