NotePublic/Software/System/NATS/NATS_详解.md

193 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# NATS 详解
TODO:
<https://docs.nats.io/nats-concepts/intro>
<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
sudo apt install ./nats-server-v2.3.0-amd64.deb
```
安装客户端支持库:
```bash
# Golang
go get github.com/nats-io/nats.go/
```
启动 NATS 服务:
```bash
# 基本用法
nats-server
# 绑定监听地址,指定监听端口
nats-server [-a <addr>] [-p <port>] [--user <user>] [--pass <password>]
# 显示调试信息
nats-server -V
nats-server -VV
# 指定 http/https 监控端口,配合 Web 浏览器或 nats-top 工具使用
nats-server -m <port>
nats-server -ms <port>
```
## 3.Golang Client API
### 3.1.同步订阅
### 3.2.异步订阅
### 3.3.取消订阅
### 3.4.在 N 个消息后取消订阅
### 3.5.回复消息
### 3.6.通配符订阅
可用 “\*” 和 “\>” 作为通配符,其中 “\>” 用作宽容匹配,而 “\*” 用作严格的匹配。如:
* foo.\* 匹配 foo.bar、foo.baz但是不匹配 foo.bar.baz
* foo.\> 匹配 foo.bar、foo.baz、foo.bar.baz、foo.bar.1
### 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
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 [--user=<user>] [--password=<password>] context add <name> --server <nats://network addr:port> --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
```
### 4.3.nk
### 4.4.nsc
### 4.5.nats-account-server
### 4.6.nats-top
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
```
### 4.7.nats-bench
### 4.8.natsboard
说到监控,除了前面提到的 nats-top 之外,还有诸如 natsboard 之类的 UI 可供选择:
![natsboard](./img/NATS_详解/001.png)