是否可以配置Zuul路由以匹配通配符?

时间:2019-02-12 13:26:13

标签: java spring multi-tenant netflix-zuul

我正在构建一个多租户应用程序,其中每个URL中都包含租户名称。例如,用于检索租户“测试”的所有当前用户的路由如下所示:/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

2 个答案:

答案 0 :(得分:1)

我有一些使用部分通配符的路由,可以解决您所描述的类似问题。我找不到像/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

答案 1 :(得分:1)

有效的解决方案是在模式中使用**。 就是

 /ui/api/**/users

我从here那里得到了这个主意。 还应感谢Alex Eggers进行测试并提出答案。