龙空技术网

我23岁那年才搞懂微服务网关Zuul的主要工作原理,我真的落伍了吗

程序员高级码农II 652

前言:

今天我们对“网关的基本工作原理”都比较关怀,兄弟们都想要剖析一些“网关的基本工作原理”的相关资讯。那么小编在网络上收集了一些对于“网关的基本工作原理””的相关知识,希望大家能喜欢,你们一起来了解一下吧!

上文给大家介绍的内容是微服务网关:Spring Cloud Zuul网关,那么本文给大家介绍的是Zuul的主要工作原理,大家快来学习吧!!

Zuul的主要工作原理

Zuul对HTTP请求的处理核心就是ZuulServlet类,而ZuulServlet本质上是符合Java EE规范的Servlet实现类。Zuul的核心处理逻辑由一系列Filter组成,而这些Filter全部封装在ZuulServlet类的Runner中 , Runner 在 接 收 到 HTTP 请 求 后 会 依 次 调 用 ZuulFilter , 而ZuulFilter则是Zuul在初始化时加载到FilterProcessor的Filter实例。

ZuulFilter机制

Zuul最主要的工作机制是基于ZuulFilter的链式调用请求机制,ZuulFilter之间没有直接的通信,它们之间通过一个RequestContext静态类来进行数据传递。RequestContext类中通过ThreadLocal变量来记录每个Request所需要传递的数据。ZuulFilter可以使用Java或者Groovy动态代码实现,同时使用Filter Loader的动态文件夹轮询扫描功能,可以将ZuulFilter动态加载到FilterProcessor中,实现动态Filter功能。下图是Zuul的一个整体架构图。

ZuulServlet 是 处 理 HTTP 请 求 的 核 心 类 , 它 被 嵌 入 SpringDispatch 机 制 中 , 从 请 求 调 用 栈 中 可 以 发 现 它 由 SpringDispatchServlet处理,代码如下:

Zuul路由机制

Zuul的核心工作原理主要有两部分:一部分就是上面讲的根据Zuul的Filter链式调用机制完成HTTP请求的Pre、Route、Post阶段的请求拦截和处理;另一部分是Zuul提供的路由机制,它可以实现根据HTTP请求到ZuulServlet的路由匹配映射,而路由匹配映射的工作主要是通过ZuulHandlerMapping模块完成的,在构造ZuulHandlerMapping时传入的RouteLocator是CompositeRouteLocator。

ZuulHandlerMapping代码如下:

从 代 码 中 我 们 可 以 看 到 , ZuulHandlerMapping 继 承 了AbstractUrlHandlerMapping,Zuul的路由匹配使用了Spring MVC的映射功能。ZuulHandlerMapping复写了父类的lookupHandler方法。它的目的是将HTTP URL请求映射到对应的Controller,并将这个映射关系注册到Spring MVC中。如下图所示是ZuulHandlerMapping的类结构。

在ZuulHandlerMapping类的registerHandlers方法中,它将调用routeLocator.getRoutes方法注册所有路由对象。其中routeLocator的 实 现 有 三 种, 分 别 是 SimpleRouteLocator、DiscoveryClientRouteLocator 、 DiscoveryClientRouteLocator 。 这三种RouteLocator最终都会由CompositeRouteLocator聚合统一管理,同 时 这 些 Route 的 处 理 类 会 设 置 为 ZuulController 。 下 面 看 一 下ZuulController的源码实现。

查看ZuulController的父类ServletWrappingController的源码,它将请求都交给ZuulServlet来处理。由此可知,Zuul是如何将Route信 息 中 配 置 的 路 由 信 息 映 射 到 ZuulController , 而 后 由ZuulController委托给ZuulServlet来处理的。

最后,让我们梳理一下Zuul对HTTP请求的核心路由逻辑和Filter处理步骤:

(1)DispatcherServlet的doDispatch是HTTP请求的入口,通过AbstractHandlerMapping的getHandlerInternal方法找到对应的处理类,然后getHandlerInternal会调用lookupHandler方法。

(2)ZuulHandlerMapping覆写了抽象类AbstractHandlerMapping的 lookupHandler 方 法 , 而 registerHandlers 方 法 遍 历CompositeRouteLocator完成URL与对应的ZuulRoute映射规则的加载。

(3)在lookupHandler方法中首先判断urlPath是否被忽略,如果被忽略则返回null。

(4)判断路由规则有没有加载过或者更新过,如果没有加载或者更新,则重新加载。

( 5 ) ZuulHandlerMapping 注 册 处 理 器 的 时 候 使 用 的 是ZuulController,也就说Zuul的所有请求对应的路由规则公共处理器都是ZuulController。最终这个处理器会将请求委托给ZuulServlet来处理,然后经过Zuul定义的和自定义的拦截器执行具体请求处理逻辑。

本文给大家讲解的内容是微服务网关:Zuul的主要工作原理下篇文章给大家讲解的内容是微服务网关:Zuul的插件机制及定制化开发觉得文章不错的朋友可以转发此文关注小编;感谢大家的支持!

不好意思哈,小编最近有点忙,大伙监督我更文哈,如果我忘记更文了记得私信告诉我!

标签: #网关的基本工作原理 #网关的基本工作原理是