原理分析之如何路由

    上图就是zuul提供的默认过滤器,可在org.springframework.cloud.netflix.zuul.filters下查看。

    zuul的过滤器顺序值小的优先执行,其中的是我们重点关注的类,由它来决定路由转发去向。

    打开PreDecorationFilter类,看到类注释有一句话:that determines where and how to route based on the supplied

    翻译过来就是说,决定从哪里获取路由,然后怎样去路由。

    Route route = this.routeLocator.getMatchingRoute(requestURI);

    这句代码很重要,表示路由从哪里获取,如果我们能够重写getMatchingRoute方法那就可以返回自己定义的路由了。

    接下来找到RouteLocator类的定义,发现是通过构造方法传进来的,那么我们就去找使用构造方法的类。(IDEA下右键构造方法—Find Usage)

    在org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration类中找到了定义

    同时方法上用了@ConditionalOnMissingBean注解,表示如果其它地方没有声明,则默认使用这个。

    因此我们可以自己声明一个PreDecorationFilter,然后注入自定义的RouteLocator就行了。

    SOP自定义的RouteLocator为:com.gitee.sop.gatewaycommon.zuul.route.SopRouteLocator,可自行前往查看。

    然后再我们的Config中定义:

    1. /**
    2. * @param zuulRouteRepository
    3. * @return
    4. */
    5. @Bean
    6. RouteLocator routeLocator = new SopRouteLocator(zuulRouteRepository);
    7. return new PreDecorationFilter(routeLocator,
    8. this.server.getServlet().getContextPath(),
    9. this.zuulProperties,
    10. }