【发布时间】:2021-10-09 16:01:04
【问题描述】:
我有以下设置:
- 8080 端口上的 Spring Cloud 网关
- 将 /user 路由到端口 9000 上的 Spring Rest API(被调用用户)
- 将 /character 路由到端口 9001 上的 Spring Rest API(调用字符)
- Spring Cloud Config Server 8090 端口
Gateway 和两个 Rest API 应用程序连接到 Cloud Config 以提取配置。应用程序本身可以正确启动,并且可以通过它们各自的端口使用。我通过调用 /swagger-ui.html 对此进行了测试,效果很好。
当调用 /actuator/gateway/routes 时,我得到了网关的路由列表,看起来不错。
对于我设置的所有四个应用程序:
server:
address: 0.0.0.0
port: 8080 # ports are adjusted for each service
forward-headers-strategy: framework
当我不使用 Spring Cloud Config Server 时,网关运行良好。现在,每当调用 /user/swagger-ui.html 或 /character/swagger-ui.html
时,我都会收到以下错误java.lang.IllegalArgumentException: Invalid IPv4 address: 0:0:0:0:0:0:0:1:60979
at org.springframework.web.util.UriComponentsBuilder.parseForwardedFor(UriComponentsBuilder.java:363) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.filter.ForwardedHeaderFilter$ForwardedHeaderExtractingRequest.<init>(ForwardedHeaderFilter.java:246) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal(ForwardedHeaderFilter.java:149) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.8.jar:5.3.8]
尝试将 forward-headers-strategy 更改为 native 也无济于事。我深入研究了 UriComponentBuilder 并设置了一些断点来调查其中的变量,我怀疑 request.headers["forwarded"] 是它失败的原因:
它尝试解析不是 IPv4 地址的变量内部的“for”,因此失败。在使用 Spring Cloud Config 之前,使用“server.address”强制 ipv4 似乎可行,但现在不行。有没有人遇到过同样的问题并且知道我应该怎么做才能摆脱这个异常?
所以总而言之,路由本身似乎工作,因为它路由到正确的应用程序。应用程序本身(在这种情况下为用户)抛出错误,而不是网关。
【问题讨论】:
-
遇到上述例外情况的运气。我有一个类似的例外,令我惊讶的是,事情在 Firefox 中有效,但在 chrome 中无效。与您面临的问题完全相同。
-
您是否在任何地方使用 IPv6?
-
在我本地是的。这就是问题。 github.com/spring-cloud/spring-cloud-gateway/pull/2217
标签: java spring spring-boot spring-cloud spring-cloud-gateway