如何在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 4222PING后回车,能收到PONG说明连接正常。 - 用Node.js代码测试消息收发:
订阅脚本(sub.js):
发布脚本(pub.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');
分别运行两个脚本,订阅端能收到发布端的消息即为正常。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部署方式
- 进入Azure容器实例创建页面,选择资源组并输入实例名称
- 镜像来源选「Azure容器注册表」,选择你的ACR和刚才推送的镜像
- 网络配置选「公共IP」,开放4222、6222、8222端口
- 配置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地址> 4222PING能收到PONG即为正常。 - 修改Node.js连接代码中的
servers为nats://<ACI的DNS地址>:4222,重复本地的订阅发布测试,确保消息能互通。
三、解决消息无法互传的问题
针对你遇到的多应用连接后消息收不到的情况,逐一排查:
- NATS监听配置:确保NATS启动时绑定
0.0.0.0:4222,而非仅localhost——用上面优化后的Dockerfile可避免此问题。 - ACI端口开放:检查ACI的网络配置,确认4222端口已公开,且IP地址为公共类型。
- 应用连接参数:
- 确认
NATS_RL环境变量的值是nats://<ACI公网IP/DNS>:4222,而非localhost或内部IP - 检查所有应用订阅的主题名称完全一致(NATS主题大小写敏感)
- 确认
- 客户端版本:更新Node.js的nats库到最新版本,避免兼容性问题:
npm update nats - 网络安全组(NSG)限制:如果ACI部署在自定义虚拟网络中,检查NSG是否允许入站4222端口的流量。
四、额外优化建议
- VNet内部部署:如果你的应用也在Azure虚拟网络内,可将NATS ACI部署到同一VNet,用内部IP连接,更安全且延迟更低。
- 监控排查:通过
http://<ACI DNS>:8222/varz访问NATS监控页面,查看连接数、订阅数等指标,快速定位问题。 - 集群部署:如果需要高可用性,可部署NATS集群,用多个ACI或AKS节点,配置6222端口实现集群通信。
内容的提问来源于stack exchange,提问作者BitState
相关产品推荐
相关产品推荐

