【问题标题】:Spring Cloud API Gateway routing not workingSpring Cloud API Gateway 路由不起作用
【发布时间】:2021-03-27 17:21:57
【问题描述】:

我使用以下技术设计了一个微服务原型

  1. 尤里卡服务器
  2. 服务
  3. Spring Cloud API 网关

上面提到的服务都注册到了Eureka Server

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-gateway
  • 在您的服务配置中,您已将应用程序名称设置为MicroService1,但在 API 网关路由配置中将 id 设置为service1。此外,您的 uri 设置为 MICROSERVICE1。 3个都不一样,为什么?将 id 和 uri 放入 MicroService1,因为应用程序名称仅在其中注册。看看有没有帮助!

标签: spring-boot spring-cloud-gateway


【解决方案1】:

我已经修改了 API 网关路由配置,如下所示

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

现在工作正常

【讨论】:

  • 您只是删除了负载平衡
  • 你通过删除负载平衡完全扼杀了微服务的目的。
【解决方案2】:

在两个微服务实例中添加eureka.instance.hostname=localhost,这将起作用并且不会出错

【讨论】:

  • 您能解释一下为什么会这样吗?之前出了什么问题?
【解决方案3】:

你好 jebji 如果你还有这个问题 添加 spring.cloud.discovery.enabled=true 在 application.properties 中

【讨论】:

  • 我也有同样的问题
【解决方案4】:

仅将以下属性添加到您的 API 网关中:

spring.cloud.discovery.enabled=true

确保您已将 DevTool maven 依赖项添加到您的 API 网关项目中,但如果没有,请重新启动它。

【讨论】:

    【解决方案5】:

    在所有 eruka 客户端微服务和 api 网关的 application.property 文件中添加流动属性,我面临同样的问题并解决做同样的活动

    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
    

    【讨论】:

      【解决方案6】:

      将以下添加到网关和单个微服务修复问题

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

      【讨论】:

        【解决方案7】:

        添加以上所有属性后,如果您遇到问题,请尝试以下属性,

        不要使用 lb://albums_service ,而是使用 lb://albums-service 。因为 URI 不支持下划线。

        【讨论】:

          【解决方案8】:

          您可以在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 然后您可以像我在上面的配置中那样设置路径,在 api-gateway 中定义微服务 1 的基本路径。

          【讨论】:

            【解决方案9】:

            添加您的application.properties:

            spring.cloud.discovery.enabled=true
            

            【讨论】:

              【解决方案10】:

              错误消息是“无法解析'LAPTOP-KU56B6A8'”。

              这是一个 DNS 问题。

              • 您可以在服务中设置eureka.instance.prefer-ip-address=true。

              所以它会在 Eureka 使用它的 ip 注册,并且可以避免 DNS 问题。

              这其实和QUESTION是同一个问题。

              有了这个ANSWER

              【讨论】:

                猜你喜欢
                • 2021-11-19
                • 2020-04-01
                • 2021-06-27
                • 2019-08-03
                • 2019-03-31
                • 2023-01-21
                • 2019-10-29
                • 2018-11-14
                • 1970-01-01
                相关资源
                最近更新 更多