本文字数:10725字
预计阅读时间:27分钟
1. 前言
API 网关是随着微服务(Microservice)这个概念一起兴起的一种架构模式,它用于解决微服务过于分散,没有一个统一的出入口进行流量管理的问题。
当使用微服务构建整个 API 服务时,一般会有许许多多职责不同的应用在运行着,这些应用会需要一些通用的功能,例如鉴权、流控、监控、日志统计等。
在传统的单体应用中,这些功能一般都是内嵌在应用中,作为一个组件运行。但是在微服务模式下,不同种类且独立运行的应用可能会有数十甚至数百种,继续使用这种方式会造成非常高的管理和发布成本。所以就需要在这些应用上抽象出一个统一的流量入口,完成这些功能的实现。
Setinel是分布式系统的流量防卫兵,它以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。
因此,在API网关中结合Sentinel的流控能力,再根据业务需求加以定制,可以有效地实现对大规模流量(本例中API网关的日均流量有1亿+)的实时控制,从而满足业务实践的需要。
流量复制是一种控制流量的具体形式,是指网关将发往某一个服务的流量复制一份,转发到另外一个服务上。流量复制可以使用线上真实流量进行服务功能的验证和服务性能的压测。本文以下将重点介绍在Sentinel现有流控架构上进行定制,实现流量复制功能的具体实践。
2. Sentinel的基本概念
资源:可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:
定义资源
定义规则
检验规则是否生效
先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
3. Sentinel的流程架构
在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName
),每次资源调用都会创建一个 Entry
对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU
API 显式创建。Sentinel采用的是责任链模式,对于规则的检查和处理由一系列槽链构成。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:
NodeSelectorSlot
负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;ClusterBuilderSlot
则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;StatisticSlot
则用于记录、统计不同纬度的 runtime 指标监控信息;FlowSlot
则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;AuthoritySlot
则根据配置的黑白名单和调用来源信息,来做黑白名单控制;DegradeSlot
则通过统计信息以及预设的规则,来做熔断降级;SystemSlot
则通过系统的状态,例如 load1 等,来控制总的入口流量;总体的框架如下:
对于网关流控来说,我们对GatewayFlowSlot进行了自定义,结合sentinel本身对流量的定义能力,实现了对特定流量的管控和复制能力。如下图所示:这里展示的是流量集中管控的流程架构,首先从规则管理后台,配置网关流控的相关规则,会在内部转换生成热点参数规则。在外部请求进入的时候,通过SentinelGateway过滤器进行路由或者API分组的识别和请求属性的解析,然后将解析后的参数传入Sentinel槽链,在GatewayFlowSlot槽进行网关规则的检查,进而实现流量的集中控制。
4. 流量复制的具体实现
当请求进入网关后,首先会经过SentinelGatewayFilter的处理,SentinelGatewayFilter会读取A