Я разработал прототип микросервиса, используя следующие технологии.
Вышеуказанная служба зарегистрирована на сервере 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]
Как мы можем решить вышеуказанную проблему?
В конфигурации службы вы установили имя приложения как MicroService1, но установили идентификатор как service1 в конфигурации маршрутизации шлюза API. Кроме того, ваш uri установлен как MICROSERVICE1. Все 3 разные, почему? Поместите идентификатор и uri в MicroService1, так как имя приложения регистрируется только с ним. Посмотрите, поможет ли это!




я изменил конфигурацию маршрутизации 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/**
Теперь работает нормально
Вы просто удалили балансировку нагрузки
вы полностью убили цель микросервисов, удалив балансировку нагрузки.
привет jebji если у вас все еще есть эта проблема добавлять spring.cloud.discovery.enabled = истина в application.properties
У меня такая же проблема
Добавьте eureka.instance.hostname=localhost в оба экземпляра микросервисов, это будет работать и не выдаст ошибку
Можете ли вы объяснить, почему это работает? А что было не так раньше?
столкнулся с той же проблемой, это работает как шарм, не знаю, почему, хотя, лол, может быть, шлюз API не распознает локальный хост, пока вы явно не укажете его?
Добавьте в свой 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, и все будет в порядке.
Я изменил свой файл .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
Так что, если вы не знаете, просто не путайте его с неправильными направлениями.
Добавьте: eureka.instance.prefer-ip-address=true в файл application.properties для всех ваших микросервисов и API-шлюза.