【问题标题】:Zuul routes priority higher than Spring ControllersZuul 路由优先级高于 Spring Controller
【发布时间】:2019-03-16 18:40:14
【问题描述】:

我的 api 网关服务中有控制器:

@GetMapping("/test")

而且我的一条路线有相同的端点。

当我调用 /test 时,我的请求被路由,如何提高 Spring 控制器的优先级超过 zuul 路由?

【问题讨论】:

    标签: java spring spring-cloud netflix-zuul api-gateway


    【解决方案1】:

    您可以在路径前使用 forward 向控制器添加路由,例如:

     zuul:
      routes:
        controller:
          path: /test
          url: forward:/test
        other:
          ...
    

    并将其放在您的其他路由定义之前,如果是 YAML 文件,它将保留一个订单。

    http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_strangulation_patterns_and_local_forwards

    我没有测试上面的例子,但我使用了一个类似的解决方案,它工作正常。

    【讨论】:

    • 如果我的网关中没有端点,我希望它被路由,但它会使用这个配置循环。
    • 这两个端点内部和外部的路径有什么区别吗?或者两者都只是/test,而您总是希望被定向到内部?
    • 两者都只是/test,我想使用内部而不是外部,就像它默认工作一样
    • 我已经更新了一个示例,我认为将forward:/test 路由放在外部路由前面就足够了。但是,基本思想仍然是使用forward 关键字将流量路由到网关内部定义的控制器。
    【解决方案2】:

    您可以使用 BeanPostProcessor 来减少 ZuulHandlerMapping 的顺序。默认为 -200

    @Configuration
    public class MvcConfig extends WebMvcConfigurerAdapter {
    
        @Bean
        public ZuulBeanPostProcessor postBean() {
            return new ZuulBeanPostProcessor();
        }
    
     
        public static class ZuulBeanPostProcessor implements BeanPostProcessor {
    
            @Override
            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                return bean;
            }
    
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof ZuulHandlerMapping) {
                    ((ZuulHandlerMapping) bean).setOrder(10);
                }
                return bean;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2016-08-04
      • 1970-01-01
      相关资源
      最近更新 更多