Spring Cloud Gateway整合Sentinel

日升时奋斗,日落时自省 

目录

1、实现整合

1.1、添加框架依赖

 1.2、设置配置文件

1.3、设置限流和熔断规则

1.3.1、限流配置

Route ID限流配置

API限流配置

1.3.2、熔断配置

2、实现原理


先前Sentinel针对是业务微服务,没有整合Sentinel到Spring Cloud Gateway

Spring Cloud Gateway 默认是有限流功能的,但限流功能比较简单,所以咱们今天要实现的是 Spring Cloud Gateway 整合 Spring Cloud AlibabaSentinel 实现限流和熔断功能,这种方式也是目前生成环境主流的限流和熔断的实现方法。

1、实现整合

Gateway整合Sentinel总共分为以下4步:

(1)添加框架依赖

(2)设置配置文件

(3)配置拦截规则

(4)验证效果

接下来,我们一步一步来实现

1.1、添加框架依赖

需要框架依赖有3个:gateway、sentinel和sentinel-gateway(Sentinel对接Gateway的适配框架,Sentinel1.6新增模块),如下配置所示:

  com.alibaba.cloud spring-cloud-alibaba-sentinel-gateway   com.alibaba.cloud spring-cloud-starter-alibaba-sentinel   org.springframework.cloud spring-cloud-starter-gateway 

 1.2、设置配置文件

在application中设置sentinel控制台的地址,以及限流之后的响应信息:

spring:
  cloud:
    gateway:
      routes:
        - id: userservice
          uri: http://localhost:9090
          predicates:
            - Path=/user/**
    sentinel:
      transport:
        dashboard: localhost:18086
      scg:
        fallback:
          mode: response
          response-status: 200
          response-body: '{"code":429,"message":"被限流了!"}'
  application:
    name: gateway-service
server:
  port: 10086

scg(Spring Cloud Gateway):配置网关专用

fallback:降级处理配置

mode:response 指定降级处理的模式为返回响应

response-status:表示响应状态

response-body:就是响应信息

限制规则中的重定位配置如下:

 scg:
        fallback:
          mode: redirect
          response-status: 200
          response-body: '{"code":429,"message":"被限流了!"}'
          redirect: https://blog.csdn.net/c_study__c?spm=1011.2124.3001.5343    #跳转地址

1.3、设置限流和熔断规则

进入sentinel控制台,内容有变

 限流或熔断配置就在“请求链路”中配置

1.3.1、限流配置

限流可以配置两种 API 类型: Route ID 和 API 分组

  • Route ID 是和 Gateway 中的 Routes (每个路由)一一对应的API 分组是自定义
  • API 规则 (开发人员可以自定义)
    Route ID限流配置

    限流配置参数:

    resourceMode: 规则是针对API Gateway 的 Route ID (RESOURCE MODE_ROUTE ID),还是用户在Sentinel 中定义的 API分组 (RESOURCE MODE CUSTOM API NAME) ,默认是 Route ID.

    resource: 资源名称,可以是网关中的 Route ID 名称或者用户自定义的 API 分组名称

    grade: 阈值类型,QPS 或线程数。

    count: 具体值intervalSec: 统计时间窗口,单位是秒,默认是 1 秒

    controlBehavior: 流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。

    controlBehavior: 流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败

    Burst size: 应对突发请求时额外允许的请求数目。

    maxQueueingTimeoutMs: 匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效

    paramItem: 参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规8则;否则会转换成热点规则,它包含的字段:

    • parseStrategy:从请求中提取参数的策略,目前支持提取来源 IPa.(PARAM PARSE STRATEGY CLIENT IP) 、Host (PARAM PARSE STRATEGY HOST) 、 Header(PARAM PARSE STRATEGY HEADER) 意 URL 参 (PARAM PARSE STRATEGY URL PARAM)种模式。
    • fieldName: 若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL参数名称
    • pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控,若为空则统计该请求属性的所有值。
    • matchStrategy: 参数值的匹配策略,目前支持精确匹配 (PARAM MATCH STRATEGY_EXACT)、子串匹 (PARAM MATCH STRATEGY CONTAINS) 和E则匹 (PARAM MATCH STRATEGY REGEX)。
      API限流配置

      先到API管理

       这是API组名: 并且添加匹配规则

      匹配规则顾名思义:

      • 精确:访问那个写那个(写全)
      • 前缀:凡是这个前缀的都受到限制
      • 正则:就是类似正则表达匹配方式

         新增好以后,回到请求链路

        此时API名称会有内容供友友们选择

         注:操控其实差不多,更加灵活了

        1.3.2、熔断配置

        降级配置也就是熔断配置,在程序运行期间出现了某种异常就会触发的机制。它是在"请求链路“中点击“降级”按钮就能看到:

         

        熔断策略: 使用哪种策略来进行熔断操作。

        慢调用比例: 在统计时长内的所有请求,如果请求时间超过 xx 秒则为慢请求,且慢请求的超过一定的比例,且请求数大于最小请求数将触发熔断操作,也就是一段时间内 (熔断时长参数设置) 的请求会快速失败。

        异常比例: 在统计时长内的所有请求,如果异常的比例大于闯值,且请求数大于最小请求数,将触发熔断,也就是一段时间内 (熔断时长参数设置)的请求会快速失败。

        异常数:在统计时长内的所有请求,如果异常数大于闯值,且请求数大于最小请求数,将触发熔断,也就是一段时间内 (熔断时长参数设置)的请求会快速失败。

        2、实现原理

        外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter,其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot,专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。