目录
1 启动配置项
1.1 @EnableZuulProxy

作为zuul网关,需要配置@EnableZuulProxy注解,这个注解表明,嵌入该注解的类将自动成为 Zuul 服务器的入口。当然这个注解还有着其他的非常强大的功能,我们可以基于此注解来使用 Zuul 中的各种内置过滤器实现复杂的服务路由。此注解,由
@Import({ZuulProxyMarkerConfiguration.class})修饰。
1.2 @Import({ZuulProxyMarkerConfiguration.class})



可以发现,ZuulProxyAutoConfiguration
是通过ZuulProxyMarkerConfiguration 中 Marker 类是否存在,当做是否进行自动装配的开关。
1.3 ZuulProxyAutoConfiguration
ZuulProxyAutoConfiguration生效原理:
SpringBoot自动装配,启动的时候要加载大量的spring.factories文件,并扫描获得EnableAutoConfiguration的值,其中就包含ZuulServerAutoConfiguration
以及ZuulProxyAutoConfiguration。ZuulProxyAutoConfiguration继承自ZuulServerAutoConfiguration。这两个配置都有共同点,使用@ConditionalOnBean({Marker.class})注解修饰。前者ZuulProxyMarkerConfiguration.Marker的创建来源于@EnableZuulProxy注解, 后者ZuulServerMarkerConfiguration.Marker的创建来源于@EnableZuulServer注解。




1.3.1(延伸)@EnableZuulServer、@EnableZuulProxy两个注解的区别
@EnableZuulServer - 普通Zuul Server,只支持基本的route与filter功能.
@EnableZuulProxy - 普通Zuul Server+服务发现与熔断等功能的增强版,具有反向代理功能.
@EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka、Ribbon等组件配合使用时,我们使用@EnableZuulProxy。
2 ZuulServlet创建
2.1 ZuulServlet作用
1.ZuulServlet - 处理请求(调度不同阶段的filters,处理异常等)
ZuulServlet类似SpringMvc的DispatcherServlet,所有的Request都要经过ZuulServlet的处理。三个核心的方法preRoute(),route(), postRoute(),zuul对request处理逻辑都在这三个方法里。
2.作为激活ZuulServerAutoConfiguration创建的前提条件

3.作为ZuulController创建的前提条件


2.2 ZuulServlet初始化
在项目启动阶段,会完成ZuulServlet的初始化,并调用init方法,此方法中,包含了对ZuulRunner的初始化。zuul对request处理会交给ZuulRunner去执行。由于ZuulServlet是单例,因此ZuulRunner也仅有一个实例。

3.Zuul filter的初始化
3.1:filterRegistry的初始化
在ZuulServerAutoConfiguration配置类内部,包含了
ZuulFilter的配置项,该配置项,内部注入了map类型的filters,
业务自己定义的filter只要交给spring托管, 就可以加载进来,并成为map容器的元素,key为ZuulFilter的bean的名字,值为对应的ZuulFilter。该配置项,在内部定义了ZuulFilterInitializer这个bean,在启动的时候,会完成FilterRegistry、FilterLoader以及ZuulFilterInitializer的初始化。

3.2:Zuul filter初始化到内存
在ZuulFilterInitializer类的内部,有@PostConstruct注解修饰的contextInitialized方法,该方法会在上述private Map<String, ZuulFilter> filters 依赖注入完成后调用。方法内部,遍历了所有的ZuulFilter,并将其放在了单例FilterRegistry内部维护的
ConcurrentHashMap容器中。



3.2.1(延伸)Zuul组件实现动态过滤
上述Zuul filter初始化到内存的方式,是常规的初始化方式,Zuul设计的初衷是ZuulFilter是存放在Groovy文件中,可以实现基于最后修改时间进行热加载。即可以让服务在不停机的情况下,对过滤的条件进行变更。即动态过滤功能。
。使用示例如下:
1.将过滤器的java文件,放置到指定的一个文件夹:(C:\Users\Lenovo\Desktop\custom-zuul-filter)
2.由于动态路由是基于文件扫描的机制,所以需要手动去启用。如下是基于服务启动后去做的这个事情。

3.若要更新文件内容,可以直接对指定文件进行修改,然后丢回到指定目录(C:\Users\Lenovo\Desktop\custom-zuul-filter)即可。添加过滤器也是采用类似的方式。
3.2.2 Zuul组件实现动态过滤原理概述
1.总的来说是通过通过FilterFileManager来对过滤器进行扫描以及加载,如下是FilterFileManager的结构,在调用init方法时,会调用manageFiles方法。
<

本文详细解析了ZuulGateway的启动配置项,包括`@EnableZuulProxy`和`@EnableZuulServer`的区别,ZuulServlet的作用与初始化,以及Zuulfilter的初始化过程,特别是动态过滤器的实现和请求处理流程,包括前置、路由、error和后置过滤器的详细介绍。
最低0.47元/天 解锁文章
765

被折叠的 条评论
为什么被折叠?



