Docerk + Nginx + Naocs2.0.3搭建的注册中心,服务注册失败,请教

如题,我知道nacos2.x需要开放8848、9848、9849三个端口,问题可能就出在这,我的配置如下,请教一下是哪里有错

# docker 启动 nacos 容器
docker run -d -p 18848:8848 -p 19848:9848 -p 19849:9849
-e MODE=cluster
-e PREFER_HOST_MODE=hostname
-e NACOS_SERVERS="192.168.10.10:18848 192.168.10.10:28848 192.168.10.10:38848"
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=192.168.10.10
-e MYSQL_SERVICE_PORT=13306
-e MYSQL_SERVICE_DB_NAME=nacos_config
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_DATABASE_NUM=1
-v /home/dev/docker/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
-v /home/dev/docker/nacos/logs:/home/nacos/logs
--restart always
--name nacos-dev1
nacos/nacos-server:2.0.3
# nginx 配置
stream {
    upstream nacos-cluster{
        server 192.168.10.10:19848 weight=1; #ip地址和nacos集群的一致,端口号在nacos集群的端口号基础上+1000
        #server 192.168.10.10:29848 weight=2;
        #server 192.168.10.10:39848 weight=3;
    }
    server {
        listen       1080;         #nginx监听端口号+1000
        proxy_pass nacos-cluster;
   }
}

http {
    upstream nacos-cluster {
        server 192.168.10.10:18848 weight=1;
        #server 192.168.10.10:28848 weight=2;
        #server 192.168.10.10:38848 weight=3;
    }

    server {
        listen      80;
        server_name localhost;

        location /nacos {
            proxy_pass http://nacos-cluster;
        }
    }
}
# application.yml配置
server:
  port: 80
spring:
  application:
    name: gateway
  cloud:
    inetutils:
      # 忽略的网卡,对于有虚拟机的机器可以避免报错
      ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'
    nacos:
      discovery:
        server-addr: 192.168.10.10
    gateway:
      discovery:
        locator:
          enabled: true
# 报错如下
2023-04-26 21:45:03.710  INFO 11164 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 80
2023-04-26 21:45:03.801 ERROR 11164 --- [oundedElastic-1] c.a.c.n.d.r.NacosReactiveDiscoveryClient : get services from nacos server fail,

com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: 
    at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:279) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.getServiceList(NamingGrpcClientProxy.java:202) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.getServiceList(NamingClientProxyDelegate.java:137) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:440) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.client.naming.NacosNamingService.getServicesOfServer(NacosNamingService.java:428) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery.getServices(NacosServiceDiscovery.java:69) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.7.RELEASE.jar:2.2.7.RELEASE]
    at com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClient.lambda$getServices$1(NacosReactiveDiscoveryClient.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.7.RELEASE.jar:2.2.7.RELEASE]
    at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.3.17.RELEASE.jar:3.3.17.RELEASE]
    at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:187) ~[reactor-core-3.3.17.RELEASE.jar:3.3.17.RELEASE]
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.3.17.RELEASE.jar:3.3.17.RELEASE]
    at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.3.17.RELEASE.jar:3.3.17.RELEASE]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_321]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_321]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_321]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_321]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_321]
    at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_321]
Caused by: com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING
    at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:655) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:635) ~[nacos-client-2.0.3.jar:na]
    at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:269) ~[nacos-client-2.0.3.jar:na]
    ... 16 common frames omitted

server-addr配置加上8848端口

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这篇文章:解决Nacos集群搭建,Nginx负载均衡后服务注册失败
  • 除此之外, 这篇博客: nginx+nacos集群环境搭建中的 2、nacos安装 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    # 下载好的nacos放到/usr/local目录下
    cd /usr/local
    # 解压
    tar -zxvf nacos-server-2.0.1.tar.gz
    # 删除压缩包
    rm -f nacos-server-2.0.1.tar.gz
    
  • 以下回答来自chatgpt:

    根据参考资料和你提供的配置,推断你使用的是Nacos单机模式,而非Nacos集群模式。因此,你需要按照参考资料段落2的步骤,进行Nacos集群的搭建。

    以下是基本的步骤:

    1. 确保你已经在三台机器上安装并启动了Docker,并在每台机器上添加了network:

    $ docker network create mynet

    1. 从 Docker Hub 拉取 Nacos 镜像:

    $ docker pull nacos/nacos-server:v2.1.2

    1. 创建三个 Nacos 节点容器,分别为 node1、node2 和 node3。每个节点容器应该有一个 IP,它们应该在同一个网络中,同时确保每个容器在启动时使用唯一的名称:

    ``` $ docker run -itd --name node1 --net mynet --ip 172.19.0.21 --restart=always -e PREFER_HOST_MODE=ip -e MODE=cluster -e NACOS_SERVERS="172.19.0.22:8848 172.19.0.23:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.19.0.11 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root666 -e MYSQL_SLAVE_SERVICE_HOST=172.19.0.12 -e MYSQL_SLAVE_SERVICE_PORT=3306 -e MYSQL_DATABASE_NUM=2 -e JVM_XMS=256m -e JVM_XMX=512m -e JVM_XMN=256m -p 18801:8848 nacos/nacos-server:v2.1.2

    $ docker run -itd --name node2 --net mynet --ip 172.19.0.22 --restart=always -e PREFER_HOST_MODE=ip -e MODE=cluster -e NACOS_SERVERS="172.19.0.21:8848 172.19.0.23:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.19.0.11 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root666 -e MYSQL_SLAVE_SERVICE_HOST=172.19.0.12 -e MYSQL_SLAVE_SERVICE_PORT=3306 -e MYSQL_DATABASE_NUM=2 -e JVM_XMS=256m -e JVM_XMX=512m -e JVM_XMN=256m -p 18802:8848 nacos/nacos-server:v2.1.2

    $ docker run -itd --name node3 --net mynet --ip 172.19.0.23 --restart=always -e PREFER_HOST_MODE=ip -e MODE=cluster -e NACOS_SERVERS="172.19.0.21:8848 172.19.0.22:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.19.0.11 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root666 -e MYSQL_SLAVE_SERVICE_HOST=172.19.0.12 -e MYSQL_SLAVE_SERVICE_PORT=3306 -e MYSQL_DATABASE_NUM=2 -e JVM_XMS=256m -e JVM_XMX=512m -e JVM_XMN=256m -p 18803:8848 nacos/nacos-server:v2.1.2 ```

    注意: Nacos 集群中的节点数量至少为 3 个。在示例中,我们选择了三个节点。

    1. 确定节点之间的通信方式:

    分为两种方式:

    (1)在构建容器时通过修改 docker run 命令来指定,例如上述步骤中的 --net mynet--ip 172.19.0.x

    (2)将通信信息配置为环境变量传递给容器。

    1. 通过访问其中任何一个节点,在浏览器中打开 http://node1:8848/nacos/,成功部署 Nacos 集群。如果登录凭据并排除有关防火墙的任何问题,则应该能够看到 Nacos 主页。

    您可以通过以下地址访问基本的Web界面:

    http://node1:8848/nacos/

    完成了这些步骤后,您可以在微服务中直接使用 nginx 暴露的 8848,9848 端口进行负载均衡使用。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^