高性能消息中间件-Nats使用

发布时间 2023-04-18 17:08:10作者: 杨梅冲

一、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 = []
}
nats默认配置文件
服务器选项:
    -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