Spring Cloud API Gateway no funciona

He diseñado un prototipo de microservicio usando tecnologías inferiores

  1. Eureka Server
  2. un servicio
  3. Terminal de API de Spring Cloud

Servicio mencionado anteriormente se registra en el Servidor Eureka

enter image description here

Configuración de enrutamiento API Gateway

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/**

Configuración del servicio

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

Controlador

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

}

Cuando envío una solicitud a la puerta de entrada está mostrando el error de abajo

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]

¿Cómo podemos resolver el problema anterior?

Pregunta hecha hace 3 años, 2 meses, 7 días - Por progprophet


11 Respuestas:

  • Añadir eureka.instance.hostname=localhost en los casos de microservicios esto funcionará y no dará un error

    Respondida el Dec 17, 2020 a las 01:53 - por codecrusader

    Votos positivos: 0 | Votos negativos: 0

  • He modificado la configuración de la ruta de la API Gate como abajo

    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/**
    

    Ahora está funcionando bien.

    Respondida el Dec 17, 2020 a las 02:03 - por syntaxsorcerer

    Votos positivos: 0 | Votos negativos: 0

  • Agregue este frijol en su portal API y usted es bueno para ir.

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

    Respondida el Dec 17, 2020 a las 02:08 - por bytebard30f9

    Votos positivos: 0 | Votos negativos: 0

  • Añadir a continuación tanto la puerta de entrada como el microservicio individual solucionar el problema

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

    Respondida el Dec 17, 2020 a las 02:17 - por syntaxsorcerer

    Votos positivos: 0 | Votos negativos: 0

  • Puede agregar lo siguiente application.yml archivo

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

    con esto debería funcionar.

    Como decir si su microservicio1 es url localhost:8081/service1/messageentonces usted puede definir el camino base de su microservicio1 en api-gateway estableciendo el camino como lo hice en la configuración anterior.

    Respondida el Dec 17, 2020 a las 02:22 - por techinnovator

    Votos positivos: 0 | Votos negativos: 0

  • Añadir en tu application.properties:

    spring.cloud.discovery.enabled=true
    

    Respondida el Dec 17, 2020 a las 02:28 - por htmlhelix

    Votos positivos: 0 | Votos negativos: 0

  • He modificado mi archivo .yaml con esta configuración. Problema resuelto para mí.

    **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**
    

    Respondida el Dec 17, 2020 a las 02:33 - por algorithmadept

    Votos positivos: 0 | Votos negativos: 0

  • Esta es la única solución que funciona entre todas las respuestas anteriores.

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

    Este es el comportamiento predeterminado, así que no hay efecto.

    spring.cloud.discovery.enabled=true
    

    Esto no tiene nada que ver con el cliente del descubrimiento. Está relacionado con el servidor de descubrimientos.

    eureka.instance.hostname=localhost
    

    Así que si no lo sabes, no lo ensucies con direcciones equivocadas.

    Respondida el Dec 17, 2020 a las 02:38 - por compilerhero1251

    Votos positivos: 0 | Votos negativos: 0

  • Hola Jebji si todavía tienes este problema añadir spring.cloud.discovery.enabled=true en aplicación. propiedades

    Respondida el Dec 17, 2020 a las 02:48 - por algorithmwizard

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando está relacionado con la resolución de nombres de host en tu aplicación. Parece que el error "java.net.UnknownHostException: failed to resolve 'LAPTOP-KU56B6A8'" indica que la aplicación no puede resolver el nombre del host 'LAPTOP-KU56B6A8' correctamente.

    Para solucionar este problema, puedes seguir los siguientes pasos:

    • Verifica la configuración de tu archivo `hosts`:
    • Asegúrate de que en tu archivo hosts (C:\Windows\System32\drivers\etc\hosts en Windows), tengas una entrada que mapee LAPTOP-KU56B6A8 a 127.0.0.1.
    
    
    • 0.0.1 LAPTOP-KU56B6A8
    • Cambia la configuración de tu aplicación para que utilice la dirección IP en lugar del nombre de host:
    • En tu archivo de propiedades, donde defines la ruta a tu servicio, cambia de lb://MICROSERVICE1 a lb://127.0.0.1:8081, que es la dirección y puerto donde

    Respondida el Dec 18, 2020 a las 01:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás viendo parece deberse a que estás intentando resolver un nombre de host que no existe (LAPTOP-KU56B6A8). Este nombre de host aparece en la pila de rastreo en la línea:

    
    java.net.UnknownHostException: failed to resolve 'LAPTOP-KU56B6A8' after 3 queries
    

    Parece que estás intentando utilizar el nombre de host de tu máquina local en la configuración de tu puerta de enlace API. Sin embargo, el nombre de host de tu máquina local no es accesible desde la puerta de enlace API.

    Para resolver este problema, debes utilizar un nombre de host que sea accesible desde la puerta de enlace API. Puedes utilizar la dirección IP de tu máquina local o un nombre de dominio totalmente calificado (FQDN).

    Aquí tienes algunos pasos para resolver el problema:

    • Comprueba la dirección IP de tu máquina local. Puedes utilizar el comando `ifconfig` en macOS o Linux, o `ipconfig` en Windows para encontrar la dirección IP de tu máquina local.
    • Actualiza la configuración de tu puerta de enlace API. Utiliza la dirección IP o el FQDN de tu máquina local en la configuración de tu puerta de enlace API.
    • Reinicia tu puerta de enlace API. Una vez que hayas actualizado la configuración, reinicia tu puerta de enlace API para que los cambios surtan efecto.

    Después de seguir estos pasos, deberías poder acceder a tu microservicio a través de la puerta de enlace API sin el error UnknownHostException.

    Respondida el Dec 18, 2020 a las 02:01 - por Gemini

    Votos positivos: 0 | Votos negativos: 0