一、Nats简介
官网:https://nats.io/
官网下载:https://nats.io/download/
github:https://github.com/nats-io/nats-server/releases
dockerhub:https://hub.docker.com/_/nats
NATS是一个开源、轻量级、高性能的分布式消息中间件,使用Golang语言开发,实现了高可伸缩性和优雅的Publish/Subscribe模型,但他不保证消息的到达,持久性等特性,nats streaming即为解决这一问题.
NATS的开发哲学认为高质量的QoS应该在客户端构建,故只建立了Request-Reply,不提供 1.持久化 2.事务处理 3.增强的交付模式 4.企业级队列。
NATS消息传递模型
NATS支持各种消息传递模型,包括:
发布订阅(Publish Subscribe)
请求回复(Request Reply)
队列订阅(Queue Subscribers )
提供的功能:
纯粹的发布订阅模型(Pure pub-sub)
服务器集群(Cluster mode server)
自动精简订阅者(Auto-pruning of subscribers)
基于文本协议(Text-based protocol)
多服务质量保证(Multiple qualities of service - QoS)
发布订阅(Publish Subscribe)
nats三种工作模式:
pub/sub (1对多)
request/reply(1对多 设置超时,只要有一个回复就结束)
queue(1对1)
优点:
1.使用简单,配置简单。
2.速度极快,性能良好。
3.多语言支持,不依赖于网络位置,client端只需知道nats的节点和约定好的subject名称即可。
缺点:
1.对服务器稳定性要求较高,机房出现故障,导致nats server端需要重连。可能需要重启nats-server。
2.在消息timeout后,需要在reconnection里要重新初始化连接,不方便。
二、安装
2.1 docker方式安装
docker pull nats
# 启动:
docker run -d -p 4222:4222 -p 6222:6222 -p 8222:8222 --name nats-main nats:latest
2.2 nats 下载安装
cd /usr/local/
tar -xzvf nats-server-v2.9.15-linux-amd64.tar.gz
mv nats-server-v2.9.15-linux-amd64 nats-server
cd nats-server
[root@testyxqy local]# tree nats-server/
nats-server/
|-- LICENSE
|-- nats-server
`-- README.md
0 directories, 3 files
# Client port of 4222 on all interfaces
port: 4222
# HTTP monitoring port
monitor_port: 8222
# This is for clustering multiple servers together.
cluster {
# It is recommended to set a cluster name
name: "my_cluster"
# Route connections to be received on any interface on port 6222
port: 6222
# Routes are protected, so need to use them with --routes flag
# e.g. --routes=nats-route://ruser:T0pS3cr3t@otherdockerhost:6222
authorization {
user: ruser
password: T0pS3cr3t
timeout: 2
}
# Routes are actively solicited and connected to from this server.
# This Docker image has none by default, but you can pass a
# flag to the nats-server docker image to create one to an existing server.
routes = []
}
服务器选项: -a, --addr <host> 绑定主机IP地址(默认是0.0.0.0) -p, --port <port> 客户端连接NATS服务器使用的端口(默认是4222) -n, --name <server_name> 服务器名字(默认:自动) -P, --pid <file> 存储PID的文件 -m, --http_port <port> HTTP监听端口 -ms,--https_port <port> HTTPS监听端口 -c, --config <file> 指定配置文件 -t 测试配置文并退出 -sl,--signal <signal>[=<pid>] 向 nats-server 进程发送信号(停止、退出、重新打开、重新加载) <pid> 可以是 PID(例如 1)或 PID 文件的路径(例如 /var/run/nats-server.pid) --client_advertise <string> 向其他服务器广播的客户端 URL 日志选项: -l, --log <file> 指定日志输出的文件 -T, --logtime 是否开启日志的时间戳(默认为true) -s, --syslog 启用syslog作为日志方法 -r, --remote_syslog <addr> 远程日志服务器的地址(默认为udp://localhost:514) -D, --debug 开启调试输出 -V, --trace 跟踪原始的协议 -VV 详细跟踪(也跟踪系统帐户) -DV 调试并跟踪 -DVV 调试和详细跟踪(也跟踪系统帐户) JetStream 选项: -js, --jetstream 启用 JetStream 功能。 -sd, --store_dir <dir> 设置存储目录。 授权认证选项: --user <user> 连接需要的用户名 --pass <password> 连接需要的密码 --auth <token> 连接所需的授权令牌 TLS 安全选项: --tls 启用TLS,不验证客户端(默认为false) --tlscert <file> 服务器证书文件 --tlskey <file> 服务器证书私钥 --tlsverify 启用TLS,每一个客户端都要认证 --tlscacert <file> 客户端证书CA用于认证 集群选项: --routes <rurl-1, rurl-2> 请求和连接的路由 --cluster <cluster-url> 请求路由的集群 URL --cluster_name <string> Cluster Name,如果不设置会动态生成一个 --no_advertise <bool> 不向客户端通告已知的集群信息 --cluster_advertise <string> 向其他服务器通告的集群 URL --connect_retries <number> 连接重试次数 常规选项: -h, --help 显示帮助消息 -v, --version 显示版本信息 --help_tls 显示TLS 帮助消息
2.3 使用配置文件启动
[root@testyxqy nats-server]# ./nats-server -c nats.yml
[16228] 2023/04/18 16:46:24.250449 [INF] Starting nats-server
[16228] 2023/04/18 16:46:24.250503 [INF] Version: 2.9.15
[16228] 2023/04/18 16:46:24.250508 [INF] Git: [b91fa85]
[16228] 2023/04/18 16:46:24.250512 [INF] Cluster: my_cluster
[16228] 2023/04/18 16:46:24.250516 [INF] Name: NAJWLAJQZ6PLSDAYCLUYF4JOU6BVERLWFBP42CZFHYEDN4WXP7RRSODT
[16228] 2023/04/18 16:46:24.250520 [INF] ID: NAJWLAJQZ6PLSDAYCLUYF4JOU6BVERLWFBP42CZFHYEDN4WXP7RRSODT
[16228] 2023/04/18 16:46:24.250537 [INF] Using configuration file: nats.yml
[16228] 2023/04/18 16:46:24.251156 [INF] Starting http monitor on 0.0.0.0:8222
[16228] 2023/04/18 16:46:24.251264 [INF] Listening for client connections on 0.0.0.0:4222
[16228] 2023/04/18 16:46:24.251478 [INF] Server is ready
[16228] 2023/04/18 16:46:24.251525 [INF] Cluster name is my_cluster
[16228] 2023/04/18 16:46:24.251558 [INF] Listening for route connections on 0.0.0.0:6222
[root@testyxqy ~]# netstat -ntlp | grep nats
tcp6 0 0 :::4222 :::* LISTEN 16228/./nats-server
tcp6 0 0 :::8222 :::* LISTEN 16228/./nats-server
tcp6 0 0 :::6222 :::* LISTEN 16228/./nats-server
三、发布/订阅模式的验证
使用两个客户端进行验证。在远程Windows主机上开两个CMD命令行环境,均使用命令“C:> telnet xxx.xxx.xxx.xxx 4222”连上nats-server。为了以示区别,这里命名为客户端A和客户端B,A表示发布者,B表示订阅者。
telnet 连接显示 4222
INFO {"server_id":"NAJWLAJQZ6PLSDAYCLUYF4JOU6BVERLWFBP42CZFHYEDN4WXP7RRSODT","server_name":"NAJWLAJQZ6PLSDAYCLUYF4JOU6BVERLWFBP42CZFHYEDN4WXP7RRSODT","version":"2.9.15","proto":1,"git_commit":"b91fa85","go":"go1.19.6","host":"0.0.0.0","port":4222,"headers":true,"max_payload":1048576,"client_id":4,"client_ip":"本机外网IP","cluster":"my_cluster"}
# 1)订阅者B运行
订阅者B使用通配符foot.*注册主题ID为90的主题,订阅成功,nats-server返回+OK消息
sub foo.* 90
+OK
# 2)发布者A运行
发布者A发布一条消息到主题foo.bar,消息有效负载的长度为5,按下回车。消息发布成功,nats-server返回+OK消息。
pub foo.bar 5
hello
+OK
# 订阅者B显示:可以看到获得的消息
PING
MSG foo.bar 90 5
hello
# 3)发布者A继续执行
发布者A继续执行以下命令,消息发布成功,nats-server服务器返回+OK消息
pub foo.bar optional.reply.subject 5
hello
+OK
# 订阅者B显示:PING是维持连接的消息
PING
MSG foo.bar 90 optional.reply.subject 5
hello
# 引用:
https://blog.csdn.net/weixin_39616603/article/details/99624251