Ошибка разрешения имени с помощью Spring Gateway и Eureka

Добрый день,

В данный момент я работаю над очень простым шлюзом, которому (на данный момент) нужно только перенаправлять входящие запросы HTTP POST и GET.

НАСТРОЙКА:

  • Сервер Eureka: место, где зарегистрированы мои микросервисы Spring Boot;
  • Spring Gateway: сопоставляет все входящие HTTP-запросы POST и GET и направляет их в соответствующий микросервис;
  • Микросервисы Spring Boot: делаем только некоторые вещи по запросу :)

Примечание: я новичок в этом шлюзе, просто вы знаете :).

Микросервис отлично зарегистрирован на сервере Eureka. Его графический веб-интерфейс показывает мне, что экземпляр «MY-MICRO-SERVICE» зарегистрирован на сервере Eureka. Другие службы (Spring Boot) могут без проблем использовать это имя («MY-MICRO-SERVICE»), поэтому для них это работает нормально. Просто этот шлюз не может обрабатывать имя экземпляра; кажется, он принимает только IP-адреса (что я просто хочу предотвратить, поскольку микросервис может меняться с серверов и, следовательно, их IP-адрес). И сервер Eureka не настроен на разрешение/использование только IP-адресов.


ПРОБЛЕМА:

Все работает гладко, если у шлюза есть маршрут, который содержит IP-адрес микросервиса. Но я хочу, чтобы шлюз разрешал идентификатор службы с сервера Eureka. И если я это сделаю, это подкинет мне java.net.UnknownHostException: MY-MICRO-SERVICE: Temporary failure in name resoultion.


ВОПРОС:

Теперь, почему я не могу использовать имя приложения Spring «MY-MICRO-SERVICE» (являющееся зарегистрированным микросервисом Spring Boot) в Spring Gateway (хотя эта конструкция отлично работает при использовании в других микросервисах)? Разве файл конфигурации Yaml не может обрабатывать такие имена экземпляров, только только IP-адреса?


ДЕТАЛИ

Шлюз в основном настраивается с помощью файла конфигурации yaml. Существует только один простой класс Java, запускающий шлюзовое приложение. Маршрутизация задается в конфигурационном файле yaml.

Класс приложения Spring Gateway

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

Еще одно примечание: я также добавил общедоступный метод WebClient.Builder Bean - LoadBalanced (который возвращает WebClient.builder()). Основной метод, как описано выше, больше не аннотируется с помощью LoadBalancer (поскольку это не bean-компонент). Но все равно остается та же проблема.

Tensineer 11.12.2020 22:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема устранена.

Я изменил протокол «http» на «lb», и это решило мою проблему. Насколько я понимаю, «фунт» означает «Балансировка нагрузки». У меня нет активного балансировщика нагрузки на моей локальной машине, но в любом случае: это работает.

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

Другие вопросы по теме