一、zuul是什么
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
zuul的例子可以参考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文档说明来进行使用。
二、zuul的工作原理
1、过滤器机制
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。
zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。
Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。
Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。
Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。
下面有几种标准的过滤器类型:
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
(1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
(2) ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
(3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
(4) ERROR:在其他阶段发生错误时执行该过滤器。
内置的特殊过滤器
zuul还提供了一类特殊的过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter
StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。
SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。
自定义的过滤器
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。
例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。
2、过滤器的生命周期
Zuul请求的生命周期如图,该图详细描述了各种类型的过滤器的执行顺序。
3、过滤器调度过程
4、动态加载过滤器
三、zuul 能做什么?
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
- 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
- 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
- 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
- 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
- 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
- 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
除此之外,Netflix公司还利用Zuul的功能通过金丝雀版本实现精确路由与压力测试。
四、zuul 与应用的集成方式
1、ZuulServlet - 处理请求(调度不同阶段的filters,处理异常等)
ZuulServlet
类似SpringMvc的DispatcherServlet
,所有的Request都要经过ZuulServlet
的处理
三个核心的方法preRoute()
,route()
, postRoute()
,zuul对request处理逻辑都在这三个方法里
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处理。
http://www.cnblogs.com/lexiaofei/p/7080257.html
相关推荐
同时,理解Zuul的工作原理也有助于我们在微服务架构中更好地部署和维护API网关。 总结,Zuul 2.1.3作为一款优秀的API网关,其强大的功能和友好的源码设计,为开发者提供了便利的工具来构建和管理微服务架构。通过...
### Zuul原理详解 #### 一、Zuul网关的作用 Zuul作为一个边缘服务,在微服务架构中扮演着至关重要的角色。它的主要职责包括但不限于API网关、路由、过滤等功能,为整个系统提供了一个统一的入口点,使得内部服务...
4. 理解Config Server和Config Client的工作原理,如何通过Git仓库管理配置,以及如何动态刷新配置。 5. 深入理解Eureka的工作流程和服务治理,包括服务注册、服务发现和服务健康检查。 6. 学习RabbitMQ的基本概念,...
标题 "springcloud+oauth+zuul" 涉及到的是一个基于Spring Cloud构建的微服务架构,并结合了OAuth2...为了更好地理解和使用这个骨架项目,建议查阅相关文档,理解每个组件的配置和工作原理,然后根据实际需求进行定制。
ZUUL是Netflix开源的一个...在提供的压缩包"ZUUL的API网关Java代码"中,你应该能找到一个包含启动类、配置文件和可能的自定义过滤器的示例项目,通过学习和分析这些代码,你可以更深入地掌握ZUUL的工作原理和使用方式。
学习这个工程代码,可以帮助我们深入理解ZUUL的工作原理,包括如何定义和实现自定义过滤器、如何配置路由规则、如何与服务发现组件配合,以及如何调试和测试API网关。此外,还可以借此机会学习Java和Spring Boot的...
《SpringCloud Zuul:动态路由详解与实践》 在微服务架构中,API网关扮演着...在“qiu-study-zuul”项目中,你可以亲自实践这些概念,进一步理解Zuul的工作原理和使用方法,为你的微服务架构增添更多灵活性和可控性。
Zuul 2基于Reactor框架,利用了反应式编程的概念,通过非阻塞IO处理网络请求。当客户端发起请求时,Zuul会创建一个新的事件循环来处理请求,而非创建新的线程。这种模式可以有效地减少线程上下文切换的开销,从而...
在计算机科学领域,尤其是Java编程中,线程和套接字编程是两个至关重要的概念。Zuul-MMORPG项目,源自BlueJ的World of Zuul,是一个专为学习和实践这两个主题而设计的平台。通过参与这个项目,开发者可以深入理解和...
总的来说,《分布式服务框架原理与实践》这本书会深入解析分布式服务的核心概念和技术,帮助读者理解如何设计和实现高可用、高并发的分布式系统。通过对书中内容的学习,开发者可以更好地应对复杂的业务场景,提升...
在深入解析Spring Cloud内置的Zuul过滤器之前,我们需要了解Zuul的核心概念——过滤器。过滤器是Zuul的核心组件,它们允许在请求被路由到后端服务之前或之后执行自定义逻辑。 `@EnableZuulServer` 和 `@...
分布式技术是现代IT领域中的重要组成部分,它涉及多个计算设备协同工作以完成大规模...通过下载并阅读提供的“深入浅出分布式技术原理教程 下载 下载3.txt”文件,你可以更深入地学习和掌握这些重要的分布式技术概念。
通过这些文件,你可以运行和测试微服务的各个组件,理解它们的工作原理和交互方式。 实践中,你需要按照以下步骤操作: 1. 创建服务提供者项目,配置Eureka客户端并实现服务接口。 2. 创建服务消费者项目,同样配置...
分布式技术是现代IT领域中的重要概念,它涉及多个计算节点协同工作以处理大规模数据和提供高可用性服务。本教程“深入浅出分布式技术原理”旨在帮助读者理解并掌握这一核心技术,通过学习,您可以深入了解分布式系统...
通过深入学习和理解这些概念,Java开发者能够更好地应对复杂的技术挑战,提升项目实施效率,同时也为面试成功打下坚实基础。在实际工作中,结合实践去运用这些知识,才能真正提升自己的技术水平。
下载后可以通过阅读源码来深入了解Spring Cloud的实现原理和技术细节,这对于学习和掌握Spring Cloud的高级用法非常有帮助。通常,学习Spring Cloud源码可以从以下几个方面入手: - **核心类和接口**:了解Spring ...
- 深入学习Eureka的工作原理和使用方法,理解服务注册中心的重要性。 - 掌握服务注册、服务发现的具体配置和操作,了解Eureka Server和Eureka Client的区别及其配置方式。 3. **负载均衡**: - 了解Ribbon的
本项目"springclou-base.rar"涵盖了Spring Cloud的核心组件Eureka、Zuul,以及两个客户端的应用,旨在帮助开发者理解并掌握服务发现和服务网关的基本概念和实践。 **Eureka注册中心** Eureka是Spring Cloud中的...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》这本书深入...通过阅读《从PAXOS到ZOOKEEPER分布式一致性原理与实践》这本书,读者可以深入掌握这些概念,并将理论知识转化为实践经验,提升解决分布式系统问题的能力。
在本课程"Java深入微服务原理改造房产销售平台2"中,我们将深入探讨如何利用Java技术和微服务架构来优化和现代化一个房产销售平台。微服务架构是一种将大型复杂应用程序拆分为一组小型、独立的服务的方法,每个服务...