Добрый день,
В данный момент я работаю над очень простым шлюзом, которому (на данный момент) нужно только перенаправлять входящие запросы HTTP POST и GET.
НАСТРОЙКА:
Примечание: я новичок в этом шлюзе, просто вы знаете :).
Микросервис отлично зарегистрирован на сервере 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]
...




Проблема устранена.
Я изменил протокол «http» на «lb», и это решило мою проблему. Насколько я понимаю, «фунт» означает «Балансировка нагрузки». У меня нет активного балансировщика нагрузки на моей локальной машине, но в любом случае: это работает.
- POST
routes:
- id: my_route
uri: lb://MY-MICRO-SERVICE
predicates:
- Path=/test/**
Еще одно примечание: я также добавил общедоступный метод WebClient.Builder Bean - LoadBalanced (который возвращает WebClient.builder()). Основной метод, как описано выше, больше не аннотируется с помощью LoadBalancer (поскольку это не bean-компонент). Но все равно остается та же проблема.