我正在尝试使用
API-Gateway
.在我们的项目上实施
Spring-Cloud-Gateway
服务
考虑到我有一个名为
admin
的服务,我正在尝试配置它的路由,如下所示:
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: admin_route
uri: lb://admin
predicates:
- Path=/admin/**
编译成功,就是有问题!!
我在
admin
服务上有一个 API,其 URL 如下所示,无需网关即可正常工作:
http://localhost:<ADMIN_PORT>/admin/system/employee/check
但是当我想通过
gateway
服务调用这个 API 时,我必须复制 URL 中的 admin
,如下所示,这样它才能正常工作:
http://localhost:<GATEWAY_PORT>/admin/admin/system/employee/check
有人知道或知道如何解决这个问题吗?
任何帮助将不胜感激!!
注:Spring-Boot 2.7.0, Soring-Cloud 2021.0.3, Java 1.8
********************* 更新 ***************************
我在管理员的
servlet-context-path
中设置了apllication.name
和application.yml
如下:
spring:
application:
name: admin
server:
port: <ADMIN_PORT>
servlet:
context-path: /admin
我认为这就是我需要在 URL 中复制服务名称的原因,但是我在
SpringCloudGateway
上找不到与此主题相关的任何配置!!
********************* 注意 ***************************
不允许我从管理员的
servlet-context-path
中删除已设置为/admin
的application.yml
,因为我需要他们在内部调用我的服务而不需要Gateway
!!
所以我需要以下网址:
http://localhost:<GATEWAY_PORT>/admin/system/employee/check
将被路由到以下地址:
http://localhost:<ADMIN_PORT>/admin/system/employee/check
没有
/admin
在路由后被删除!!
不过,任何帮助将不胜感激!!! :))
在
pom.xml
和 application.yml
中更改您的管理服务名称,并将其更改为类似 admin-service
或不同于 admin 的名称,然后根据服务名称更改网关中的服务名称,现在谓词和服务 uri 应该彼此不同,您的网关应能够成功路由请求。
spring:
application:
name: admin-service
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: admin_route
uri: lb://admin-service
predicates:
- Path=/admin/**
检查路由 URI 配置。
你有这个:
uri: lb://admin
变成这样:
uri: lb://
API 网关在这种情况下对 url 前缀进行匹配
admin
,然后将调用重定向到指定的服务,该服务对剩余的 url 进行匹配。 SpringCloudGateway
不知道您的服务的内部路由。您可以将 context-path: /admin
替换为 context-path: /tomato
,然后您需要在 url 中包含 tomato
。
解决方案是在实施服务配置上删除
admin
前缀。根据您的描述,它无论如何都打算通过 API 网关使用,因此消费者无论如何都无法访问没有admin
的服务映射。由于默认值为 /
,只需从 servlet.context-path
中删除属性
application.yaml
根据尤里卡发现,您的服务通过以下方式报告其名称 属性(摘自文档)
默认应用名称 (即服务 ID)、虚拟主机和非安全端口(采取 来自环境)是${spring.application.name}, 分别为 ${spring.application.name} 和 ${server.port}。
https://cloud.spring.io/spring-cloud-netflix/multi/multi__service_discovery_eureka_clients.html
您遇到这个问题是因为您已将
/**
指定为路径谓词,这意味着匹配 /**
的任何路径都将转发到管理服务,包括 /admin
前缀。
修改您的配置以在路径谓词中包含 /admin 前缀。
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: admin_route
uri: lb://admin
predicates:
- Path=/admin/**
现在对
http://localhost:<GATEWAY_PORT>/admin/system/employee/check
的请求将被转发给http://localhost:<ADMIN_PORT>/system/employee/check
。 /admin
前缀将在请求转发到管理服务之前被修剪。