【问题标题】:Name resolution failure with Spring Gateway and EurekaSpring Gateway 和 Eureka 的名称解析失败
【发布时间】:2021-03-23 06:59:08
【问题描述】:

早安,

目前我正在开发一个非常简单的网关,(目前)只需要重定向传入的 HTTP POST 和 GET 请求。

设置:

  • Eureka Server:我的 Spring Boot 微服务注册的位置;
  • Spring 网关:映射所有传入的 HTTP POST 和 GET 请求并将它们路由到适当的微服务;
  • Spring Boot 微服务:按要求做一些事情 :)

注意:我对这个网关的东西有点陌生,你知道:)。

微服务已在 Eureka 服务器上正常注册。它的基于 Web 的 GUI 向我显示实例“MY-MICRO-SERVICE”已在 Eureka 服务器上注册。其他(Spring Boot)服务可以毫无问题地使用该名称(“MY-MICRO-SERVICE”),因此对他们来说它工作正常。只是这个网关不能处理实例名;似乎它只接受IP地址(我只是想阻止,因为微服务可以从服务器更改,因此它们的IP地址)。并且 Eureka 服务器未配置为仅允许/使用 IP 地址。


问题:

当网关有一个包含微服务 IP 地址的路由时,一切运行顺利。但我想要的是让网关从 Eureka 服务器解析服务 ID。如果我这样做,它会给我一个java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resoultion


问题:

现在为什么我不能在 Spring Gateway 中使用 Spring 应用程序“MY-MICRO-SERVICE”(即已注册的 Spring Boot 微服务)的名称(而在其他微服务中使用时该构造可以正常工作)? Yaml 配置文件不能处理这样的实例名称,只能处理 IP 地址吗?


详情

网关主要通过 yaml 配置文件进行配置。只有一个简单的 Java 类启动网关应用程序。路由都是在 yaml 配置文件中设置的。

Spring Gateway 应用程序类

@SpringBootApplication
@EnableEurekaClient
public class MyGatewayApplication {

  public static void main(String[] args) {
    SpringApplication.run(MyGatewayApplication.class, args);
  }
}

网关 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$8.run(SocketUtils.java:146) ~[netty-common-4.1.36.Final.jar:4.1.36.Final]
...

【问题讨论】:

  • 另一个注意事项:我还添加了一个 Bean - LoadBalanced 公共 WebClient.Builder 方法(它返回一个 WebClient.builder())。如上所述的 main 方法不再使用 LoadBalancer 进行注释(因为它不是 bean)。但仍然存在同样的问题。

标签: java spring spring-boot netflix-eureka gateway


【解决方案1】:

问题已解决。

我将“http”更改为“lb”协议,这解决了我的问题。据我了解,“lb”代表负载平衡。我的本地机器上没有活动的负载均衡器,但无论如何:这行得通。

   - POST
      routes:
        - id: my_route
          uri: lb://MY-MICRO-SERVICE
          predicates:
            - Path=/test/**

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2021-05-13
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2020-07-08
    • 2012-04-18
    相关资源
    最近更新 更多