项目场景:
使用docker部署一个微服务启动时,发现连接不上nacos,微服务无法读取到nacos报错导致启动失败。
问题描述
c.a.n.c.remote.client.grpc.GrpcClient: Server check fail, please check server XXX.X.XXX.XXX ,port XXX is available , error ={}
java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 259427 nanoseconds delay) for com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture@442675e1[status=PENDING, info=[GrpcFuture{clientCall={delegate={delegate=ClientCallImpl{method=MethodDescriptor{fullMethodName=Request/request, type=UNARY, idempotent=false, safe=false, sampledToLocalTracing=true, requestMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@6166e06f, responseMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@49e202ad, schemaDescriptor=com.alibaba.nacos.api.grpc.auto.RequestGrpc$RequestMethodDescriptorSupplier@1c72da34}}}}}]]
原因分析:
微服务启动时会将服务信息注册到Nacos上,但由于Nacos服务注册的IP选择时,选择了注册为内网IP导致无法和宿主机暴露的公网IP端口通讯,无法连接和注册到nacos上,导致服务启动失败。
解决方案:
1.声明服务实例为公网IP
spring:cloud:nacos:discovery:#你的服务器公网IPip: XXX.X.X.XXX
2.采用Host模式
在启动命令添加–net=host 使用宿主机的ip地址。
docker run --name XXXX --net=host