Spring 云 API 网关路由不工作
Spring Cloud API Gateway routing not working
我使用以下技术设计了一个微服务原型
- 尤里卡服务器
- 一项服务
- 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**
我使用以下技术设计了一个微服务原型
- 尤里卡服务器
- 一项服务
- 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**