当前位置: 首页 > 知识库问答 >
问题:

基于严格匹配的spring zuul路径匹配

山疏珂
2023-03-14

摘要:ZUUL没有为输入路径选择正确的目标url,因为它没有严格匹配输入路径。

以下是我的zuul路线:

zuul:
  routes: 
    auth:
      path: /v1/txn/**
      url: http://localhost:8900/v1/cardhostauth
    cardproduct: 
      path: /v1/customer/card/product/**
      url: http://localhost:8800/v1/customer/card/product
    cardcomposite:
      path: /v1/customer/**
      url: http://localhost:8400/v1/composite

对于输入路径:"/v1/顾客/卡片/产品/",它应该选择-http://localhost:8800/v1/customer/card/product但它选择http://localhost:8400/v1/composite.我的期望是路径模式匹配按照指定的顺序发生,并且更严格,但似乎不是这样工作的。

当您为类似的输入路径定义了多个路由时,您能让我知道ZUUL是如何工作的吗?

谢谢

另外,当我在AWS中通过Docker运行时,我可以看到这个问题,但当我从eclipse运行时,这个问题没有出现。zuul路线的顺序是否取决于spring zuul jar(spring cloud starter netflix zuul-2.0.0.RELEASE vs 2.0.1.RELEASE)

共有3个答案

梁新觉
2023-03-14

我从两年前开始与zuul合作,我认为与zuul routes合作的最佳方法是与一些发现服务合作,例如注册您的应用程序的Eureka服务。

所以你只需要添加service-id

zuul:
  routes:
    auth: 
      path: /v1/txn/**
      service-id: txn-service
      strip-prefix: false
      sensitiveHeaders:
    cardproduct:
      path: /v1/customer/card/product/**
      service-id: card-service   // here you need to put application name .
      strip-prefix: false
      sensitiveHeaders:
    cardcomposite:
      path: /v1/customer/**
      service-id: customer-service
      strip-prefix: false
      sensitiveHeaders:
昝枫
2023-03-14

根据Zuul的官方文件编辑答案:https://cloud.spring.io/spring-cloud-netflix/multi/multi__router_and_filter_zuul.html

如果需要保留路由的顺序,则需要使用YAML文件,因为使用属性文件时会丢失顺序。以下示例显示了这样一个YAML文件:

application.yml.

 zuul:
  routes:
    users:
      path: /myusers/**
    legacy:
      path: /**

如果要使用属性文件,遗留路径可能会位于用户路径前面,从而使用户路径无法访问。

确保您使用的是最新稳定版本的Spring Cloud(目前为2.0.2)

司徒泰
2023-03-14

对于根据最佳匹配选择路由,我发现这个线程很有帮助(感谢@最大化)。基本上,你可以编写自己的自定义路由器来选择最佳匹配路由。

https://github.com/spring-cloud/spring-cloud-netflix/issues/2408

希望这能有所帮助。(因为这是我的第一个答案,如果不是一个好答案,我很抱歉。)

github线程中的一个示例如下:

public class CustomRouteLocator extends SimpleRouteLocator {
    public CustomRouteLocator(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
    }

    @Override
    protected ZuulRoute getZuulRoute(String adjustedPath) {
        // Spring's AbstractUrlHandlerMapping already found best matching path for us
        // and stored it into request attribute. See AbstractUrlHandlerMapping.exposePathWithinMapping
        RequestContext ctx = RequestContext.getCurrentContext();
        String bestMatchingPattern = (String)ctx.getRequest().getAttribute(HandlerMapping.class.getName() + ".bestMatchingPattern");
        if (bestMatchingPattern == null) {
            return super.getZuulRoute(adjustedPath);
        }

        if (!matchesIgnoredPatterns(adjustedPath)) {
            return locateRoutes().get(bestMatchingPattern);
        }
        return null;
    }
}

@Maxdim:

我没有复制逻辑来找到“最佳匹配”,而是简单地从请求属性中获取它,Spring的处理器映射保存了它。也许有点奇怪,但似乎对我有用。

 类似资料:
  • 这些配置允许你对许多与URL映射和路径匹配有关的设置进行定制。关于所有可用的配置选项,请参考PathMatchConfigurer类的API文档。 下面是采用MVC Java编程配置的一段代码: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter {

  • 我花了很多时间试图找出如何编写符合我需求的json路径,但没有成功。我希望有人能帮助我。 我有一个非常简单的JSON对象,看起来像:,请注意,这不是对象列表 我正在尝试查找一个JSON路径,该路径在编写代码时返回[%code%] 我找到了<代码>$[?( @.代码 遗憾的是,我正在做的项目使用了带有Goessner实现的jsonpath库。有人知道jsonpath可以用于任何实现吗? 谢谢

  • 两个问题~ 问题1 nginx.conf 怎么写才能让 localhost:8001 下的任意路径都进入到index.html? localhost:8001/ localhost:8001/a localhost:8001/a/b 问题2 以下是 Nginx 下的文件结构 需要访问 localhost:8001/home, 进入到 /example/pages/home.html, 应该怎么配置

  • 我正在将我的应用程序从webphere迁移到jboss EAP 7.1.0,但我收到了以下错误。 错误:

  • wiremock如何将URL路径模式与编码的URL精确匹配?是否需要使用已编码的URL保存映射?这是我试了几个小时,却没能成功的方法。 无线映射 我已经尝试过使用编码URL的不同变体,例如/Systems XYZ(ABC)/2016.10/aaa/bbb/api/ccc/customers/*甚至在映射中对(和)进行URL编码,但我的请求似乎不匹配 我试图针对wiremock/Systems XY

  • 路由拥有三个属性来决定是否“匹配“一个 URL: 嵌套关系 和 它的 路径语法 它的 优先级 嵌套关系 React Router 使用路由嵌套的概念来让你定义 view 的嵌套集合,当一个给定的 URL 被调用时,整个集合中(命中的部分)都会被渲染。嵌套路由被描述成一种树形结构。React Router 会深度优先遍历整个路由配置来寻找一个与给定的 URL 相匹配的路由。 路径语法 路由路径是匹配