把网关系统设计的炉火纯青!(3)

简介: 把网关系统设计的炉火纯青!

3. Zuul1.0

Zuul是所有从设备和web站点到Netflix流媒体应用程序后端请求的前门。作为一个边缘服务应用程序,Zuul被构建来支持动态路由、监视、弹性和安全性。它还可以根据需要将请求路由到多个Amazon自动伸缩组。

Zuul使用了一系列不同类型的过滤器,使我们能够快速灵活地将功能应用到服务中。


过滤器


过滤器是Zuul的核心功能。它们负责应用程序的业务逻辑,可以执行各种任务。


Type :通常定义过滤器应用在哪个阶段

Async :定义过滤器是同步还是异步

Execution Order :执行顺序

Criteria :过滤器执行的条件

Action :如果条件满足,过滤器执行的动作

Zuul提供了一个动态读取、编译和运行这些过滤器的框架。过滤器之间不直接通信,而是通过每个请求特有的RequestContext共享状态。


下面是Zuul的一些过滤器:


Incoming


Incoming过滤器在请求被代理到Origin之前执行。这通常是执行大部分业务逻辑的地方。例如:认证、动态路由、速率限制、DDoS保护、指标。


Endpoint


Endpoint过滤器负责基于incoming过滤器的执行来处理请求。Zuul有一个内置的过滤器(ProxyEndpoint),用于将请求代理到后端服务器,因此这些过滤器的典型用途是用于静态端点。例如:健康检查响应,静态错误响应,404响应。


Outgoing


Outgoing过滤器在从后端接收到响应以后执行处理操作。通常情况下,它们更多地用于形成响应和添加指标,而不是用于任何繁重的工作。例如:存储统计信息、添加/剥离标准标题、向实时流发送事件、gziping响应。


过滤器类型


下面是与一个请求典型的生命周期对应的标准的过滤器类型:


  • PRE :路由到Origin之前执行
  • ROUTING :路由到Origin期间执行
  • POST :请求被路由到Origin之后执行
  • ERROR :发生错误的时候执行



这些过滤器帮助我们执行以下功能:


  • 身份验证和安全性 :识别每个资源的身份验证需求,并拒绝不满足它们的请求
  • 监控 :在边缘跟踪有意义的数据和统计数据,以便给我们一个准确的生产视图
  • 动态路由 :动态路由请求到不同的后端集群
  • 压力测试 :逐渐增加集群的流量,以评估性能
  • 限流 :为每种请求类型分配容量,并丢弃超过限制的请求
  • 静态响应处理 :直接在边缘构建一些响应,而不是将它们转发到内部集群

Zuul 1.0 请求生命周期


image.png


Netflix宣布了通用API网关Zuul的架构转型。Zuul原本采用同步阻塞架构,转型后叫作Zuul2,采用异步非阻塞架构。Zuul2和Zuul1在架构方面的主要区别在于,Zuul2运行在异步非阻塞的框架上,比如Netty。Zuul1依赖多线程来支持吞吐量的增长,而Zuul 2使用的Netty框架依赖事件循环和回调函数。


4. Zuul2.0

Zuul 2.0 架构图


image.png


上图是Zuul2的架构,和Zuul1没有本质区别,两点变化:


前端用Netty Server代替Servlet,目的是支持前端异步。后端用Netty Client代替Http Client,目的是支持后端异步。

过滤器换了一下名字,用Inbound Filters代替Pre-routing Filters,用Endpoint Filter代替Routing Filter,用Outbound Filters代替Post-routing Filters。

Inbound Filters :路由到 Origin 之前执行,可以用于身份验证、路由和装饰请求


Endpoint Filters :可用于返回静态响应,否则内置的ProxyEndpoint过滤器将请求路由到Origin


Outbound Filters :从Origin那里获取响应后执行,可以用于度量、装饰用户的响应或添加自定义header


有两种类型的过滤器:sync 和 async。因为Zuul是运行在一个事件循环之上的,因此从来不要在过滤中阻塞。如果你非要阻塞,可以在一个异步过滤器中这样做,并且在一个单独的线程池上运行,否则可以使用同步过滤器。


上文提到过Zuul2开始采用了异步模型


优势 是异步非阻塞模式启动的线程很少,基本上一个CPU core上只需启一个事件环处理线程,它使用的线程资源就很少,上下文切换(Context Switch)开销也少。非阻塞模式可以接受的连接数大大增加,可以简单理解为请求来了只需要进队列,这个队列的容量可以设得很大,只要不超时,队列中的请求都会被依次处理。


不足 ,异步模式让编程模型变得复杂。一方面Zuul2本身的代码要比Zuul1复杂很多,Zuul1的代码比较容易看懂,Zuul2的代码看起来就比较费劲。另一方面异步模型没有一个明确清晰的请求->处理->响应执行流程(call flow),它的流程是通过事件触发的,请求处理的流程随时可能被切换断开,内部实现要通过一些关联id机制才能把整个执行流再串联起来,这就给开发调试运维引入了很多复杂性,比如你在IDE里头调试异步请求流就非常困难。另外ThreadLocal机制在这种异步模式下就不能简单工作,因为只有一个事件环线程,不是每个请求一个线程,也就没有线程局部的概念,所以对于CAT这种依赖于ThreadLocal才能工作的监控工具,调用链埋点就不好搞(实际可以工作但需要进行特殊处理)。


总体上,异步非阻塞模式比较适用于IO密集型(IO bound)场景,这种场景下系统大部分时间在处理IO,CPU计算比较轻,少量事件环线程就能处理。


Zuul 与 Zuul 2 性能对比


image.png


Netflix给出了一个比较模糊的数据,大致Zuul2的性能比Zuul1好20%左右 ,这里的性能主要指每节点每秒处理的请求数。为什么说模糊呢?因为这个数据受实际测试环境,流量场景模式等众多因素影响,你很难复现这个测试数据。即便这个20%的性能提升是确实的,其实这个性能提升也并不大,和异步引入的复杂性相比,这20%的提升是否值得是个问题。Netflix本身在其博文22和ppt11中也是有点含糊其词,甚至自身都有一些疑问的。


5. Spring Cloud Gateway

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。


SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。


Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。


Spring Cloud Gateway 底层使用了高性能的通信框架Netty 。


SpringCloud Gateway 特征


SpringCloud官方,对SpringCloud Gateway 特征介绍如下:


(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0


(2)集成 Hystrix 断路器


(3)集成 Spring Cloud DiscoveryClient


(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters


(5)具备一些网关的高级功能:动态路由、限流、路径重写


从以上的特征来说,和Zuul的特征差别不大。SpringCloud Gateway和Zuul主要的区别,还是在底层的通信框架上。


简单说明一下上文中的三个术语:


Filter (过滤器)


和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。


Route (路由)


网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块 由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。


Predicate (断言):


这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的 输入类型是一个 ServerWebExchange。


几种网关的对比


image.png

相关文章
|
网络架构 数据格式
网络通信原理系统的认知(NEBASE第十四课)(二)
网络通信原理系统的认知(NEBASE第十四课)(二)
303 0
|
编解码 算法 关系型数据库
物理层系统设计架构及关键技术 | 带你读《5G 无线系统设计与国际标准》之六
物理层的设计是整个 5G 系统设计中最核心的部分。相对于 4G,ITU 及 3GPP 对 5G提出了更高而且更全面的关键性能指标要求。其中最具有挑战的峰值速率、频谱效率、用户体验速率、时延等关键指标均需要通过物理层的设计来达成。为迎接这些挑战,5G的新空口设计在充分借鉴 LTE 设计的基础上,也引入了一些全新的设计。
物理层系统设计架构及关键技术 | 带你读《5G 无线系统设计与国际标准》之六
|
5G 网络架构
5G 系统网络架构 | 带你读《5G 无线系统设计与国际标准》之四
为了适应各种部署场景,5G 支持了两种部署方式:一种为分布式部署,这种方式与 LTE系统类似,网络由基站组成,基站支持全协议栈的功能;另一种为集中式部署,基站进一步分为集中单元(CU,Centralized Unit)和分布单元(DU,Distributed Unit)两个节点,CU 和 DU 分别支持不同的协议栈和功能,
5G 系统网络架构  | 带你读《5G 无线系统设计与国际标准》之四
|
传感器 数据采集
无线通信网络优化的自动路测系统设计(Matlab代码实现)
无线通信网络优化的自动路测系统设计(Matlab代码实现)
114 0
|
运维 网络协议 网络架构
网络通信原理系统的认知(NEBASE第十四课)(一)
网络通信原理系统的认知(NEBASE第十四课)(一)
180 0
|
负载均衡 监控 安全
把网关系统设计的炉火纯青!(2)
把网关系统设计的炉火纯青!
131 0
把网关系统设计的炉火纯青!(2)
|
安全 Java Devops
把网关系统设计的炉火纯青!(1)
把网关系统设计的炉火纯青!
144 0
把网关系统设计的炉火纯青!(1)
|
安全
马蹄(波场)佛萨奇2.0项目系统开发技术介绍讲解方案
马蹄(波场)佛萨奇2.0项目系统开发技术介绍讲解方案
217 0
|
算法 5G 网络性能优化
高移动性需求的实现 | 带你读《5G 空口设计与实践进阶 》之四
移动性是指满足特定 QoS 和无缝传输条件下系统可支持的最大移动速度。NR 要求用户终端在 500 km/h 的极端环境下也能保持始终如一的高速连接。这一指标相对于 LTE 最大支持 350 km/h 的设计有着显著的性能提升,同时也就要求要有一系列优化的方案来克服移动性的限制。
高移动性需求的实现 | 带你读《5G 空口设计与实践进阶 》之四
|
存储 机器学习/深度学习 边缘计算
MEC|带你读《5G无线网络规划与设计》之六
在 5G 的服务化架构中,NF 既是服务的提供者,又是服务的使用者。任何NF 都可以提供一个或多个服务。5G 系统架构提供了对服务的使用者进行身份验证和对服务请求授权所必需的功能,并支持高效灵活的公开和使用服务。对于简单的服务或信息请求,可以使用请求-响应模型。对于长期存在的进程,5G架构还支持订阅-通知模型。
MEC|带你读《5G无线网络规划与设计》之六