Spring 云 API 网关路由不工作

Spring Cloud API Gateway routing not working

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

  1. 尤里卡服务器
  2. 一项服务
  3. Spring 云 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]

如何解决上述问题?

我已经修改了 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/**

现在工作正常

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

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

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

spring.cloud.discovery.enabled=真

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

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

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}

有了这个它应该可以工作。

假设您的微服务 1 是 url localhost:8081/service1/message 然后你可以像我在上面的配置中那样设置路径,在 api-gateway 中定义你的 microservice1 的基本路径。

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

这是一个 DNS 问题。

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

所以它会在Eureka用它的ip注册,这样就可以避免DNS问题。

这实际上与 的问题相同。

有了这个

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

将这个添加为 bean

我已经用这个配置修改了我的 .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**