SpringCloud之Zuul

在SpringCloud基础的第5章节中介绍过SpringCloud的Zuul的使用。Zuul的原理是什么?本文将结合源码进行详细解释。


在前文介绍Zuul的使用时,有以下几个步骤:

  • 在入口类上开启@EnableZuulProxy注解。
  • 在配置文件中创建请求地址和服务名的映射。
  • 创建一个过滤器类,继承ZuulFilter,来对转发的请求进行统一处理,如权限校验。

Zuul执行流程

ZuulServlet

ZuulController 是请求的入口,它继承于ServletWrappingController。先看下这两个类的核心逻辑:
SpringCloud之Zuul_第1张图片
ServletWrappingController:
SpringCloud之Zuul_第2张图片
可以看到,在ZuulController中,先初始化了一个ZuulServlet,然后通过handleRequestInternal调用ZuulServlet的service函数。
继续查看ZuulServlet的service函数:
SpringCloud之Zuul_第3张图片
在ZuulServlet中,依次执行initpreRouteroutepostRoute。而这些函数均通过ZuulRunner来执行:
SpringCloud之Zuul_第4张图片
通过以上分析,可以得出结论,zuul请求经过ZuulServlet进行分发,依次执行相应的过滤器。工作流程如下所示:
SpringCloud之Zuul_第5张图片

ZuulFilter

查看ZuulRunner的代码可以看到,preRoute,route和postRoute均是通过FilterProcessor来完成的。通过FilterLoader加载对应类型的过滤器并执行。
系统内置的主要ZuulFilter过滤器如下:

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

自定义过滤器

除内置过滤器外,还可以自定义过滤器,用于对请求进行一些通用处理,如权限校验。
自定义过滤器需要继承ZuulFilter类,复写四个方法:filterTypeshouleFilterfilterOrderrun,依次表示过滤器类型,过滤器开关,过滤器执行顺序号,过滤器实际逻辑。

具体例子可见SpringCloud基础的第5章节。

参考资料

[1].https://blog.csdn.net/u014494148/article/details/113246142

你可能感兴趣的:(后端框架,SpringCloud)