Spring Gateway 和 Eureka 的名称解析失败
Name resolution failure with Spring Gateway and Eureka
美好的一天,
此刻我正在开发一个非常简单的网关,(目前)只需要重定向传入的 HTTP POST 和 GET 请求。
设置:
- Eureka 服务器:注册我的 Spring 引导微服务的位置;
- Spring 网关:映射所有传入的 HTTP POST 和 GET 请求并将它们路由到适当的微服务;
- Spring 引导微服务:按要求做一些事情:)
注意:我对这个网关的东西有点陌生,你知道的:)。
微服务已在 Eureka 服务器上正常注册。它基于网络的 GUI 向我显示实例“MY-MICRO-SERVICE”已在 Eureka 服务器上注册。其他(Spring Boot)服务可以毫无问题地使用该名称(“MY-MICRO-SERVICE”),因此对它们来说它工作正常。只是这个网关不能处理实例名;它似乎只接受 IP 地址(我只是想防止这种情况发生,因为微服务可以从服务器更改,因此可以更改它们的 IP 地址)。并且 Eureka 服务器未配置为仅 allow/use 个 IP 地址。
问题:
当网关有一条包含微服务 IP 地址的路由时,一切都会顺利进行。但是我想要的是让Gateway去解析来自Eureka服务器的服务ID。如果我这样做,它会给我一个 java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resoultion
.
问题:
现在为什么我不能在 Spring 网关(而该构造在其他微服务中使用时工作正常)? Yaml 配置文件不能处理这样的实例名称,只能处理 IP 地址吗?
详情
网关主要通过 yaml 配置文件进行配置。只有一个简单的 Java class 可以启动网关应用程序。路由都在yaml配置文件中设置。
Spring网关应用class
@SpringBootApplication
@EnableEurekaClient
public class MyGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MyGatewayApplication.class, args);
}
}
Gateway Yaml 配置文件(application.yml)
spring:
application:
name: my-gateway
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
routes:
- id: my_route
uri: http://MY-MICRO-SERVICE
predicates:
- Path=/test/**
server:
port: 8999
info:
app:
properties: dev
错误
java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resolution
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929) ~[na:na]
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515) ~[na:na]
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848) ~[na:na]
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298) ~[na:na]
at java.base/java.net.InetAddress.getByName(InetAddress.java:1248) ~[na:na]
at io.netty.util.internal.SocketUtils.run(SocketUtils.java:146) ~[netty-common-4.1.36.Final.jar:4.1.36.Final]
...
问题已解决。
我将“http”协议更改为“lb”协议,这解决了我的问题。据我了解,“lb”代表负载平衡。我的本地计算机上没有活动的负载均衡器,但无论如何:这有效。
- POST
routes:
- id: my_route
uri: lb://MY-MICRO-SERVICE
predicates:
- Path=/test/**
美好的一天,
此刻我正在开发一个非常简单的网关,(目前)只需要重定向传入的 HTTP POST 和 GET 请求。
设置:
- Eureka 服务器:注册我的 Spring 引导微服务的位置;
- Spring 网关:映射所有传入的 HTTP POST 和 GET 请求并将它们路由到适当的微服务;
- Spring 引导微服务:按要求做一些事情:)
注意:我对这个网关的东西有点陌生,你知道的:)。
微服务已在 Eureka 服务器上正常注册。它基于网络的 GUI 向我显示实例“MY-MICRO-SERVICE”已在 Eureka 服务器上注册。其他(Spring Boot)服务可以毫无问题地使用该名称(“MY-MICRO-SERVICE”),因此对它们来说它工作正常。只是这个网关不能处理实例名;它似乎只接受 IP 地址(我只是想防止这种情况发生,因为微服务可以从服务器更改,因此可以更改它们的 IP 地址)。并且 Eureka 服务器未配置为仅 allow/use 个 IP 地址。
问题:
当网关有一条包含微服务 IP 地址的路由时,一切都会顺利进行。但是我想要的是让Gateway去解析来自Eureka服务器的服务ID。如果我这样做,它会给我一个 java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resoultion
.
问题:
现在为什么我不能在 Spring 网关(而该构造在其他微服务中使用时工作正常)? Yaml 配置文件不能处理这样的实例名称,只能处理 IP 地址吗?
详情
网关主要通过 yaml 配置文件进行配置。只有一个简单的 Java class 可以启动网关应用程序。路由都在yaml配置文件中设置。
Spring网关应用class
@SpringBootApplication
@EnableEurekaClient
public class MyGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MyGatewayApplication.class, args);
}
}
Gateway Yaml 配置文件(application.yml)
spring:
application:
name: my-gateway
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
routes:
- id: my_route
uri: http://MY-MICRO-SERVICE
predicates:
- Path=/test/**
server:
port: 8999
info:
app:
properties: dev
错误
java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resolution
at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929) ~[na:na]
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515) ~[na:na]
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848) ~[na:na]
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298) ~[na:na]
at java.base/java.net.InetAddress.getByName(InetAddress.java:1248) ~[na:na]
at io.netty.util.internal.SocketUtils.run(SocketUtils.java:146) ~[netty-common-4.1.36.Final.jar:4.1.36.Final]
...
问题已解决。
我将“http”协议更改为“lb”协议,这解决了我的问题。据我了解,“lb”代表负载平衡。我的本地计算机上没有活动的负载均衡器,但无论如何:这有效。
- POST
routes:
- id: my_route
uri: lb://MY-MICRO-SERVICE
predicates:
- Path=/test/**