zuul——springcloud的网关。如果看过我之前的博客,可以知道feign的坑是比较多的,但是网关这块做的是比较好的,不管是性能还是灵活性。
一、网关的作用:
①路由
②利用filter可以实现限流(也可以使用ratelimit),鉴权,验签,黑白名单,对请求处理等等。
二、zuul源码及其工作流程:
我们首先从开启网关注解进行跟踪——@EnableZuulProxy,点进去可以看到如下所示:
@Import注解引用了ZuulProxyConfiguration,点进去看起了什么作用
首先是开头又有一个@Import根据名字可以知道是负载均衡用的配置,从这里我们可以知道2点:1、zuul支持负载均衡。2、zuul路由转发请求用的还是http(restclient、okhttp、httpclient)。同时它继承了一个父类ZuulConfiguration,看看它做了什么。
注册一个zuulservlet,这个是zuul的核心类,点进去看看做了什么
记得开头说的zuul的路由和各种自定义功能都是通过filter实现的么?这里就是加载各种filter。回到ZuulConfiguration继续看
除了实例化zuulservlet以外,还加载了zuul默认过滤器。
实例化了servlet、加载了默认过滤器,那么如果是你接下来会做什么?zuul接下来做的是初始化——加载用户自定义过滤器。
==================== 以上是zuul总体流程,接下来讲具体路由是怎么路由,过滤怎么加载的 ===================
(一)路由
我们回到ZuulProxyConfiguration类,可以看到
其实zuul的路由功能也是用filter实现,点进去看看
另外,这里提一下feign之所以会丢失cookie是因为默认用线程池所以header会丢失,但是在上图里zuul对header进行重装buildZuulRequestHeaders,要注意如果zuul的敏感词汇没有开启,header还是会被过滤!
execute方法再进去就是调用hystrix进行转发,所以zuul是启用hystrix的。
(二)过滤器加载
刚刚讲到在ZuulConfiguration的静态内部类ZuulFilterConfiguration加载自定义的filter,再截一次图,省的大家再翻上去找:
点ZuulFilterInitializer进去看看
所有的filter都放到filterregidtry里,看看这个仓库是用什么写的
知道了怎么存储的,现在就去找找怎么从这个仓库拿出来加载的,追踪filterregister被那些类引用,可以发现被filterload引用,跟进去看看!
根据注解,好像是说会读取zuulFilter源码,并且把自定义filter加入,那就看看哪个类会引用到它吧!
由filtermanage引用,至此我们自定义的过滤器被加载到map里,上文说到有请求到servlet,会去执行这些过滤器,具体核心代码为
总结:一开始阅读时候我感觉我掉进了一个大海,但是我一直记得以前老程序员对我说的,当你周围都是黑暗时候,不要去看黑暗本身,要看到黑暗的缝里照进来的光。谢谢