问题描述

如下图所示,服务1和网关部署在服务器1上,服务2和nacos部署在服务器2上。网关调用服务1成功,调用服务2失败。报错如下:

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
io.netty.channel.ConnectTimeoutException: connection timed out: /10.0.0.12:8888
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:576) ~[netty-transport-native-epoll-4.1.59.Final-linux-x86_64.jar!/:4.1.59.Final]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
|_ checkpoint ⇢ HTTP GET "/app/blog/selectBlogPageByViews?pageNum=1&pageSize=15" [ExceptionHandlingWebHandler]
Stack trace:
at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:576) ~[netty-transport-native-epoll-4.1.59.Final-linux-x86_64.jar!/:4.1.59.Final]
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:384) ~[netty-transport-native-epoll-4.1.59.Final-linux-x86_64.jar!/:4.1.59.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.59.Final.jar!/:4.1.59.Final]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_312]

问题排查

注意报错第一行:

1
io.netty.channel.ConnectTimeoutException: connection timed out: /10.0.0.12:8888

调用ip为10.0.0.12为网卡地址:

1
2
3
4
5
6
7
8
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.0.0.12 netmask 255.255.252.0 broadcast 10.0.3.255
inet6 fe80::5054:ff:fe8d:bde prefixlen 64 scopeid 0x20<link>
ether 52:54:00:8d:0b:de txqueuelen 1000 (Ethernet)
RX packets 1405478 bytes 959876907 (915.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1095472 bytes 217959210 (207.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

img

说明nacos默认使用内网ip注册,不同内网之间不互通,因此调用失败。

解决方式

参考文档:spring-cloud-starter-alibaba-nacos-discovery文档

img

服务注册到Nacos时,默认使用的是网卡地址,为内网。服务运行在不同的服务器上,内网不互通,因此调用失败。我们可以在服务注册时,手动配置注册ip地址,填写公网即可。

1
2
3
4
5
spring:
cloud:
nacos:
discovery:
ip: xxxx # 填写公网ip