NATS安装与配置完全指南
NATS 概述
NATS 是一款简单、安全且高性能的通信系统,适用于数字系统、服务和设备。作为云原生计算基金会(CNCF)成员,拥有超过40种客户端语言实现,可在多种环境中部署。
核心优势
- 高性能通信: NATS 提供低延迟、高吞吐量的消息传递,满足游戏服务器间实时通信需求
- 简单易用: 基于发布/订阅模式,简化跨服消息处理逻辑
- 多语言支持: 支持包括 Java 在内的40多种客户端语言,适应不同游戏服务端技术栈
- 云原生部署: 可在本地、云端或容器化环境中部署,适合游戏服务器集群架构
跨服通信场景
- 玩家跨服传输: 实现玩家在不同游戏服务器间的无缝切换
- 全局消息广播: 向所有服务器实例发送重要通知或事件
- 跨服战斗协调: 协调不同服务器玩家参与的跨服战场或活动
- 数据同步: 在多个游戏服务器间同步排行榜、公会信息等全局数据
部署架构
NATS 服务器可作为游戏服务器集群的中枢通信枢纽,各游戏服务器实例作为客户端连接到 NATS 集群,通过主题(subject)机制实现精准的消息路由和跨服通信管理。
组件信息
nats-server
- 项目仓库: https://github.com/nats-io/nats-server
- 当前版本: 2.12.1
- 下载链接: nats-server-v2.12.1-linux-amd64.tar.gz
natscli
- 项目仓库: https://github.com/nats-io/natscli
- 当前版本: 0.3.0
- 下载链接: nats-0.3.0-linux-amd64.zip
NATS Exporter
- 项目仓库: https://github.com/nats-io/prometheus-nats-exporter
- 当前版本: 0.17.3
- 下载链接: prometheus-nats-exporter-v0.17.3-linux-x86_64.tar.gz
服务器配置示例
/usr/local/nats-server-v2.10.22/nats-server -c /etc/nats.conf
# NATS标准客户端端口
port: 4222
# NATS标准监控端口
http_port: 8222log_file: "/data/nats/nats.log"
# 启用JetStream持久化存储
jetstream {enabled: truestore_dir: "/data/nats"
}# 配置后,使用 root 用户就可以执行系统管理命令
accounts {SYS {users = [{user: root, password: pass}]}}
system_account: SYS
# 开发环境可以设置为 true ,生产环境保持false
debug: true
trace: true
# NATS服务器允许的最大并发连接数
max_connections: 65536
# 控制协议线的最大字节数限制
max_control_line: 4096
# 单条消息体的最大字节数限制,限制每条NATS消息的大小 默认值: 1MB (1048576 bytes)
max_payload: 1048576
# 写操作超时时间
write_deadline: "2s"
systemd 服务配置
创建 /etc/systemd/system/nats.service 文件:
[Unit]
Description=NATS Server
After=network.target[Service]
Type=simple
ExecStart=/usr/local/nats-server-v2.12.1/nats-server -c /data/nats/nats.conf
Restart=always
RestartSec=10[Install]
WantedBy=multi-user.target
系统管理命令
# 重新加载 systemd 配置
systemctl daemon-reload
# 设置开机自启
systemctl enable nats
# 启动服务
systemctl start nats
#停止服务
systemctl stop nats
#重启服务
systemctl restart nats
# 检查服务状态
systemctl status nats
查看服务器配置信息
# 权限不足的情况
./nats server info --server nats://10.0.4.8:4222
返回:
nats: error: no results received, ensure the account used has system privileges and appropriate permissions
# 正确的带认证连接
./nats server info --server nats://root:pass@10.0.4.8:4222
返回版本号等
Server information for NDW2JFYMXLJVZMDHCLTOCOZBGS4RIDZZRXSW4ZBZZFC2CMZ6MKTYPDQTProcess Details:Version: 2.12.1Git Commit: fab5f99Go Version: go1.25.3Start Time: 2025-11-05 16:40:00Configuration Load Time: 2025-11-05 16:40:00Configuration Digest: sha256:d8b5386644fb8ef3d103d18b1d0e155e665da1708cbab2ec7faeb052015614d4Uptime: 1m25s
HTTP监控端口使用
- 功能: 提供RESTful API用于服务器监控和管理
- HTTP监控端口:启用NATS服务器的HTTP监控接口
- 管理API访问:提供RESTful API用于服务器监控和管理
- 监控信息展示:可通过浏览器或工具访问服务器状态
# 通过浏览器访问监控页面
http://localhost:8222# 访问服务器状态信息
http://localhost:8222/varz# 访问连接信息
http://localhost:8222/connz# 访问路由信息
http://localhost:8222/routez
-
主要端点:
/varz- 服务器变量和统计信息/connz- 客户端连接信息/routez- 集群路由信息/subz- 订阅信息统计/healthz- 健康检查端点
-
安全注意事项:
-
公网访问:确保该端口不对外网开放
-
防火墙配置:仅允许可信IP访问
-
监控用途:主要用于内部监控和管理
通过这个配置,你可以实时监控NATS服务器的运行状态和性能指标。
NATS HTTP 监控与 Prometheus 对接
原生支持情况
- 不直接支持:NATS 的 http_port 默认提供的是 JSON 格式的监控数据
- 格式差异:Prometheus 需要特定的 metrics 格式(文本格式)
- 对接方式
方式一:使用 NATS Exporter
Metrics 端点
./prometheus-nats-exporter -varz -connz -routez -subz -healthz http://localhost:8222
可监控的主要指标
- 服务器性能:CPU、内存、连接数
- 消息流量:发布/订阅消息速率
- 连接状态:客户端连接数、断开情况
- 系统资源:文件描述符、goroutine 数量
访问指标
Metrics 端点:http://[IP]:7777/metrics
健康检查:http://[IP]:7777/healthz
配置 Prometheus 抓取
在 prometheus.yml 中添加配置:
Prometheus配置:
scrape_configs:job_name: 'nats-exporter'static_configs:targets: ['localhost:7777']
使用官方的 Prometheus NATS Exporter 是最简单和标准的对接方式,它会自动将 NATS 的监控数据转换为 Prometheus 可识别的格式。
NATS数据存储
Core NATS: 无持久化存储,默认为内存型消息系统
无持久化存储:默认情况下,Core NATS 是内存型消息系统,不会将数据持久化到磁盘
重启后数据丢失:服务器重启后所有消息和状态都会丢失
JetStream: 启用后提供持久化存储
- 存储路径:
/data/nats/jetstream - 存储文件类型
消息数据文件:存储持久化的消息内容
元数据文件:存储流(stream)和消费者(consumer)的配置信息
索引文件:用于快速检索消息
JetStream 提供了灵活的消息持久化机制,开发者可以精确控制哪些消息需要存储。
协议指令
客户端发送指令:
1.CONNECT - 客户端连接指令
- 用于建立与 NATS 服务器的连接
- 包含客户端信息如语言、版本等
2.PING - 心跳检测指令
- 客户端发送心跳包检测连接状态
3.SUB - 订阅指令
- 客户端订阅特定主题(subject)
- 格式:SUB [queue_group]
4.PUB - 发布指令
- 客户端向特定主题发布消息
- 格式:PUB [reply-to] <#bytes>
服务器响应的指令
1.PONG - 心跳响应指令
- 服务器对 PING 指令的响应
2.MSG - 消息推送指令
- 服务器向订阅者推送消息
- 格式:MSG [reply-to] <#bytes>
协议流程
从日志可以看出典型的 NATS 通信流程:
1.客户端建立连接(CONNECT)
2.发送心跳检测(PING/PONG)
3.订阅主题(SUB)
4.发布消息(PUB)
5.接收消息(MSG)
举个例子:
[5968] 2025/11/05 10:11:33.420225 [TRC] 10.10.21.71:60838 - cid:46 - <<- [SUB topic1 1]
[5968] 2025/11/05 10:11:33.425047 [TRC] 10.10.21.71:60838 - cid:46 - <<- [SUB _INBOX.bduOd3msf5mrxkpTH1rv0a.* 2]
[5968] 2025/11/05 10:11:33.425822 [TRC] 10.10.21.71:60838 - cid:46 - <<- [PUB topic1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
[5968] 2025/11/05 10:11:33.425835 [TRC] 10.10.21.71:60838 - cid:46 - <<- MSG_PAYLOAD: ["[foo-0]"]
[5968] 2025/11/05 10:11:33.425854 [TRC] 10.10.21.71:60838 - cid:46 - ->> [MSG topic1 1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
[5968] 2025/11/05 10:11:33.433271 [TRC] 10.10.21.71:60838 - cid:46 - <<- [PUB _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 14]
[5968] 2025/11/05 10:11:33.433290 [TRC] 10.10.21.71:60838 - cid:46 - <<- MSG_PAYLOAD: ["ans to [foo-0]"]
[5968] 2025/11/05 10:11:33.433303 [TRC] 10.10.21.71:60838 - cid:46 - ->> [MSG _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 2 14]
其中,在NATS日志中,->> 和 <<- 表示消息传输方向:
->> (右箭头)
-
含义:服务器向客户端发送消息
-
方向:NATS Server → Client
-
典型场景:
-
服务器响应客户端请求
-
服务器推送订阅消息给客户端
-
服务器发送PING/PONG等控制消息
<<- (左箭头) -
含义:客户端向服务器发送消息
-
方向:Client → NATS Server
-
典型场景:
-
客户端发布消息到主题
-
客户端发送订阅请求
-
客户端发送PING/PONG心跳
示例说明
# 客户端发送订阅请求到服务器
<<- [SUB topic1 1]
# 服务器向客户端推送消息
->> [MSG topic1 1 payload]
# 客户端发布消息到服务器
<<- [PUB topic1 10]
# 服务器确认收到消息
->> [OK]
NATS 通信过程解析
基于选中的日志代码段,这是一个完整的请求-响应通信过程:
1. 订阅阶段
[SUB topic1 1]
[SUB _INBOX.bduOd3msf5mrxkpTH1rv0a.* 2]
- 客户端首先订阅了两个主题:
topic1:用于接收请求消息(sid=1)_INBOX.bduOd3msf5mrxkpTH1rv0a.*:用于接收响应消息(sid=2)
2. 发布请求消息
[PUB topic1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
MSG_PAYLOAD: ["[foo-0]"]
- 客户端向
topic1主题发布一条消息 - 指定了回复地址:
_INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP - 消息内容为
"[foo-0]"(7字节)
3. 服务端转发请求
[MSG topic1 1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
- NATS 服务器将请求消息转发给订阅了
topic1的客户端 - 包含订阅ID(1)、回复地址和消息长度(7字节)
4. 发布响应消息
[PUB _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 14]
MSG_PAYLOAD: ["ans to [foo-0]"]
- 请求处理方通过指定的回复地址发布响应
- 消息内容为
"ans to [foo-0]"(14字节)
5. 服务端转发响应
[MSG _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 2 14]
- NATS 服务器将响应消息转发给订阅了该
_INBOX主题的客户端 - 包含订阅ID(2)和消息长度(14字节)
这是一个典型的 NATS 请求-响应模式,利用了 _INBOX 临时主题实现异步响应机制。
