深入学习微服务网关Zuul源码解析,不来别后悔

2022-10-28 15:09:28 浏览数 (1)

本篇文章我们将学习微服务网关:Zuul源码解析的内容,大家要认真学了。

Zuul源码解析

从源码分层的角度,Spring Cloud Zuul可以分为两个部分:

Zuul-Core模块(ZuulServlet、FilterProcessor、ZuulFilter等)提供Zuul核心工作运行机制及对应的HTTP处理逻辑;spring-cloudnetflix-core(ZuulHandlerMapping、ZuulController等)是Spring部分的处理模块,负责把Zuul接入Spring Cloud体系。

Zuul的源码分析

Zuul应用开始于@EnableZuulProxy或@EnableZuulServer注解,所以一个不可缺少的步骤就是在启动程序中加入@EnableZuulProxy,代码如下:

其中,Zuul的自动化加载配置主要自动化加载如下两个配置类:

ZuulProxyMarkerConfiguration是一个标签类,通过自动配置类条件判断@ConditionalOnBean ( ZuulServerMarkerConfiguration.Marker.class)使Zuul的自动化配置加载类生效,代码如下:

ZuulProxyAutoConfiguration类完成Zuul自动装配功能,代码如下:

● Zuul中属性相关源码

● 重要Bean说明

○ ZuulController:接管所有的HTTP请求,将所有请求转交给ZuulServlet去处理。

○ ZuulRefreshListener:通过监听Spring Context发布机制事件,监听心跳消息。

○ CompositeRouteLocator:复合路由定位器,主要集成所有的路由定位器(如配置文件路由定位器、服务发现定位器、自定义路由定位器等)来定位路由。

○ SimpleRouteLocator:主要加载配置文件的路由规则。

○ RefreshableRouteLocator:路由刷新接口,实现此接口的路由定位器才能被刷新。

○ ZuulHandlerMapping :它 将 路 由 规 则 绑 定 到ZuulController上面。

● Zuul中默认Filter实现加载类

○ ServletDetectionFilter:它的作用是判断请求的来源,可以判断请求来自dispatcherServlet还是zuulServlet,并将判断结果存放到RequestContext中。

○ Servlet30WrapperFilter:它将原始请求进行包装,将原始的HttpServletRequest请求包装成Servlet30RequestWrapper类型。

○ FormBodyWrapperFilter:作用同Servlet30WrapperFilter一样,也是对请求的一个包装。

○ DebugFilter:用于动态开启Debug日志。

○ PreDecorationFilter:为当前请求做一些预处理,比如,进行路由规则的匹配、在请求上下文中设置该请求的基本信息及路由匹配结果的一些设置信息等,这些信息将是后续过滤器进行处理的重要依据。

○ RibbonRoutingFilter:通过Ribbon和Hystrix来向服务实例发起请求。

○ SimpleHostRoutingFilter:主要用来转发ServiceId(即非 Eureka 后 端 服 务 ) 为 空 的 路 由 消 息 , 它 直 接 使 用HttpClient来转发请求。

● RoutesEndpoint

在引入Spring Boot Actuator时会新增一个routes端点,可以通过/routes查询具体的路由信息。

● 底层Web容器替换

spring-boot-starter-web模块默认使用Tomcat作为内嵌容器,如果我们想要切换为Jetty或者UnderTow,只需要添加相应容器的依赖即可。我们以Jetty举例,添加如下Maven依赖:

内嵌容器由 EmbeddedServletContainerAutoConfiguration配置类决 定 :当 类 路 径 下 有 Jetty 等 类 时 , 它 将 会 注 入JettyEmbeddedServletContainerFactory。内嵌容器的自动配置源码如下:

本文给大家讲解的内容是微服务网关:Zuul源码解析

  1. 下篇文章给大家讲解的内容是负载均衡:负载均衡机制
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

0 人点赞