Spring Cloud Gateway 无法进行负载平衡并给出错误 500
Posted
技术标签:
【中文标题】Spring Cloud Gateway 无法进行负载平衡并给出错误 500【英文标题】:Spring Cloud Gateway not able to load balance and gives error 500 【发布时间】:2020-05-27 18:56:06 【问题描述】:我正在学习这里的教程:https://www.javainuse.com/spring/cloud-gateway-eureka。
我有 2 个应用程序,可通过 localhost 访问(localhost:8080/employee/messages,localhost:8082/consumer/messages)。我还有一个服务发现(Spring Cloud Eureka)和用于负载平衡的 Spring Cloud Gateway。我已经用 eureka 注册了这三个。
另外,我在本地机器上运行所有东西,这里的 host.docker.internal 是什么?
网关应用程序的 application.properties 文件如下所示:
server:
port: 9090
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: employeeModule
uri: lb://FIRST-SERVICE
predicates:
- Path=/employee/**
- id: consumerModule
uri: lb://SECOND-SERVICE
predicates:
- Path=/consumer/**
但是,每当我尝试访问 localhost:9090/employee/message 时,都会收到错误代码 500。 网关服务中的错误日志如下所示:
io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection timed out: no further information: host.docker.internal/10.7.250.57:8080
Caused by: java.net.ConnectException: Connection timed out: no further information
at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:579) ~[na:na]
at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:820) ~[na:na]
at io.netty.channel.socket.nio.NiosocketChannel.doFinishConnect(NioSocketChannel.java:327) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:336) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:685) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511) ~[netty-transport-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918) ~[netty-common-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.38.Final.jar!/:4.1.38.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.38.Final.jar!/:4.1.38.Final]
at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]
谁能告诉我这里的错误是什么。
编辑:我在公司代理后面,无法执行以下操作:curl host.docker.internal:8080/employee/message
【问题讨论】:
【参考方案1】:消息告诉您,您没有从网关连接到微服务 REST 端点。您的 URI 似乎没有正确指定;建议使用 URL,例如 uri:http://localhost:8000/employee 或类似的东西。 (在我的应用程序中工作......)
关于负载均衡,这篇文章中没有任何地方的负载均衡。 Spring Cloud Gateway 匹配请求属性上的路由。这就是您试图在 yml 文件中促进的内容。 Spring Cloud Gateway 不等于负载均衡;它是进入微服务架构的一种方式。
负载平衡可以使用 Netflix Ribbon(显然已被弃用)或新的 Spring Cloud Load Balancer 来完成。您没有使用任何一个,因此没有负载平衡。例如:
https://spring.io/blog/2020/03/25/spring-tips-spring-cloud-loadbalancer
https://spring.io/guides/gs/spring-cloud-loadbalancer/
此外,您需要设置可以在本地或跨网络发现的并行应用程序。然后实现 Netflix Ribbon 或者最好是新的 Spring Load Balancer。
我相信,对于流量非常大的应用程序,可以设置并行 Spring Cloud 网关并在这些网关之间进行负载平衡。我希望一个网关不会成为高流量的瓶颈,即使它是异步的,就像这里的情况一样。
我还没有找到任何跨网关负载平衡的示例,希望在此提供反馈。具体来说,是否存在与 Spring 文档中的 Hello 应用程序不同的网关负载平衡(正在发展)?
【讨论】:
以上是关于Spring Cloud Gateway 无法进行负载平衡并给出错误 500的主要内容,如果未能解决你的问题,请参考以下文章
无法根据活动的 Spring 配置文件生成不同的 spring-cloud-gateway 路由
无法处理配置类 Spring Cloud Gateway 的导入候选
无法使用 API Gateway Spring Cloud 调用实际服务