微服务应用防护与规则配置

通过在 Kong 网关上集成一个 Sentinel 插件,借助 Sentinel Go SDK 对 API 请求进行应用级别的防护,当前实施范围为入站请求防护。

了解更多 sentinel 说明,可参考 sentinel 官网文档:https://sentinelguard.io/zh-cn/docs/introduction.html

实现功能流程

  1. 开发者或运维人员可以在控制台进行防护规则的配置和启动。
  2. Sentinel 插件使用 goroutine 定期更新和应用防护规则。
  3. Kong 在接收到请求后,根据规则列表匹配 URL,并对匹配的 URL 执行规则验证。
  4. 完成请求处理后,执行规则的退出流程,结束一次防护周期。
  5. 如果请求被阻止,则返回 HTTP 状态码 429。如果请求被限流,响应头将包含 x-service-protected-rule,指示触发的流控规则。

核心场景

应用防护各规则说明和适用的核心场景如下表所示

应用防护规则 描述 核心场景
流控规则 配置 QPS 模式的流控规则,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。 适用于需要限制突发的流量,在尽可能处理请求的同时来保障服务不被击垮的场景。
熔断规则 对不稳定的弱依赖调用进行自动熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。 避免局部不稳定因素(某个慢调用、异常服务)导致整体的雪崩,例如切断某个 RT 高的第三方服务调用,或针对某个 ID 的慢 SQL 访问进行熔断。
隔离规则 控制某些调用的并发数(即正在进行的数目),防止过多的慢调用挤占正常的调用。 在调用第三方服务时,防止过多的慢调用挤占正常调用的资源,避免服务不可用。
热点防护规则 自动识别热点参数并控制每个热点值的访问频次或并发量,可以有效地防止过“热”的参数访问挤占正常的调用资源。 适用于针对某些热点数据中访问频次最高的 Top 数据进行控制的场景,例如针对一段时间内最频繁购买的商品 ID 进行控制,防止突发热点商品击穿缓存而导致大量请求到数据库的情形。

开启应用防护插件

打开“应用服务管理-企业门户-更多-网关”,打开插件配置页面,如下图所示

在“企业门户V2”中配置 kong 的插件,在“所有应用服务”中配置 kong2 的插件。

选择“所有应用服务”后,选择应用防护 sentinel 插件,开启插件并设置插件参数

配置规则方案

可以配置多个规则方案,每个方案可以包括流控规则、熔断规则、隔离规则、热点规定定义。

设置多个方案并启用方案后,会显示当前启动的方案(即:以当前方案配置的防护规则启动防护校验),其他方案则为关闭。

设置规则定义

新增方案后,可以对该方案下的流控规则、熔断规则、隔离规则、热点规定进行规则定义。

流控规则定义

选择方案下的流控规则,打开规则定义进行配置

img

规则参数说明如下:

参数 描述
规则编码 自定义流控规则编码,建议使用英文标识符
规则名称 自定义流控规则名称,可以使用中文名
令牌计算策略 直接计算:设置统计时长内允许通过的阈值;预热计算:当选择预热计算,则需要设置预热时长
流控效果 定义了当请求达到资源的容量时的行为;拒绝:达到阈值时,立即拦截请求 限流:请求匀速通过,允许排队等待,通常用于请求调用削峰填谷等场景。需设置具体的超时时间,达到超时时间后请求会快速失败
关联策略 表示基于调用关系的流量控制方案;独享资源:表示规则仅适用于当前资源,不与其他资源共享 共享资源:表示规则将与其他关联的资源共享。这意味着当一个资源达到流量控制阈值时,与之关联的其他资源也将受到相同的流量控制方案的限制。

示例:在10秒内调用请求次数超过5次时,请求将被拒绝,如下图所示

img

熔断规则定义

选择方案下的熔断规则,打开规则定义进行配置

img

规则参数说明如下:

参数 描述
规则编码 自定义熔断规则编码,建议使用英文标识符
规则名称 自定义熔断规则名称,可以使用中文名
熔断方案 慢请求比例: 错误请求比例 : 错误请求数量
阈值 触发熔断阈值
恢复超时时间(毫秒) 在熔断器打开之前的恢复超时时间(毫秒)
最小请求数量 触发熔断的最小请求数目
统计时间间隔(毫秒) 内部熔断器的统计时间间隔(毫秒)
桶数量 统计滑动窗口的桶数量
半开状态探测次数 熔断器进入恢复阶段恢复策略次数

示例:在统计时长10秒内,当请求数目大于2,并且慢调用的比例大于20%的时候,则在接下来1秒的熔断时长内,请求都会快速失败,如下图所示

img

隔离规则定义

选择方案下的隔离规则,打开规则定义进行配置

img

规则参数说明如下:

参数 描述
规则编码 自定义隔离规则编码,建议使用英文标识符
规则名称 自定隔离规则名称,可以使用中文名
令牌计算策略 直接计算: 预热计算
阈值 触发隔离阈值
流控效果 拒绝:达到阈值时,立即拦截请求 限流:请求匀速通过,允许排队等待

示例:调用请求次数超过10次时,请求将被限流,如下图所示

img

热点规则定义

选择方案下的热点规则,打开规则定义进行配置

img

规则参数说明如下:

参数 描述
规则编码 自定义熔断规则编码,建议使用英文标识符
规则名称 自定义熔断规则名称,可以使用中文名
指标类型 并行: 并发
阈值 触发热点阈值
热点参数 热点参数

示例:当请求中参数有type时,10秒内调用次数为3,超过则被限流,如下图所示

img

配置 API 防护规则

对待限流的 api 资源配置防护规则

  • 服务名:下拉选择注册到门户的服务
  • 接口路径:要进行限流的 api 接口
    • 接口路径格式和权限项规则一样: *:/uaa/userinfo:get
    • 支持前缀匹配 :/uaa/:
    • 支持 $pparams
    • 支持 $hotspots=encodeURIComponent(orderId=124&psmId=12345)
  • 规则:选择定义的流控、熔断、隔离、热点防护规则

如上图所示,对门户的 /uaa/Users 接口设置选择了一个定义为拒绝规则名称的流控规则,此规则为在10秒内调用次数超过5次后,将触发防护规则。

插件注册完成后,在应用的监控里可以查看

打开插件管理

在插件列表中可查看已注册完成的应用防护插件

results matching ""

    No results matching ""