网站违规词处罚做网站的,做视频网站 带宽多少才合适,贵州省网站建设选哪家,福州网站设计网址Spring Cloud Zuul 底层是基于Servlet实现的#xff0c;核心是通过一系列的ZuulFilter来完成请求的转发。
1、核心组件注册
1.1. EnableZuulProxy注解
启用Zuul作为微服务网关#xff0c;需要在Application应用类加上EnableZuulProxy注解#xff0c;而该注解核心是利用Im…Spring Cloud Zuul 底层是基于Servlet实现的核心是通过一系列的ZuulFilter来完成请求的转发。
1、核心组件注册
1.1. EnableZuulProxy注解
启用Zuul作为微服务网关需要在Application应用类加上EnableZuulProxy注解而该注解核心是利用Import注解往Spring容器导入了ZuulProxyConfiguration配置类
1.2. ZuulProxyConfiguration
ZuulProxyConfiguration继承了ZuulConfiguration。
1.2.1. ZuulConfiguration
ZuulConfuguration主要是利用Import往Spring容器注入了ServerPropertiesAutoConfiguration配置类下一小节介绍并且作为配置类往Spring容器注入了CompositeRouteLocator、SimpleRouteLocator、ZuulController、ZuulHandlerMapping、ZuulServlet等组件基于Spring DispatcherServlet实现请求转发入口。 还有ServletDetectionFilter、Servlet30WrapperFilter、SendResponseFilter、SendErrorFilter、SendForwardFilter等pre、post类型的过滤器是Zuul实现路由转发的核心过滤器。 还有ZuulRefreshListener监听器同于监听应用内部事件设置路由信息状态为dirty实现动态更新。
1.2.2. ZuulProxyConfiguration
当然了ZuulProxyConfiguration本身也注入了实现路由转发的核心过滤器包含route类型的过滤器RibbonRoutingFilter、SimpleHostRoutingFilter。 还有路由定位器DiscoveryClientRouteLocator先调用父类SimpleRouteLocator获取配置文件中的路由配置然后再从注册中心中补充路由信息。 还有一个非常重要的ListenerZuulDiscoveryRefreshListener它实现了ApplicationListener接口主要监听InstanceRegisteredEvent、ParentHearbeatEvent和HeartbeatEvent根据注册中心发送的事件来更新最新的路由信息设置路由信息状态为dirty。
2、路由配置注册
上面已经提到Zuul是基于Servlet实现的而根据请求URL找到对应Handler是利用HandlerMapping完成的而Zuul也根据此实现了ZuulHandlerMapping实现类。
2.1. ZuulHandlerMapping
DispatcherServlet#initHandlerMappings
2.2. ZuulHandlerMapping#lookupHandler
在DispatcherServlet在首次请求分发时就会遍历所有HandlerMapping然后根据请求去获取对应的HandlerHandlerExecutionChain包含Handler和拦截器当遍历到ZuulHandlerMapping时会调用lookupHandler方法如果是首次调用会触发上面的registerHandlers方法进行路由配置注册。
2.3. ZuulHandlerMapping#registerHandlers
ZuulHandlerMapping首次根据url查找Handler时会先找到所有的路由配置然后遍历注册HandlerZuulController这里查找所有路由配置就是上面提到的DiscoveryClientRouteLocator。
3、请求处理
DispatcherServlet分发请求的流程 图片拿自网络 3.1. ZuulController
在2.3.中ZuulHandlerMapping给路由配置注册Handler时对应的Handler是ZuulController。ZuulController继承了ServletWrappingController底层是实现Controller接口。
3.2. SimpleControllerHandlerAdapter
根据上面流程图找到HandlerMapping后会继续找到能执行对应Handler的HandlerAdapter而上面也提到ZuulController是实现于Controller接口所以最后定位到的是SimpleControllerHandlerAdapter。 SimpleControllerAdapter执行请求逻辑非常简单就是执行Handler的handleRequest方法即执行ZuulController的handleRequest方法。
3.3. ZuulController#handleRequest
ZuulController的handleRequest很简单调用的是父类的handleRequestInternal方法。 但是我们需要注意ZuulController的构造函数里面给servletClass、servletName和supportedMethods赋值了其中servletClass尤为关键因为后续处理就是调用此类实例的方法。
3.4. ServletWrappingController
ServletWrappingController重写了InitializingBean#afterPropertiesSet方法在设置实例属性后根据servletClass实例化了servletInstance对象这里就是ZuulServlet的实例。 ServletWrappingController的handleRequestInternal方法也很简单就是调用servletInstance的service方法这里就是ZuulServlet#service方法。
3.5. ZuulServlet#service
ZuulServlet的service方法逻辑很简单都是利用ZuulRunner来完成的在ServletWrappingController实例化servletInstance时同时调用了servletInstance的init方法此时ZuulServlet同时会创建一个ZuulRunner实例。 service方法逻辑
执行ZuulRunner#init方法创建请求上下文RequestContext并将利用HttpServletRequestWrapper和HttpServletResponseWrapper分别将HttpServletRequest和HttpServletResponse包装起来。调用ZuulRunner#preRoute方法执行前置过滤器调用ZuulRunner#route方法执行路由过滤器调用ZuulRunner#postRoute方法执行后置过滤器如果步骤2到步骤4出现错误则执行ZuulRunner的error方法最后清理RequestContext内容ThreadLocal 3.6. ZuulRunner
ZuulRunner实现也是非常简单底层是利用FilterProcessor来实现的。
3.7. FilterProcessor
FilterProcessor执行过滤器的逻辑也非常简单就是根据过滤器类型找到所有的过滤器然后遍历调用processZuulFilter方法执行里面只要是执行ZuulFilter的runFilter方法并且对错误信息和成功信息做统计。
3.8. FilterLoader和FilterRegistry
FilterProcessor中是利用FilterLoader来完成过滤器的加载的而FilterLoader最终是利用FilterRegistry来完成过滤器的加载。 FilterLoader和FilterRegistry都是单例在ZuulFilterConfiguration中创建并注入到ZuulFilterInitializer中最后并将ZuulFilterInitializer注入到Spring容器中。 ZuulFilterInitializer实现了ServletContextListener接口在Spring容器完成初始化时会将ZuulFilter集合注入到FilterRregistry中。
4. 核心过滤器
这里只要分析核心过滤器不包含所有的过滤器。
4.1. 前置过滤器
4.1.1. ServletDetectionFilter
执行顺序为-3主要是区分请求是通过Spring的DispatcherServlet处理运行的还是ZuulServlet来处理运行的。
4.1.2. Servlet30WrapperFilter
执行顺序为-2主要是将HttpServletRequest包装成Servlet30RequestWrapper。
4.1.3. FormBodyWrapperFilter
执行顺序为-1条件要么是Context-Type为application/x-www-form-urlencoded的请求要么是Context-Type为multipart/form-data且是由String的DispatcherServlet处理的请求主要是将HttpServletRequest包装成FormBodyRequestWrapper。
4.1.4. DebugFilter
执行顺序为1条件要么配置里指定zuul.debug.request为true要么请求参数debug为true。主要用来将当前请求上下文中的debugRouting和debugRequest参数设置为true主要是做到灵活开关debug模式开启debug模式时会打印一些日志方便分析问题。
4.1.5. PreDecorationFilter
执行顺序为5条件要求请求上下文中不存在forward.do和serviceId参数主要是做一个预处理将相关信息存到上下文中包含路由、后置、错误过滤器的过滤条件判断信息。
4.2. 路由过滤器
4.2.1. RibbonRoutingFilter
执行顺序为10条件是请求上下文中routeHost为null并且serviceId不为null主要是构建Ribbon命令上下文并且发起请求转发。 在发起请求转发的时候需要构建HTTP客户端这里会根据配置和依赖来选用指定的HTTP客户端。
4.2.2. SimpleHostRoutingFilter
执行顺序为100条件是请求上下文中routeHost不为null主要是直接根据物理地址发送请求这里是直接调用原生的HttpClient包的客户端。 4.2.3. SendForwardFilter
执行顺序为500条件是请求上下文中forward.do不为null并且sendForwardFilter.ran为false主要是做本地转发。
4.3. 后置过滤器
4.3.1. SendResponseFilter
执行顺序为1000条件是请求上下文中异常为null并且响应头或响应体不为null主要是将响应写回给客户端。
4.4. 错误过滤器
4.4.1 SendErrorFilter
执行顺序为0条件是请求上下文中异常不为null并且sendErrorFilter.ran为false主要是将异常写回给客户端。