微服务应用防护与规则配置
通过在 Kong 网关上集成一个 Sentinel 插件,借助 Sentinel Go SDK 对 API 请求进行应用级别的防护,当前实施范围为入站请求防护。
了解更多 sentinel 说明,可参考 sentinel 官网文档:https://sentinelguard.io/zh-cn/docs/introduction.html
实现功能流程
- 开发者或运维人员可以在控制台进行防护规则的配置和启动。
- Sentinel 插件使用 goroutine 定期更新和应用防护规则。
- Kong 在接收到请求后,根据规则列表匹配 URL,并对匹配的 URL 执行规则验证。
- 完成请求处理后,执行规则的退出流程,结束一次防护周期。
- 如果请求被阻止,则返回 HTTP 状态码 429。如果请求被限流,响应头将包含
x-service-protected-rule
,指示触发的流控规则。
核心场景
应用防护各规则说明和适用的核心场景如下表所示
应用防护规则 | 描述 | 核心场景 |
---|---|---|
流控规则 | 配置 QPS 模式的流控规则,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。 | 适用于需要限制突发的流量,在尽可能处理请求的同时来保障服务不被击垮的场景。 |
熔断规则 | 对不稳定的弱依赖调用进行自动熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。 | 避免局部不稳定因素(某个慢调用、异常服务)导致整体的雪崩,例如切断某个 RT 高的第三方服务调用,或针对某个 ID 的慢 SQL 访问进行熔断。 |
隔离规则 | 控制某些调用的并发数(即正在进行的数目),防止过多的慢调用挤占正常的调用。 | 在调用第三方服务时,防止过多的慢调用挤占正常调用的资源,避免服务不可用。 |
热点防护规则 | 自动识别热点参数并控制每个热点值的访问频次或并发量,可以有效地防止过“热”的参数访问挤占正常的调用资源。 | 适用于针对某些热点数据中访问频次最高的 Top 数据进行控制的场景,例如针对一段时间内最频繁购买的商品 ID 进行控制,防止突发热点商品击穿缓存而导致大量请求到数据库的情形。 |
开启应用防护插件
打开“应用服务管理-企业门户-更多-网关”,打开插件配置页面,如下图所示
在“企业门户V2”中配置 kong 的插件,在“所有应用服务”中配置 kong2 的插件。
选择“所有应用服务”后,选择应用防护 sentinel 插件,开启插件并设置插件参数
配置规则方案
可以配置多个规则方案,每个方案可以包括流控规则、熔断规则、隔离规则、热点规定定义。
设置多个方案并启用方案后,会显示当前启动的方案(即:以当前方案配置的防护规则启动防护校验),其他方案则为关闭。
设置规则定义
新增方案后,可以对该方案下的流控规则、熔断规则、隔离规则、热点规定进行规则定义。
流控规则定义
选择方案下的流控规则,打开规则定义进行配置
规则参数说明如下:
参数 | 描述 |
---|---|
规则编码 | 自定义流控规则编码,建议使用英文标识符 |
规则名称 | 自定义流控规则名称,可以使用中文名 |
令牌计算策略 | 直接计算:设置统计时长内允许通过的阈值;预热计算:当选择预热计算,则需要设置预热时长 |
流控效果 | 定义了当请求达到资源的容量时的行为;拒绝:达到阈值时,立即拦截请求 限流:请求匀速通过,允许排队等待,通常用于请求调用削峰填谷等场景。需设置具体的超时时间,达到超时时间后请求会快速失败 |
关联策略 | 表示基于调用关系的流量控制方案;独享资源:表示规则仅适用于当前资源,不与其他资源共享 共享资源:表示规则将与其他关联的资源共享。这意味着当一个资源达到流量控制阈值时,与之关联的其他资源也将受到相同的流量控制方案的限制。 |
示例:在10秒内调用请求次数超过5次时,请求将被拒绝,如下图所示
熔断规则定义
选择方案下的熔断规则,打开规则定义进行配置
规则参数说明如下:
参数 | 描述 |
---|---|
规则编码 | 自定义熔断规则编码,建议使用英文标识符 |
规则名称 | 自定义熔断规则名称,可以使用中文名 |
熔断方案 | 慢请求比例: 错误请求比例 : 错误请求数量 |
阈值 | 触发熔断阈值 |
恢复超时时间(毫秒) | 在熔断器打开之前的恢复超时时间(毫秒) |
最小请求数量 | 触发熔断的最小请求数目 |
统计时间间隔(毫秒) | 内部熔断器的统计时间间隔(毫秒) |
桶数量 | 统计滑动窗口的桶数量 |
半开状态探测次数 | 熔断器进入恢复阶段恢复策略次数 |
示例:在统计时长10秒内,当请求数目大于2,并且慢调用的比例大于20%的时候,则在接下来1秒的熔断时长内,请求都会快速失败,如下图所示
隔离规则定义
选择方案下的隔离规则,打开规则定义进行配置
规则参数说明如下:
参数 | 描述 |
---|---|
规则编码 | 自定义隔离规则编码,建议使用英文标识符 |
规则名称 | 自定隔离规则名称,可以使用中文名 |
令牌计算策略 | 直接计算: 预热计算 |
阈值 | 触发隔离阈值 |
流控效果 | 拒绝:达到阈值时,立即拦截请求 限流:请求匀速通过,允许排队等待 |
示例:调用请求次数超过10次时,请求将被限流,如下图所示
热点规则定义
选择方案下的热点规则,打开规则定义进行配置
规则参数说明如下:
参数 | 描述 |
---|---|
规则编码 | 自定义熔断规则编码,建议使用英文标识符 |
规则名称 | 自定义熔断规则名称,可以使用中文名 |
指标类型 | 并行: 并发 |
阈值 | 触发热点阈值 |
热点参数 | 热点参数 |
示例:当请求中参数有type时,10秒内调用次数为3,超过则被限流,如下图所示
配置 API 防护规则
对待限流的 api 资源配置防护规则
- 服务名:下拉选择注册到门户的服务
- 接口路径:要进行限流的 api 接口
- 接口路径格式和权限项规则一样: *:/uaa/userinfo:get
- 支持前缀匹配 :/uaa/:
- 支持 $pparams
- 支持 $hotspots=encodeURIComponent(orderId=124&psmId=12345)
- 规则:选择定义的流控、熔断、隔离、热点防护规则
如上图所示,对门户的 /uaa/Users 接口设置选择了一个定义为拒绝规则名称的流控规则,此规则为在10秒内调用次数超过5次后,将触发防护规则。
插件注册完成后,在应用的监控里可以查看
打开插件管理
在插件列表中可查看已注册完成的应用防护插件