使用Eureka时Api Gateway无法连接微服务问题求助
微服务Gateway调用用户服务500错误排查求助
环境概述
- 基于用户微服务、Api Gateway、Eureka、RabbitMQ搭建微服务环境,所有组件Docker化后部署在独立EC2实例
- 所有服务可正常注册到Eureka、连接RabbitMQ并使用Cloud Config
- EC2入站规则已配置,微服务间网络互通正常
- 直接调用用户微服务执行创建用户、登录操作均正常,但通过Api Gateway调用时触发500错误
错误日志
2023-08-30T21:58:05.533Z ERROR 1 --- [or-http-epoll-3] a.w.r.e.AbstractErrorWebExceptionHandler : [3271cd96-1] 500 Server Error for HTTP POST "\"/users/login\"" io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: /172.17.0.2:8181 Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): *__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] *__checkpoint ⇢ org.springframework.web.filter.reactive.ServerHttpObservationFilter [DefaultWebFilterChain] *__checkpoint ⇢ HTTP POST "\"/users/login\"" [ExceptionHandlingWebHandler] Original Stack Trace: Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused at io.netty.channel.unix.Errors.newConnectException0(Errors.java:166) ~[netty-transport-native-unix-common-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.unix.Errors.handleConnectErrno(Errors.java:131) ~[netty-transport-native-unix-common-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.unix.Socket.finishConnect(Socket.java:359) ~[netty-transport-native-unix-common-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:710) ~[netty-transport-classes-epoll-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:687) ~[netty-transport-classes-epoll-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:567) ~[netty-transport-classes-epoll-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:489) ~[netty-transport-classes-epoll-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:397) ~[netty-transport-classes-epoll-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.94.Final.jar!/:4.1.94.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.94.Final.jar!/:4.1.94.Final] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
异常关键点
- 错误中连接被拒绝的地址为
/172.17.0.2:8181,但实际应连接EC2实例的公网/内网IP - Eureka界面显示的客户端链接格式与教程不符:教程中为
ip-xx.xx.xx.xx.ec2.internal:users:8181,当前环境显示异常
本地运行版本配置(Docker部署时已修改为互联配置)
EUREKA
server.port=8010 spring.application.name=discoveryservice eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
USERS
server.port=${PORT:0} spring.application.name=users eureka.client.service-url.defaultZone=http://localhost:8010/eureka spring.devtools.restart.enabled=true eureka.instance.instance-id=${spring.application.name}:${spring.application.instance_id:${random.value}} spring.jpa.hibernate.ddl-auto=update spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest management.endpoints.web.exposure.include=* management.endpoint.health.enabled=true management.endpoint.health.show-details=always management.health.circuitbreakers.enabled=true
GATEWAY
server.port=8083 spring.application.name=api-gateway eureka.client.service-url.defaultZone=http://localhost:8010/eureka spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.cloud.gateway.routes[0].id=users-status-check spring.cloud.gateway.routes[0].uri = lb://users spring.cloud.gateway.routes[0].predicates[0]=Path=/users/** spring.cloud.gateway.routes[0].predicates[1]=Method=GET spring.cloud.gateway.routes[0].predicates[2]=Header=Authorization, Bearer (.*) spring.cloud.gateway.routes[0].filters[0]=RemoveRequestHeader=Cookie spring.cloud.gateway.routes[0].filters[1]=RewritePath=/users/(?<segment>.*), /$\{segment} spring.cloud.gateway.routes[0].filters[2]=AuthorizationHeaderFilter spring.cloud.gateway.routes[1].id=users-create-user spring.cloud.gateway.routes[1].uri=lb://users spring.cloud.gateway.routes[1].predicates[0]=Path=/users spring.cloud.gateway.routes[1].predicates[1]=Method=POST spring.cloud.gateway.routes[1].filters[0]=RemoveRequestHeader=Cookie spring.cloud.gateway.routes[1].filters[1]=RewritePath=/users/(?<segment>.*), /$\{segment}
已尝试方案
- 为用户微服务添加配置
eureka.instance.preferIpAddress=true,问题未解决
内容的提问来源于stack exchange,提问作者Adrian Moncada
相关产品推荐
相关产品推荐

