引言
笔者在部署mall项目的过程中其实踩了两个典型的坑,花了不少时间才解决,这里笔者也记录下来,为在部署过程中遇到相同报错的读者朋友提供解决方案。
报错日志
2024-03-02 01:23:26 [reactor-http-epoll-2] ERROR o.s.b.a.w.r.e.AbstractErrorWebExceptionHandler - [75a7ff78-4] 500 Server Error for HTTP GET "/mall-portal/home/content"
io.netty.channel.ConnectTimeoutException: connection timed out: /10.0.8.16:8085
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:613)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
问题定位
mall-gateway
微服务网关在调用mall-portal
微服务的时候报了上面这个连接超时的错误,为了解决这个问题笔者花了不少时间,后面发现mall-portal
服务的ip
地址10.0.8.16为内网ip
,而在微服务调用的时候是需要一个公网的ip地址才能调用成功的。而当时我的mall-portal
微服务明明是部署在一台腾讯云公网服务器上的。后面才发现原来是因为我的nacos
服务部署在一台腾讯云轻应用服务器上,它会把同样部署在腾讯云服务器上的服务的ip
注册为内网ip
,造成mall-gateway
网关服务在使用open-fengin
客户端通过http
请求在调用mall-portal
微服务时报连接无法识别ip
地址,从而造成连接超时的错误。
解决的方案
将nacos
注册中心服务部署到云服务器上,例如阿里云或腾讯云服务器上,注意一定不能部署到轻应用服务器上。
Nacos Grpc
服务状态运行时异常报错日志
2024-03-05 23:52:19 [com.alibaba.nacos.client.remote.worker] ERROR c.a.n.c.r.client.grpc.GrpcClient - Server check fail, please check server 47.113.205.244 ,port 9848 is available , error ={}
java.util.concurrent.ExecutionException: com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
at com.alibaba.nacos.shaded.com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:566) com.alibaba.nacos.shaded.io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:740)
at com.alibaba.nacos.shaded.io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at com.alibaba.nacos.shaded.io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
... 3 common frames omitted
Caused by: com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: 拒绝连接: /47.113.205.244:9848
Caused by: java.net.ConnectException: 拒绝连接
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:715)
at com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
问题定位
Nacos
服务不仅需要开通8848端口防火墙用于访问Nacos
控制台,还需要开放9848端口用于GRPC
协议通信,错误日志的第一行也提示的非常明显,让我们检查nacos
服务器上用于Grpc
客户端通信的9848端口是否可用。
解决方案
开通9848端口防火墙,同时登录云服务器控制台,在入站规则界面添加9848端口的入站规则
firewall-cmd --add-port=9848/tcp --zone=public --permanent
firewall-cmd --reload
以上两个报错,第一个算比较难一点,需要结合自己的猜想和推理尝试才好解决。而第二个报错则日志提示得非常明显,解决起来也很容易。通过查看日志中的报错明细,其实都非常解决程序运行过程中出现的报错。