zuul源码解析

zuul——springcloud的网关。如果看过我之前的博客,可以知道feign的坑是比较多的,但是网关这块做的是比较好的,不管是性能还是灵活性。

一、网关的作用:

       ①路由

       ②利用filter可以实现限流(也可以使用ratelimit),鉴权,验签,黑白名单,对请求处理等等。

二、zuul源码及其工作流程:

我们首先从开启网关注解进行跟踪——@EnableZuulProxy,点进去可以看到如下所示:

zuul源码解析_第1张图片

@Import注解引用了ZuulProxyConfiguration,点进去看起了什么作用

zuul源码解析_第2张图片

首先是开头又有一个@Import根据名字可以知道是负载均衡用的配置,从这里我们可以知道2点:1、zuul支持负载均衡。2、zuul路由转发请求用的还是http(restclient、okhttp、httpclient)。同时它继承了一个父类ZuulConfiguration,看看它做了什么。

zuul源码解析_第3张图片

注册一个zuulservlet,这个是zuul的核心类,点进去看看做了什么

zuul源码解析_第4张图片

记得开头说的zuul的路由和各种自定义功能都是通过filter实现的么?这里就是加载各种filter。回到ZuulConfiguration继续看

zuul源码解析_第5张图片

除了实例化zuulservlet以外,还加载了zuul默认过滤器。

zuul源码解析_第6张图片

实例化了servlet、加载了默认过滤器,那么如果是你接下来会做什么?zuul接下来做的是初始化——加载用户自定义过滤器。

==================== 以上是zuul总体流程,接下来讲具体路由是怎么路由,过滤怎么加载的 ===================

(一)路由

我们回到ZuulProxyConfiguration类,可以看到

zuul源码解析_第7张图片

其实zuul的路由功能也是用filter实现,点进去看看

zuul源码解析_第8张图片

另外,这里提一下feign之所以会丢失cookie是因为默认用线程池所以header会丢失,但是在上图里zuul对header进行重装buildZuulRequestHeaders,要注意如果zuul的敏感词汇没有开启,header还是会被过滤!

execute方法再进去就是调用hystrix进行转发,所以zuul是启用hystrix的。

(二)过滤器加载

刚刚讲到在ZuulConfiguration的静态内部类ZuulFilterConfiguration加载自定义的filter,再截一次图,省的大家再翻上去找:

zuul源码解析_第9张图片

点ZuulFilterInitializer进去看看

zuul源码解析_第10张图片

所有的filter都放到filterregidtry里,看看这个仓库是用什么写的

zuul源码解析_第11张图片

知道了怎么存储的,现在就去找找怎么从这个仓库拿出来加载的,追踪filterregister被那些类引用,可以发现被filterload引用,跟进去看看!

zuul源码解析_第12张图片

根据注解,好像是说会读取zuulFilter源码,并且把自定义filter加入,那就看看哪个类会引用到它吧!

zuul源码解析_第13张图片

由filtermanage引用,至此我们自定义的过滤器被加载到map里,上文说到有请求到servlet,会去执行这些过滤器,具体核心代码为

zuul源码解析_第14张图片

总结:一开始阅读时候我感觉我掉进了一个大海,但是我一直记得以前老程序员对我说的,当你周围都是黑暗时候,不要去看黑暗本身,要看到黑暗的缝里照进来的光。谢谢

你可能感兴趣的:(java,软件)