是否可以配置 Zuul 路由以匹配通配符?
Is it possible to configure Zuul routes to match on wildcards?
我正在构建一个多租户应用程序,其中租户名称包含在每个 url 中。例如,检索租户 "Test" 的所有当前用户的路由如下所示:/ui/api/Test/users
。我目前正在处理的应用程序部分是一个客户端,它将它支持的任何其他应用程序的请求转发到我的数据库服务,允许客户端充当中间人。
你大概能看出这是怎么回事。我正在使用 Zuul 转发我的路由,但并非所有路由都应以这种方式转发。有时,前端会发送以 /ui/api/
开头的不是数据库请求的请求。假设其中一个看起来像这样:/ui/api/Test/Foo
。我希望能够以这样一种方式配置我的 Zuul 路由,即我可以转发任何符合模式 /ui/api/*/users
(其中 * 是任何字符串)的 url,而不转发任何其他路由。
我当然尝试过简单地使用 /ui/api/*/users
,但这不会匹配任何路由。我没有尝试过,但我假设它只是将 * 解释为 url 的实际部分。我目前的解决方法是匹配 /ui/api/**
,然后将 **/Foo
添加到 zuul.ignoredPatterns。这可行,但不是最理想的,因为我需要不转发的任何新端点都需要在此处添加。由于客户端要在各种项目中使用,因此转发的路由不会改变,但不应该改变的路由会改变。这不是每个项目都可以配置的,因此不是一个可行的解决方案。
我的 application.properties 的相关部分如下所示:
zuul.ignoredPatterns = /**/login,/**/executeJobUrl,/**/createExecuteJobUrl
zuul.routes.user-manager.path = /ui/api/**
zuul.routes.user-manager.url = http://localhost:0/eis-user-manager/ui/api
zuul.routes.user-manager.stripPrefix = true
我有一些使用部分通配符的路由,作为与您描述的类似问题的解决方案。我无法使用 /api/**/v1.1/user**
之类的路径,但 /api/*admin/v1.1/user**
可以正常工作。我得出结论,光是通配符就太贪心了...
唯一的问题是您需要将服务命名为 "somecompanyadmin"、"msadmin" 和 "someothercompanyadmin" 而不是 "somecompany"、"ms" 和 "someothercompany"...
这是适用于我的情况的示例配置:
zuul:
routes:
mock:
path: /v1.1/**
url: https://myserver:6154/v1.1
users:
path: /api/*admin/v1.1/user**
serviceId: user_server
stripPrefix: true
permission:
path: /api/*admin/v1.1/permission/**
serviceId: permission_server
stripPrefix: true
可行的解决方案是在模式中使用 **
。
所以它会是
/ui/api/**/users
我的想法来自 here。
还要感谢 Alex Eggers 的测试和建议做出回答。
我正在构建一个多租户应用程序,其中租户名称包含在每个 url 中。例如,检索租户 "Test" 的所有当前用户的路由如下所示:/ui/api/Test/users
。我目前正在处理的应用程序部分是一个客户端,它将它支持的任何其他应用程序的请求转发到我的数据库服务,允许客户端充当中间人。
你大概能看出这是怎么回事。我正在使用 Zuul 转发我的路由,但并非所有路由都应以这种方式转发。有时,前端会发送以 /ui/api/
开头的不是数据库请求的请求。假设其中一个看起来像这样:/ui/api/Test/Foo
。我希望能够以这样一种方式配置我的 Zuul 路由,即我可以转发任何符合模式 /ui/api/*/users
(其中 * 是任何字符串)的 url,而不转发任何其他路由。
我当然尝试过简单地使用 /ui/api/*/users
,但这不会匹配任何路由。我没有尝试过,但我假设它只是将 * 解释为 url 的实际部分。我目前的解决方法是匹配 /ui/api/**
,然后将 **/Foo
添加到 zuul.ignoredPatterns。这可行,但不是最理想的,因为我需要不转发的任何新端点都需要在此处添加。由于客户端要在各种项目中使用,因此转发的路由不会改变,但不应该改变的路由会改变。这不是每个项目都可以配置的,因此不是一个可行的解决方案。
我的 application.properties 的相关部分如下所示:
zuul.ignoredPatterns = /**/login,/**/executeJobUrl,/**/createExecuteJobUrl
zuul.routes.user-manager.path = /ui/api/**
zuul.routes.user-manager.url = http://localhost:0/eis-user-manager/ui/api
zuul.routes.user-manager.stripPrefix = true
我有一些使用部分通配符的路由,作为与您描述的类似问题的解决方案。我无法使用 /api/**/v1.1/user**
之类的路径,但 /api/*admin/v1.1/user**
可以正常工作。我得出结论,光是通配符就太贪心了...
唯一的问题是您需要将服务命名为 "somecompanyadmin"、"msadmin" 和 "someothercompanyadmin" 而不是 "somecompany"、"ms" 和 "someothercompany"...
这是适用于我的情况的示例配置:
zuul:
routes:
mock:
path: /v1.1/**
url: https://myserver:6154/v1.1
users:
path: /api/*admin/v1.1/user**
serviceId: user_server
stripPrefix: true
permission:
path: /api/*admin/v1.1/permission/**
serviceId: permission_server
stripPrefix: true
可行的解决方案是在模式中使用 **
。
所以它会是
/ui/api/**/users
我的想法来自 here。 还要感谢 Alex Eggers 的测试和建议做出回答。