Spring Cloud Gateway整合Sentinel

日升时奋斗,日落时自省

目录

1、实现整合

1.1、添加框架依赖

1.2、设置配置文件

1.3、设置限流和熔断规则

1.3.1、限流配置

[Route ID限流配置](#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新增模块),如下配置所示:

java 复制代码
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

1.2、设置配置文件

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

java 复制代码
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:就是响应信息

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

java 复制代码
      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 中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。

相关推荐
荆州克莱1 天前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
bohu831 天前
sentinel学习笔记7-熔断降级
笔记·sentinel·熔断降级·degradeslot·circuitbreaker
解梦者1 天前
Spring(七)Spring Cloud----Feign、Zuul和Apollo
spring·spring cloud·feign·apollo·zuul
新手小袁_J2 天前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
suweijie7682 天前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
维李设论2 天前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
向阳12182 天前
sentinel来源访问控制(黑白名单)
java·sentinel
bohu832 天前
sentinel学习笔记1-为什么需要服务降级
笔记·学习·sentinel·滑动窗口
一个儒雅随和的男子2 天前
微服务详细教程之nacos和sentinel实战
微服务·架构·sentinel