一、什么是zuul? zuul是netflix开源API网关服务器,本质上是web servlet APP应用程序。
Zuul在云平台上提供动态路由、监控、灵活性、安全性等边缘服务框架。 Zuul是设备和Netflix流式APP应用程序网站后端的所有请求的前门。
可以参考Netflix github上的simple webapp,并按照Netflix github wiki上文档中的说明使用zul示例。
二、zuul的工作原理1、过滤器机制zuul的核心是一系列filters,其作用类似于servlet框架的Filter,或AOP。
在zul将请求路由合并到用户处理逻辑的过程中,这些过滤器参与验证、加载等过滤处理。
Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。
zul的过滤器之间没有直接的相互通信,他们之间通过RequestContext的静态类进行数据传输。 RequestContext类包含一个ThreadLocal变量,用于记录每个Request必须传递的数据。
Zuul的过滤器由Groovy编写,这些过滤器文件位于Zuul Server上的特定目录下,Zuul定期轮询这些目录,修改后的过滤器被动态加载到zulserver中进行请求
有以下标准过滤器类型:
Zuul的大部分功能都是通过滤波器实现的。 zul定义了四种标准过滤器类型,用于请求的典型生命周期。
(1) PRE :这样的过滤器在请求被路由之前被调用。 可以利用这样的过滤器实现认证,选择集群内要求的微服务器,记录调试信息。
)2) ROUTING )该过滤器将请求路由到微服务。 此过滤器用于生成发送到微服务的请求,并使用Apachehttp客户端或Netfilx Ribbon请求微服务。
3 ) POST )在路由到微服务之后执行该过滤器。 使用此过滤器可以将标准HTTP Header添加到响应中,收集统计信息和指标,以及将响应从微服务器发送到客户端。
(4) ERROR )如果在其他阶段发生错误,则执行该过滤器。
内置的特殊过滤器
zul还提供了一个特殊的过滤器: StaticResponseFilter和SurgicalDebugFilter
staticresponsefilter:staticresponsefilter允许Zuul本身生成响应,而不是将请求转发到源。
surgicaldebugfilter :使用surgicaldebugfilter可以将特定请求路由到划分的调试群集或主机。
自定义的过滤器
除了默认筛选器类型外,Zuul还允许您创建自定义筛选器类型。
例如,可以定制静态类型过滤器,以便在Zuul中直接生成响应,而不将请求转发到后端微服务器。
2 .过滤器生命周期Zuul请求的生命周期图。 此图详细说明了各种过滤器的执行顺序。
3、过滤器调度流程
4、动态负载滤波器
三、zuul能做什么? zul可以通过加载动态过滤机制来实现以下功能:
认证和安全保障:识别针对各种资源的认证请求,拒绝与请求不一致的请求。 审查和监测:在边缘位置跟踪有意义的数据和统计结果,从而得出准确的生产状态结论。 动态路由:根据需要而动态地将请求路由到不同的后端集群。 压力测试:逐渐增加集群的负荷流量,计算性能水平。 负载分担器:分配每个负载类型的容量,并且丢弃超过该限制的请求。 静态响应处理:直接在边缘位置处建立部分响应,以便避免流入内部集群。 多区域灵活性:旨在跨AWS区域进行请求路由,使ELB的使用多样化,使边缘位置尽可能接近用户。 此外,Netflix利用Zuul的功能在加那利版本中提供了准确的路由和压力测试。
四. zuul与APP集成方式1、zulservlet-处理请求(不同阶段的文件调度、异常处理等) zulservlet类似于SpringMvc的分布式服务器
三种核心方式用于前向路由(,路由)、后向路由(,zuul )请求的处理逻辑在于这三种方式
ZuulServlet交给ZuulRunner执行。
因为ZuulServlet是一个例子,所以ZuulRunner也只有一个实现
例。ZuulRunner直接将执行逻辑交由FilterProcessor处理,FilterProcessor也是单例,其功能就是依据filterType执行filter的处理逻辑
FilterProcessor对filter的处理逻辑。
首先根据Type获取所有输入该Type的filter,List<ZuulFilter> list。遍历该list,执行每个filter的处理逻辑,processZuulFilter(ZuulFilter filter)RequestContext对每个filter的执行状况进行记录,应该留意,此处的执行状态主要包括其执行时间、以及执行成功或者失败,如果执行失败则对异常封装后抛出。 到目前为止,zuul框架对每个filter的执行结果都没有太多的处理,它没有把上一filter的执行结果交由下一个将要执行的filter,仅仅是记录执行状态,如果执行失败抛出异常并终止执行。 2、ContextLifeCycleFilter - RequestContext 的生命周期管理ContextLifecycleFilter的核心功能是为了清除RequestContext; 请求上下文RequestContext通过ThreadLocal存储,需要在请求完成后删除该对象。
RequestContext提供了执行filter Pipeline所需要的Context,因为Servlet是单例多线程,这就要求RequestContext即要线程安全又要Request安全。
context使用ThreadLocal保存,这样每个worker线程都有一个与其绑定的RequestContext,因为worker仅能同时处理一个Request,这就保证了Request Context 即是线程安全的由是Request安全的。
3、GuiceFilter - GOOLE-IOC(Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。) 4、StartServer - 初始化 zuul 各个组件 (ioc、插件、filters、数据库等) 5、FilterScriptManagerServlet - uploading/downloading/managing scripts, 实现热部署Filter源码文件放在zuul 服务特定的目录, zuul server会定期扫描目录下的文件的变化,动态的读取编译运行这些filter,
如果有Filter文件更新,源文件会被动态的读取,编译加载进入服务,接下来的Request处理就由这些新加入的filter处理。