SpringCloudGateway - URL 中重复服务名称的路由问题

问题描述 投票:0回答:4

我正在尝试使用

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
在路由后被删除!!

不过,任何帮助将不胜感激!!! :))

java regex spring-boot spring-cloud spring-cloud-gateway
4个回答
1
投票

pom.xml
application.yml
中更改您的管理服务名称,并将其更改为类似
admin-service
或不同于 admin 的名称,然后根据服务名称更改网关中的服务名称,现在谓词和服务 uri 应该彼此不同,您的网关应能够成功路由请求。

管理服务application.yml:
    spring:
      application:
        name: admin-service
网关服务application.yml:
    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/**

0
投票

检查路由 URI 配置。

你有这个:

uri: lb://admin

变成这样:

uri: lb://

0
投票

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


0
投票

您遇到这个问题是因为您已将

/**
指定为路径谓词,这意味着匹配
/**
的任何路径都将转发到管理服务,包括
/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
前缀将在请求转发到管理服务之前被修剪。

© www.soinside.com 2019 - 2024. All rights reserved.