Zuul 路由优先级高于 Spring Controller
Posted
技术标签:
【中文标题】Zuul 路由优先级高于 Spring Controller【英文标题】:Zuul routes priority higher than Spring Controllers 【发布时间】:2019-03-16 18:40:14 【问题描述】:我的 api 网关服务中有控制器:
@GetMapping("/test")
而且我的一条路线有相同的端点。
当我调用 /test 时,我的请求被路由,如何提高 Spring 控制器的优先级超过 zuul 路由?
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于Zuul 路由优先级高于 Spring Controller的主要内容,如果未能解决你的问题,请参考以下文章
跟我学Spring Cloud(Finchley版)-17-Zuul路由配置详解
Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置