You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure上正确部署NATS并解决多应用消息订阅问题?

本地与Azure环境下NATS Docker完整搭建方案

一、本地Docker搭建NATS

1. 基础单实例部署

直接用官方镜像启动,确保端口映射正确:

docker run -d --name nats-local -p 4222:4222 -p 6222:6222 -p 8222:8222 nats:latest
  • 4222:客户端连接端口,供你的应用连接
  • 6222:NATS集群节点通信端口(单实例可忽略,保留方便后续扩展)
  • 8222:监控端口,用于查看NATS运行状态

2. 本地验证步骤

  • 用nc测试连接:
    nc localhost 4222
    
    输入PING后回车,能收到PONG说明连接正常。
  • 用Node.js代码测试消息收发:
    订阅脚本(sub.js):
    const NATS = require('nats');
    const nc = NATS.connect({ servers: 'nats://localhost:4222', debug: true });
    
    nc.subscribe('test.topic', (msg) => {
      console.log('收到消息:', msg);
    });
    
    console.log('已订阅 test.topic');
    
    发布脚本(pub.js):
    const NATS = require('nats');
    const nc = NATS.connect({ servers: 'nats://localhost:4222', debug: true });
    
    nc.publish('test.topic', '本地测试消息');
    console.log('消息已发布');
    
    setTimeout(() => nc.close(), 1000);
    
    分别运行两个脚本,订阅端能收到发布端的消息即为正常。

二、Azure环境完整部署方案

1. 优化Docker镜像(可选,推荐)

官方NATS镜像默认已配置端口,但明确指定监听所有网卡更稳妥,避免仅绑定localhost的问题。Dockerfile如下:

FROM nats:latest
# 明确指定监听所有网卡的端口,确保外部能访问
CMD ["nats-server", "--listen", "0.0.0.0:4222", "--http", "0.0.0.0:8222", "--cluster", "0.0.0.0:6222"]
EXPOSE 4222 6222 8222

2. 上传镜像至Azure容器注册表(ACR)

  • 登录你的ACR:
    az acr login --name <你的ACR名称>
    
  • 标记镜像:
    docker tag nats:latest <你的ACR名称>.azurecr.io/nats:custom
    
  • 推送镜像到ACR:
    docker push <你的ACR名称>.azurecr.io/nats:custom
    

3. 部署Azure容器实例(ACI)

CLI部署方式

运行以下命令,替换占位符为你的资源信息:

az container create \
  --resource-group <你的资源组名称> \
  --name nats-aci \
  --image <你的ACR名称>.azurecr.io/nats:custom \
  --registry-login-server <你的ACR名称>.azurecr.io \
  --registry-username <ACR用户名> \
  --registry-password <ACR密码> \
  --ports 4222 6222 8222 \
  --ip-address Public \
  --dns-name-label <自定义DNS前缀> \
  --cpu 1 \
  --memory 1.5
  • --ip-address Public:分配公网IP,让你的应用能从外部连接
  • --dns-name-label:生成可访问的DNS地址(比如nats-aci.eastus.azurecontainer.io)

Portal部署方式

  1. 进入Azure容器实例创建页面,选择资源组并输入实例名称
  2. 镜像来源选「Azure容器注册表」,选择你的ACR和刚才推送的镜像
  3. 网络配置选「公共IP」,开放4222、6222、8222端口
  4. 配置CPU和内存(至少1核1.5G),完成创建

4. Azure环境验证

  • 获取ACI的公网DNS地址:
    az container show --resource-group <资源组名称> --name nats-aci --query ipAddress.fqdn -o tsv
    
  • 用nc测试连接:
    nc <ACI的DNS地址> 4222
    
    输入PING能收到PONG即为正常。
  • 修改Node.js连接代码中的servers为nats://<ACI的DNS地址>:4222,重复本地的订阅发布测试,确保消息能互通。

三、解决消息无法互传的问题

针对你遇到的多应用连接后消息收不到的情况,逐一排查:

  1. NATS监听配置:确保NATS启动时绑定0.0.0.0:4222,而非仅localhost——用上面优化后的Dockerfile可避免此问题。
  2. ACI端口开放:检查ACI的网络配置,确认4222端口已公开,且IP地址为公共类型。
  3. 应用连接参数:
    • 确认NATS_RL环境变量的值是nats://<ACI公网IP/DNS>:4222,而非localhost或内部IP
    • 检查所有应用订阅的主题名称完全一致(NATS主题大小写敏感)
  4. 客户端版本:更新Node.js的nats库到最新版本,避免兼容性问题:
    npm update nats
    
  5. 网络安全组(NSG)限制:如果ACI部署在自定义虚拟网络中,检查NSG是否允许入站4222端口的流量。

四、额外优化建议

  • VNet内部部署:如果你的应用也在Azure虚拟网络内,可将NATS ACI部署到同一VNet,用内部IP连接,更安全且延迟更低。
  • 监控排查:通过http://<ACI DNS>:8222/varz访问NATS监控页面,查看连接数、订阅数等指标,快速定位问题。
  • 集群部署:如果需要高可用性,可部署NATS集群,用多个ACI或AKS节点,配置6222端口实现集群通信。

内容的提问来源于stack exchange,提问作者BitState

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:29:52