NATS安装与配置完全指南

NATS 概述

NATS 是一款简单、安全且高性能的通信系统,适用于数字系统、服务和设备。作为云原生计算基金会(CNCF)成员,拥有超过40种客户端语言实现,可在多种环境中部署。

核心优势

  • 高性能通信: NATS 提供低延迟、高吞吐量的消息传递,满足游戏服务器间实时通信需求
  • 简单易用: 基于发布/订阅模式,简化跨服消息处理逻辑
  • 多语言支持: 支持包括 Java 在内的40多种客户端语言,适应不同游戏服务端技术栈
  • 云原生部署: 可在本地、云端或容器化环境中部署,适合游戏服务器集群架构

跨服通信场景

  • 玩家跨服传输: 实现玩家在不同游戏服务器间的无缝切换
  • 全局消息广播: 向所有服务器实例发送重要通知或事件
  • 跨服战斗协调: 协调不同服务器玩家参与的跨服战场或活动
  • 数据同步: 在多个游戏服务器间同步排行榜、公会信息等全局数据

部署架构

NATS 服务器可作为游戏服务器集群的中枢通信枢纽,各游戏服务器实例作为客户端连接到 NATS 集群,通过主题(subject)机制实现精准的消息路由和跨服通信管理。

组件信息

nats-server

natscli

NATS Exporter

服务器配置示例

/usr/local/nats-server-v2.10.22/nats-server -c /etc/nats.conf

shell 复制代码
# NATS标准客户端端口
port: 4222
# NATS标准监控端口
http_port: 8222

log_file: "/data/nats/nats.log"
# 启用JetStream持久化存储
jetstream {
  enabled: true
  store_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 文件:

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

系统管理命令

bash 复制代码
# 重新加载 systemd 配置
systemctl daemon-reload
# 设置开机自启
systemctl enable nats
# 启动服务
systemctl start nats
#停止服务
systemctl stop nats
#重启服务
systemctl restart nats
# 检查服务状态
systemctl status nats

查看服务器配置信息

bash 复制代码
# 权限不足的情况
./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 NDW2JFYMXLJVZMDHCLTOCOZBGS4RIDZZRXSW4ZBZZFC2CMZ6MKTYPDQT

Process Details:

                          Version: 2.12.1
                       Git Commit: fab5f99
                       Go Version: go1.25.3
                       Start Time: 2025-11-05 16:40:00
          Configuration Load Time: 2025-11-05 16:40:00
             Configuration Digest: sha256:d8b5386644fb8ef3d103d18b1d0e155e665da1708cbab2ec7faeb052015614d4
                           Uptime: 1m25s

HTTP监控端口使用

  • 功能: 提供RESTful API用于服务器监控和管理
  • HTTP监控端口:启用NATS服务器的HTTP监控接口
  • 管理API访问:提供RESTful API用于服务器监控和管理
  • 监控信息展示:可通过浏览器或工具访问服务器状态
bash 复制代码
# 通过浏览器访问监控页面
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 格式(文本格式)
  1. 对接方式
    方式一:使用 NATS Exporter

Metrics 端点

bash 复制代码
./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配置:

yaml 复制代码
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)

举个例子:

bash 复制代码
[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心跳

示例说明

bash 复制代码
# 客户端发送订阅请求到服务器
<<- [SUB topic1 1]
# 服务器向客户端推送消息  
->> [MSG topic1 1 payload]
# 客户端发布消息到服务器
<<- [PUB topic1 10]
# 服务器确认收到消息
->> [OK]

NATS 通信过程解析

基于选中的日志代码段,这是一个完整的请求-响应通信过程:

1. 订阅阶段

log 复制代码
[SUB topic1 1]
[SUB _INBOX.bduOd3msf5mrxkpTH1rv0a.* 2]
  • 客户端首先订阅了两个主题:
    • topic1:用于接收请求消息(sid=1)
    • _INBOX.bduOd3msf5mrxkpTH1rv0a.*:用于接收响应消息(sid=2)

2. 发布请求消息

log 复制代码
[PUB topic1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
MSG_PAYLOAD: ["[foo-0]"]
  • 客户端向 topic1 主题发布一条消息
  • 指定了回复地址:_INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP
  • 消息内容为 "[foo-0]"(7字节)

3. 服务端转发请求

log 复制代码
[MSG topic1 1 _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 7]
  • NATS 服务器将请求消息转发给订阅了 topic1 的客户端
  • 包含订阅ID(1)、回复地址和消息长度(7字节)

4. 发布响应消息

log 复制代码
[PUB _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 14]
MSG_PAYLOAD: ["ans to [foo-0]"]
  • 请求处理方通过指定的回复地址发布响应
  • 消息内容为 "ans to [foo-0]"(14字节)

5. 服务端转发响应

log 复制代码
[MSG _INBOX.bduOd3msf5mrxkpTH1rv0a.bduOd3msf5mrxkpTH1rvAP 2 14]
  • NATS 服务器将响应消息转发给订阅了该 _INBOX 主题的客户端
  • 包含订阅ID(2)和消息长度(14字节)

这是一个典型的 NATS 请求-响应模式,利用了 _INBOX 临时主题实现异步响应机制。

相关推荐
weixin_404551249 个月前
nsc account 及user管理
user·sign·operator·sys·nats·account
xidianjiapei0011 年前
Kafka和NATS等消息队列系统如何保证精确一次Exactly-Once语义
分布式·kafka·消息队列·精确一次·nats·exactly-once