网关zuul的执行流程

自定义路由

既然是网关那么就一定要有路由,那么在zuul中怎么设置我们自定义的路由呢,下面介绍下,通过bean设置路由。

public class CustomRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator{

	//刷新路由
    @Override
    public void refresh(){
        this.routes.set(this.locateRoutes());
    }
    
    //返回路由
    @Override
    protected Map<String, ZuulRoute> locateRoutes() {
        return null;
    }
}

先创建一个实现SimpleRouteLocator的Bean,比如我们定义一个CustomRouteLocator继承了SimpleRouteLocator。这个CustomRouteLocator里面需要做哪些事。
首先重写2个方法分别是refresh,locateRoutes这2个方法做了什么事情。

  • refresh是刷新路由,这个我们直接调用父类的refresh就可以了。
  • locateRoutes方法是设置路由的,返回值就是Map<String, ZuulRoute>,这个方法可以做很多事,目的就是为了拿到要映射的路由,那么我们可以有很多种实现配置路由,
    比如在配置中心配置路由或者在数据库里面配置,然后在locateRoutes去封装好,只要返回封装好的Map就可以了。

ZuulConfiguration主要启动类

1、创建@Bean ZuulController

2、创建@Bean ZuulHandlerMapping,调用ZuulServlet的init方法,来创建一个ZuulRunner
3、执行ZuulProxyConfiguration 因为ZuulProxyConfiguration extends ZuulConfiguration
ZuulProxyConfiguration有一个ApplicationListener事件监听器。启动的时候,会注册好几个事件监听器。每个事件类型会有一个refresh方法,这个方法会刷新所有映射关系的route,当我们有数据更行的时候,也可以通过这个方法来刷新路由

开始请求

1、进入ZuulController的handleRequest方法
2、调用ZuulServlet的service方法里面会执行
ZuulServlet.init ->ZuulRunner.init
ZuulServlet.preRoute ->ZuulRunner.preRoute
ZuulServlet.route ->ZuulRunner.route
ZuulServlet.postRoute ->ZuulRunner.postRoute
其实主要逻辑还是要看ZuulRunner

ZuulRunner

上面的preRoute,route,postRoute方法会做哪些事情,里面都会得到FilterProcessor的实例,然后调用实例的preRoute,route,postRoute方法。其实ZuulRunner只是一个中转,具体还是看FilterProcessor做了什么事情。

FilterProcessor

FilterProcessor的preRoute,route,postRoute方法都会调用FilterProcessor的runFilters方法来得到ZuulFilter只不过参数不一样的,通过Type(“pre”,“route”,“post”)三种类型来得到对应的ZuulFilter每个类型会有十多个Filter(为什么需要这么多Filter)
所有的Filter都在最后列出来了。

ZuulFilter这么多怎么知道先执行哪个后执行哪个。还有每个ZuulFilter做什么业务逻辑在哪里看。
ZuulFilter里面有三个重要的方法,run方法执行具体的业务逻辑,order方法用来设置Filter的执行顺序,type方法返回这个Filter所对应的类型pre,route,post
其实FilterProcessor得到那么多ZuulFilter都是为了执行ZuulFilter的run方法来对请求做处理。到这里流程就已经结束了。

下面介绍下三种类型所对应的ZuulFilter

类型过滤器描述顺序
preServletDetectionFilter在pre过滤器中,ServletDetectionFilter是第一个执行的过滤器,检测请求是用 DispatcherServlet还是 ZuulServlet,将结果设置到RequestContext中-3
preServlet30WrapperFilter主要是将原始请求进行包装,将原始的HttpServletRequest请求包装成Servlet30RequestWrapper类型-2
preFormBodyWrapperFilter同Servlet30RequestWrapper一样,也是对请求的一个包装,只不过他只包装表单数据,即:content-type中必须带有“application/x-www-form-urlencoded”或“multipart/form-data”-1
errorSendErrorFilter这个是用来发送错误的Filter0
preDebugFilter设置请求过程是否开启debug,将当前请求上下文中的debugRouting和debugRequest参数设置为true1
prePreDecorationFilter基本的路由转发配置,根据uri调用哪一个route过滤器5
routeRibbonRoutingFilter服务路由的过滤器,使用用Ribbon 做负载均衡,hystrix做熔断10
routeSimpleHostRoutingFilter简单主机路由过滤器,如果使用url路由,则用这个过滤器100
routeSendForwardFilter它使用RequestDispatcher转发请求500
postSendResponseFilterSendResponseFilter是Zuul的最后一个Filter,负责最终响应结果的输出。1000

转至https://blog.csdn.net/u014494148/article/details/113246142

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值