zuul是Netflix在其web端实现的统一入口。可以对所有的请求进行负载均衡,安全控制,限流等功能。
通俗来讲,zuul就是web项目中,所有web request都先要经过的一个过滤器。而zuul通过接收外部的请求,然后读取已经配置好的路由策略,负载策略,根据策略来转发相应的请求。
最近项目中在springcloud中用到了zuul,所以读了一下相关的源码。
zuul的架构:
我们根据一次完整请求的数据流向和上图来分析各个部分的实现细节。
-
ZuulServlet:Core Zuul servlet which intializes and orchestrates zuulFilter execution
ZuulServlet是初始化和编排zuul过滤器的核心。对应每一个web请求,初始化zuulRunner,创建一个RequestContext(继承ThreadLocal)
来存储当前请求的所有数据。然后执行pre,route,post,error类型的方法,对应调用zuulRunner的方法。
可以看到,ZuulRunner里边有FilterProcessor,就是这个家伙来调用filter的。
-
Filter相关
上图可以看到所有和filter相关的类。FilterProcessor直接被ZuulServlet调用,那么FilterProcessor调用的FilterLoader,FilterLoader调用了FilterRegistry类。
通过代码我们可以知道,这三个类都是单例的,因为每个类的INSTANCE都是static关键字限制的。
FilterRegistry类其实是所有的Filter实现类的一个容器,它内部有一个ConcurrentHashMap<String, ZuulFilter> filters来维护了所有的Filter。并向外提供了相应的增删查api。Springcloud通过该类将其体系下的所有filter添加到FilterRegistry。
FilterLoader相当于对FilterRegistry类进行了扩展,通过DynamicCodeCompiler提供了动态编织代码来添加的filter的功能,netflix提供的默认实现是 GroovyCompiler。
FilterProcessor就不用多说了,就是通过不同的filter type,来顺序执行filter
- 总结
总的来说,netflix 对zuul的实现主要是在filter的架构上,以及对外留下动态生成filter和监控filter执行的口子。另外一篇文章来看一下springcloud的zuul实现。