Маршрутизация Spring Cloud API Gateway не работает

Я разработал прототип микросервиса, используя следующие технологии.

  1. Эврика сервер
  2. сервис
  3. Шлюз Spring Cloud API

Вышеуказанная служба зарегистрирована на сервере Eureka.

Конфигурация маршрутизации шлюза API

server.port=8080
eureka.client.serviceUrl.defaultZone = http://localhost:8083/eureka
spring.application.name=ApiGateway
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

spring.cloud.gateway.routes[0].id=service1
spring.cloud.gateway.routes[0].uri=lb://MICROSERVICE1
spring.cloud.gateway.routes[0].predicates[0]=Path=/service1/**

Конфигурация службы

server.port=8081
server.address=127.0.0.1
eureka.client.serviceUrl.defaultZone = http://localhost:8083/eureka
spring.application.name=MicroService1
error.whitelabel.enabled= false

Контроллер

@RestController
@RequestMapping("/service1")
public class HomeController {
    @GetMapping("/message")
    public String hello() {
        return "response from micro service1";
    }

}

Когда я отправляю запрос на шлюз, он показывает следующую ошибку

2020-12-16 22:26:09.770 ERROR 16700 --- [ctor-http-nio-3] a.w.r.e.AbstractErrorWebExceptionHandler : [d3334561-1]  500 Server Error for HTTP GET "/service1/message"

java.net.UnknownHostException: failed to resolve 'LAPTOP-KU56B6A8' after 3 queries 
    at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1013) ~[netty-resolver-dns-4.1.55.Final.jar:4.1.55.Final]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP GET "/service1/message" [ExceptionHandlingWebHandler]

Как мы можем решить вышеуказанную проблему?

Добавьте: eureka.instance.prefer-ip-address=true в файл application.properties для всех ваших микросервисов и API-шлюза.

Vipul Gupta 27.01.2021 14:44

В конфигурации службы вы установили имя приложения как MicroService1, но установили идентификатор как service1 в конфигурации маршрутизации шлюза API. Кроме того, ваш uri установлен как MICROSERVICE1. Все 3 разные, почему? Поместите идентификатор и uri в MicroService1, так как имя приложения регистрируется только с ним. Посмотрите, поможет ли это!

Superman 27.01.2022 21:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
5
2
30 372
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

я изменил конфигурацию маршрутизации API Gate Way, как показано ниже

spring.cloud.gateway.routes[0].id=service1
spring.cloud.gateway.routes[0].uri=http://localhost:8081/service1/
spring.cloud.gateway.routes[0].predicates[0]=Path=/service1/**

Теперь работает нормально

Вы просто удалили балансировку нагрузки

Muhammed Ozdogan 02.05.2021 23:57

вы полностью убили цель микросервисов, удалив балансировку нагрузки.

Muhammad Adnan 16.07.2021 03:56

привет jebji если у вас все еще есть эта проблема добавлять spring.cloud.discovery.enabled = истина в application.properties

У меня такая же проблема

the_tourist 12.01.2021 15:59

Добавьте eureka.instance.hostname=localhost в оба экземпляра микросервисов, это будет работать и не выдаст ошибку

Можете ли вы объяснить, почему это работает? А что было не так раньше?

Eric Huang 26.10.2021 11:23

столкнулся с той же проблемой, это работает как шарм, не знаю, почему, хотя, лол, может быть, шлюз API не распознает локальный хост, пока вы явно не укажете его?

Bigyan Devkota 07.03.2022 00:11

Добавьте в свой API-шлюз только следующее свойство:

spring.cloud.discovery.enabled = истина

Убедитесь, что вы уже добавили зависимость DevTool maven в свой проект шлюза API, но если нет, перезапустите его.

добавить текущее свойство в файл application.property всех клиентских микросервисов eruka и шлюза API, я сталкиваюсь с той же проблемой и решаю, выполняя те же действия

spring.cloud.discovery.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id= true
spring.cloud.gateway.discovery.locator.enabled= true
eureka.instance.hostname=localhost

Добавьте в свой application.properties:

spring.cloud.discovery.enabled=true

Добавьте ниже как шлюз, так и отдельный микросервис, чтобы устранить проблему.

eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:8010/eureka/

после добавления всех вышеперечисленных свойств, а также, если вы столкнулись с проблемой, попробуйте следующее:

не используйте lb://albums_service, а используйте lb://albums-service. Поскольку URI не поддерживает подчеркивание.

Вы можете добавить следующее в файл application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: test-service
          uri: lb://MICROSERVICE1
          predicates:
            - Path=/microservice1/**
          filters:
            - RewritePath=/microservice1/(?<segment>.*), /$\{segment}

с этим должно работать.

Например, скажем, если ваш microservice1 является URL-адресом localhost:8081/service1/message затем вы можете определить базовый путь вашего microservice1 в API-шлюзе, настроив путь, как я сделал в приведенной выше конфигурации.

Сообщение об ошибке «не удалось разрешить« LAPTOP-KU56B6A8 »».

Это проблема DNS.

  • Вы можете установить eureka.instance.prefer-ip-address=true в сервисе.

Таким образом, он зарегистрируется со своим IP-адресом в Eureka, и проблемы с DNS можно избежать.

На самом деле это та же проблема, что и этот ВОПРОС.

С этим ОТВЕТОМ

Добавьте этот bean-компонент в свой шлюз API, и все готово.

@Bean
public HttpClient httpClient() {
    return HttpClient.create().resolver(DefaultAddressResolverGroup.INSTANCE);
}

вышеупомянутый bean-компонент должен быть добавлен к шлюзу API, и все будет в порядке.

Odwori 25.11.2022 18:04

Я изменил свой файл .yaml с этой конфигурацией. Проблема решена для меня.

**server:
  port: 9999
spring:
  application:
    name: gateway-ws
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
      - id: userService
        uri: http://user-service/
        predicates:
        - Path=/user/**
      - id: contactService
        uri: http://contact-service/
        predicates:
        - Path=/contact/**
        
        
eureka:
  client:
    service-url:
       defaultZone: http://localhost:8085/eureka**

Это единственное решение, которое работает среди всех ответов выше.

@Bean
public HttpClient httpClient() {
    return HttpClient.create().resolver(DefaultAddressResolverGroup.INSTANCE);
}

Это поведение по умолчанию, поэтому никакого эффекта.

spring.cloud.discovery.enabled=true

Это не имеет ничего общего с клиентом обнаружения. Это связано с сервером обнаружения.

eureka.instance.hostname=localhost

Так что, если вы не знаете, просто не путайте его с неправильными направлениями.

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