Nacos使用域名做为服务地址遇到的问题及解决方案

本文详细介绍了使用Nacos作为服务发现组件时遇到的问题及其解决方案,特别是当使用域名代替IP地址时出现的连接问题。文章深入探讨了Nginx配置错误导致的TCP连接失败案例,并给出了正确的TCP端口转发配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、发现问题

应用启动时,增加Nacos服务端的配置信息。

应用使用IP加端口连接Nacos服务器时,运行一切正常:

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

但是将server-addr换成解析好的域名就有问题:

#Nacos默认的服务端端口为8848,因而Nacos服务端的端口必须配置,
#否则建立TCP连接的时候会使用9848及9849这两个端口
#可以通过下面指定port的参数配置,也可以在server-addr的域名中增加上端口进行指定。

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=nacos-dev.xxx.com
-Dnacos.server.port=80 

#或者

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=nacos-dev.xxx.com:80 

Nacos TCP端口的处理代码:

(代码中应该可以增加一个没有端口配置时,默认为80端口的逻辑,后续我来提个PR)。 

确认Nginx中域名解析配置是正确的,因为可以通过域名正常访问控制台,但是应用启动的时候报“Client not connected,current status:STARTING”错误:

该错误表示Nacos应用客户端与Nacos服务端没有建立TCP连接(一次都没有),是客户端报出来的错误,该请求还没有发送到服务端。错误原因为Nginx中没有开启对9848及9849的TCP代理,于是在Nginx中开启TCP代理。

二、错误配置TCP端口的转发

刚开始使用了错误的操作方式,即在Nginx的http反射代理服务中以http2的方式对开启TCP端口,如下所示:

upstream nacos-server{
        server 192.168.12.50:8848 weight=1;
}

upstream nacos-server-grpc-9848{
        server 192.168.12.50:9848 weight=1;
}

upstream nacos-server-grpc-9849{
        server 192.168.12.50:9849 weight=1;
}

# http代理
server {
        listen       80;
        server_name  nacos-dev.xxx.com;
        access_log /data/nginxlog/access-nacos.imlaidian.com.log main;
        error_log /data/nginxlog/error-nacos.imlaidian.com.log;


        location / {

                #反向代理的地址
                proxy_pass  http://nacos-server;
                proxy_set_header Host $host;
                proxy_set_header X-Real-Ip $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
        }

}
# grpc 代理配置 9848
server {
    #80端口加1000
    listen 1080 http2; # grpc方式对外暴露端口
    location / {
        grpc_pass grpc://nacos-server-grpc-9848; # 此处配置grpc服务的ip和端口
    }
}

# grpc 代理配置 9849
server {
    #80端口加1001
    listen 1081 http2; # grpc方式对外暴露端口
    location / {
        grpc_pass grpc://nacos-server-grpc-9849; # 此处配置grpc服务的ip和端口
    }
}

这种方式暴露端口,应用在启动时客户端与服务端会成功建立一次或多次连接,但是在超时以后会被Nginx自动断开,应用启动时此时就会报如下错误:

这个错误是服务端报回来的错误,调试客户端RpcClient.request(Request, long)代码:

获取到服务端响应内容为如下:

metadata {
  type: "ErrorResponse"
}
body {
  value: "{\"resultCode\":500,\"errorCode\":301,\"message\":\"Connection is unregistered.\",\"success\":false}"
}

查看服务端的代码GrpcRequestAcceptor.request(Payload, StreamObserver<Payload>),其中返回错误内容“Connection is unregistered.”的代码块如下:

 出现这个错误是原因是因为客户端往服务端发起请求时,服务端根据客户端传上来的connectionId在connectionManager中找不到对应的客户端连接,就报了这个错误(因为建立的连接被Nginx断开了,连接在服务端已经被删除,自然就找不到了)。

三、正确配置TCP端口转发

Nginx对TCP的代理支持,是从v1.9开始的,支持的模块为stream,在编译nginx的时候需要增加stream模块相关的参数,因为默认编译是不包括stream模块:

#编译时增加以下参数
--with-stream

编译并安装好后,在nginx的配置目录/etc/nginx中增加tcp.d目录,并在nginx.conf中增加tcp.d目录中stream配置的加载:

stream {

    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    access_log /var/log/nginx/access-stream.log proxy;
    error_log /var/log/nginx/error-stream.log;

    open_log_file_cache off;

    # tcp层转发的配置文件夹
    include /etc/nginx/tcp.d/*.conf;

然后在tcp.d中新建包括Nacos TCP转发的配置,如nacos.conf:

upstream erp-nacos-grpc{
        hash $remote_addr consistent;
        server 192.168.12.50:9848 weight=1;
}
upstream erp-nacos-grpc9{
        hash $remote_addr consistent;
        server 192.168.12.50:9849 weight=1;
}
# grpc 代理配置
server {
    listen 1080; # grpc方式对外暴露端口
    proxy_connect_timeout 10s;
    proxy_timeout 10s;
    proxy_pass erp-nacos-grpc;
}

# grpc 代理配置
server {
    listen 1081; # grpc方式对外暴露端口
    proxy_connect_timeout 10s;
    proxy_timeout 10s;
    proxy_pass erp-nacos-grpc9;
}

Nginx中原来关于域名的80端口配置,可以继续用

### Nacos 9848 和 9849 端口的作用 对于 Nacos 版本 2.0.0 及以上,端口 9848 和 9849 是必需开放的端口。这些端口主要用于支持新功能和服务发现机制[^1]。 ### 常见的 9849 端口启动失败原因 当遇到 Nacos 的 9849 端口无法启动的情况时,可能的原因包括但不限于: - **端口冲突**:如果其他应用程序占用了该端口,则可能导致 Nacos 启动失败。 - **权限不足**:某些操作系统上特定范围内的高特权端口号(通常小于 1024),需要管理员权限才能绑定;虽然 9849 不属于此类情况,但在 Windows 上仍可能存在权限问题[^3]。 - **配置文件错误**:不正确的 `application.properties` 或者 `application.yml` 文件设置也可能引发此问题。 - **依赖组件缺失或损坏**:比如嵌入式的 Tomcat 容器未能成功初始化,这可能是由于缺少必要的库或其他内部错误引起。 ### 解决方案建议 针对上述提到的各种可能性,可以采取以下措施来解决问题: #### 检查端口占用状况 通过命令行工具确认是否有其他进程正在使用 9849 端口,并终止它们或者更改 Nacos 配置以使用不同的端口。 ```bash netstat -an | findstr :9849 # Windows 下查找指定端口是否被占用 lsof -i :9849 # Linux/MacOS 查找指定端口是否被占用 ``` #### 使用管理员权限运行 确保是以具有足够权限的身份执行 Nacos 启动脚本,在 Windows 中可以通过右键点击命令提示符选择“以管理员身份运行”。 #### 调整应用配置 仔细审查 Nacos 的配置文件 (`application.properties` / `application.yml`) ,特别是关于网络通信部分的内容,确保所有参数都已正确设定。 #### 更改启动模式 考虑到集群模式下可能出现的问题,考虑暂时切换到单机模式进行测试。编辑启动脚本来改变启动模式从 cluster 改为 standalone。 ```properties mode=standalone ``` #### 日志分析 查看详细的日志输出可以帮助定位具体是什么地方出了差错。重点留意任何有关于连接建立、资源加载等方面的警告或错误信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值