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

相关推荐
天天扭码13 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
luckywuxn20 小时前
Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系
spring boot·spring·spring cloud
wclass-zhengge2 天前
SpringCloud篇(服务网关 - GateWay)
spring boot·spring cloud·gateway
荆州克莱2 天前
Redis | Redis常用命令及示例总结(API)
spring boot·spring·spring cloud·css3·技术
RainbowSea2 天前
5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用
java·spring·spring cloud
听潮阁2 天前
【SpringCloud详细教程】-02-微服务环境搭建
spring·spring cloud·微服务
阿维的博客日记2 天前
java八股-SpringCloud微服务-Eureka理论
spring cloud·eureka·nacos
跳跳的向阳花2 天前
03-02、SpringCloud第二章,Eureka服务的注册与发现
spring·spring cloud·eureka
泰山小张只吃荷园2 天前
快速入门消息队列MQ、RabbitMQ
java·spring boot·分布式·spring·spring cloud·rabbitmq·java-rabbitmq
customer082 天前
【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)
java·jvm·vue.js·spring boot·spring cloud·java-ee·开源