当前位置: 首页 > news >正文

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 格式(文本格式)
  1. 对接方式
    方式一:使用 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 临时主题实现异步响应机制。

http://www.dtcms.com/a/573427.html

相关文章:

  • 开发网站如何选需要注意什么汉川网页设计
  • seo根据什么具体优化想做个卷帘门百度优化网站
  • Rust 练习册 7:高阶生命周期与高阶 trait 限定
  • Linux服务器通过密钥登录服务器
  • 网站开发2008家纺外发加工订单网
  • 广州地铁站路线图广告设计师证怎么考
  • 【拾遗补漏】.NET 常见术语集
  • 从零开发一个简单的Web爬虫(使用Requests和BeautifulSoup)
  • 荷城网站设计做网站找哪家最好
  • Hadoop 分布式计算MapReduce和资源管理Yarn
  • DOM XMLHttpRequest
  • day08(11.5)——leetcode面试经典150
  • XML CDATA 区块详解
  • 网站专题页优化网站推广南京公司
  • 记录GDI+保存位图
  • 市值分析:半导体龙头的估值边界在哪里?——以NVIDIA为案例的概率化拆解
  • 内蒙古创意网站开发微网站建设服务商
  • 网站做全景图极速网站建设定制
  • wordpress新增站点盐城整站优化
  • 网络安全常见的框架漏洞
  • 停车场管理系统基础知识与原理
  • 安卓进阶——跨进程通信
  • 连接模拟器网页进行h5的调试(使用Chrome远程调试(推荐)) 保姆级图文
  • 自己做的网站怎么添加文档成都装修公司哪家口碑最好
  • 视频网站代言人建筑施工企业专职安全生产管理员
  • 保姆级教程 | 麒麟系统安装Edge浏览器
  • HAL库uint8_t,uint16_t,uint32_t类型报错error: #20: identifier “uint32_t“ is undefined
  • Java LinkedList集合全面解析:双向链表的艺术与实战
  • 【MySQL】--- 事务4种特性、隔离级别、MVCC
  • 上信考:【数据科学技术及应用】考试大纲题型示例、例题解析、模拟卷答案