在Docker下部署nacos并注册Java服务并不是一个困难的事,难就难在碰到Java服务注册碰到的异常,下面分享一下如何在Docker中部署Docker,如何注册Java服务,并且来解决这个异常的。环境:VMWare 部署两台Linux Ubuntu虚拟机,一台做nacos服务注册中心,一台做Java服务提供者,保证两台能够相互ping通。

步骤:

 1.在docker中部署nacos

     首先在docker repository中搜索一下nacos:sudo docker search nacos,我们选择第一个nacos/nacos-server.

   其次拉取nacos镜像:sudo docker pull nacos/nacos-server

   接着查看一下nacos的版本(为什么需要这个步骤,是因为后面要在Spring Cloud alibaba中注册Java服务,nacos的版本和Spring Cloud alibaba的版本要匹配,否则注册不上报错):sudo docker inspect nacos/nacos-server,下面所示的nacos版本是v2.0.3: "org.opencontainers.image.version": "v2.0.3"

   接着运行nacos镜像:

docker run -d -e prefer_host_mode=本机ip(centos7的)  -e MODE=standalone  
 -v  /nacos/logs:/home/nacos/logs  -p 28999:8848  --name nacosdemo 
--restart=always   nacos/nacos-server      

  最后我们访问:localhost:28999/nacos/:

2.在另外一台虚拟机上注册Java服务,使用 spring cloud alibaba注册Java服务。

  首先用alibaba spring boot 脚手架初始化应用:https://start.aliyun.com/bootstrap.html,选择Spring boot版本为2.6.11,具体可以参考之前的文章,如:分布式配置nacos搭建踩坑指南(下)

  然后注册一个Java服务,具体可参考:nacos服务注册,注意这里的地址配置成docker 中的nacos地址,端口改为上述docker运行nacos镜像中的28999.application.properties配置如下:

spring.application.name=nocos-discovery-provider-sample
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=http://192.168.1.107:28999
spring.cloud.nacos.discovery.namespace=public

 运行,发现注册不上nacos,报错,仔细观察是客户端gprs请求call超时了

ERROR 37644 --- [  restartedMain] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, config-client register failed...NacosRegistration....................
​
com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: 
.....................
Caused by: com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING

 发生这个异常的原因是spring-cloud-alibaba-dependencies的版本和当前的nacos版本不符,我们需要修改spring-cloud-alibaba-dependencies的版本。查看现在的spring-cloud-alibaba-dependencies版本是2021.0.4.0,我们尝试把它修改为:  <version>2.1.2.RELEASE</version> ,再运行,发现注册成功了。

 

 原来每一个版本的spring-cloud-alibaba和nacos都有一个适配版本,如果报上述的异常,我们可以修改spring-cloud-alibaba的版本,从而能正常注册成功了。可以参考spring cloud alibaba github上的版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E.