SpringCloud Gateway 整合阿里 Sentinel网关流控、熔断、降级【SpringCloud系列9】

SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。
程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发

本文章是系列文章中的一篇


降级

指系统将某些业务或者接口的功能降低,可以是只提供部分功能,也可以是完全停掉所有功能

熔断

A 服务的 X 功能依赖 B 服务的某个接口,当 B 服务的接口响应很慢的时候,A 服务的 X 功能响应肯定也会被拖慢,进一步导致 A 服务的线程都被卡在 X 功能处理上,此时 A 服务的其他功能都会被卡住或者响应非常慢。这时就需要熔断机制了,即:A 服务不再请求 B 服务的这个接口,A 服务内部只要发现是请求 B 服务的这个接口就立即返回错误,从而避免 A 服务整个被拖慢甚至拖死。

限流

限流指只允许系统能够承受的访问量进来,超出系统访问能力的请求将被丢弃。

排队

限流是直接拒绝用户,排队是让用户等待一段时间。


在高并发的系统中,往往需要在系统中做限流,常见的限流方式:

  • Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑
  • tomcat容器 通过限制它的线程数
  • 通过时间窗口的平均速度来控制流量

常见的限流算法

  • 计数器算法,一般会限制一秒钟的能够通过的请求数
  • 漏桶算法, 算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变
  • 令牌桶算法,令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用

本文章实现的是集成阿里的Sentinel实现网关限流。Sentinel是SpringCloud Alibaba提供的微服务组件,能够从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
在这里插入图片描述

1 docker-compose快速部署alibaba sentinel

创建docker-compose.yaml文件

version: "3.2"

services:
  sentinel:
    image: matecloud/sentinel-dashboard:1.8.1
    container_name: "sentinel-dashboard"
    environment:
      - TZ=Asia/Shanghai
      - JAVA_OPTS= -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200
    ports:
      - 8088:8080
    restart: on-failure

启动与关闭

#启动
docker-compose up -d
#关闭
docker-comopse stop

在这里插入图片描述

然后浏览器中访问 http://localhost:8088/#/dashboard/home
在这里插入图片描述
这里设置的用户名 sentinel 密码 sentinel
在这里插入图片描述

2 网关服务配置

首先是 pom.xml 中添加依赖

<!--    spring cloud gateway整合sentinel的依赖-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
  </dependency>

  <!--    sentinel的依赖-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  </dependency>

application.yml 配置文件中主要指定以下三种配置:

  • nacos的地址
  • sentinel控制台的地址
  • 网关路由的配置
  • redis 配置的地址
server:
  port: 10001
spring:
  cloud:
    ## 整合sentinel,配置sentinel控制台的地址
    sentinel:

      #配置限流之后的响应内容
      scg:
        fallback:
          # 两种模式:一种是response返回文字提示信息,一种是redirect,重定向跳转,需要同时配置redirect(跳转的uri)
          mode: response
          # 响应的状态
          response-status: 426
          # 响应体
          response-body: '{"code": 426,"message": "限流了,稍后重试!"}'

      transport:
        port: 8080
        ## 指定控制台的地址,默认端口8080
        dashboard: localhost:8088

      eager: true

然后重新启动网关项目,访问订单详情的接口
在这里插入图片描述
然后控制台中可以查看到具体的流量监控
在这里插入图片描述

3 Sentinel 网关流控

创建一个 FlowRule 来配置普通流控

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@Component
public class SentinelConfig {
    private static final String KEY="order-service";
    @PostConstruct
    private void init(){
        initFlowQpsRule();
    }

    //流量控制规则
    private void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<>();
        //资源名 流控的服务名
        FlowRule rule = new FlowRule(KEY);
        //1秒内请求的次数
        rule.setCount(1);
        //RuleConstant.FLOW_GRADE_QPS 1秒内访问限制
        //RuleConstant.FLOW_GRADE_THREAD 线程数量
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        //来源
        rule.setLimitApp("default");
       }
}

这个配置相当于是1秒内完成1次的响应请求,其余的提示限流
在这里插入图片描述
这样是写在代码中的硬编码的初始化的流控规则 ,本项目使用 nocas 来动态配置初始化的流控规则 。

4 Nacos 动态配置流控规则

网关项目中添加pom.xml依赖

  <!--nacos配置管理依赖-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <!--sentinel对Nacos数据源的支持依赖-->
  <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-nacos</artifactId>
  </dependency>

修改网关中的 application.yml 配置文件如下:(主要是添加 datasource 节点)

server:
  port: 10001
spring:
  application:
    name: '@project.name@'

  redis:
    database: 0  # Redis数据库索引(默认为0)
    host: localhost # Redis服务器地址
    port: 6379  # Redis服务器连接端口
    password: 12345678  # Redis服务器连接密码(默认为空)

  cloud:
    ## 整合sentinel,配置sentinel控制台的地址
    sentinel:

      #配置限流之后的响应内容
      scg:
        fallback:
          # 两种模式:一种是response返回文字提示信息,一种是redirect,重定向跳转,需要同时配置redirect(跳转的uri)
          mode: response
          # 响应的状态
          response-status: 426
          # 响应体
          response-body: '{"code": 426,"message": "限流了,稍后重试!"}'

      transport:
        port: 8080
        ## 指定控制台的地址,默认端口8080
        dashboard: localhost:8088
      eager: true
      
      datasource:
        r1:
          nacos:
            # nacos地址
            server-addr: localhost:8848
            # nacos中配置文件的data-id
            data-id: ${spring.application.name}-sentinel
            # nacos 分组
            group-id: DEFAULT_GROUP
            # 规则类型 流控
            rule-type: flow
        r2:
          nacos:
            server-addr: localhost:8848
            data-id: ${spring.application.name}-sentinel-degrade
            group-id: DEFAULT_GROUP
            rule-type: degrade


    nacos:
      server-addr: localhost:8848 # nacos地址



在这里配置的 data-id 要与 nacos 中的配置文件名称对应起来,我的网关项目服务名称为 gateway-api ,所以在 nacos 中创建 两个配置如下

4.1 流控规则 gateway-api-sentinel

在这里插入图片描述
格式是 JSON ,是一个数组,数组中每个Json对象表示一条流控规则。

[
    {
        "resource": "/**",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

重启网关,sentine 控制台显示
在这里插入图片描述
在这里插入图片描述

4.2 gateway-api-sentinel-degrade 文件降级规则

在这里插入图片描述

[
    {
        "count":500,
        "grade":0,
        "limitApp":"default",
        "minRequestAmount":5,
        "resource":"order-service",
        "slowRatioThreshold":1,
        "statIntervalMs":1000,
        "timeWindow":100
    }
]

Sentinel 控制台
在这里插入图片描述
在这里插入图片描述


本项目源码 https://gitee.com/android.long/spring-cloud-biglead/tree/master/biglead-api-09-sentinel
如果有兴趣可以关注一下公众号 biglead ,每周都会有 java、Flutter、小程序、js 、英语相关的内容分享

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Cloud Gateway SentinelSpring Cloud Gateway的一个扩展,用于提供应用程序的流量限制和熔断功能。 首先,Spring Cloud Gateway是一个基于Spring Boot的API网关,用于构建微服务架构中的API服务网关。它提供了路由和过滤功能,能够处理HTTP请求并进行相应的转发、过滤和路由。 而Sentinel阿里巴巴开源的一种流量控制组件,它具备实时监控、熔断降级、系统自适应、热点参数限流等功能。通过Sentinel,可以实现对流量的实时控制和管理,在高并发请求的情况下,可以有效地保护应用系统,避免雪崩效应的发生。 Spring Cloud Gateway SentinelSentinel的流量控制和熔断能力集成到了Spring Cloud Gateway中。它可以通过配置规则来限制每个API接口的访问流量,并在流量超出限制时,进行限流处理,保护应用程序的稳定性。同时,它还可以根据实际情况对请求进行熔断,从而避免请求过多导致服务不可用。 通过使用Spring Cloud Gateway Sentinel,我们可以灵活地对API接口进行流量控制和熔断处理,提高系统的稳定性和可用性。它的配置简单灵活,集成了Spring Cloud GatewaySentinel的优势,可以帮助我们更好地构建和管理微服务架构中的API服务网关。 ### 回答2: Spring Cloud Gateway Sentinel是一种基于Sentinel的流量控制和故障熔断的解决方案。Spring Cloud Gateway是一个轻量级的网关服务组件,而Sentinel是一个开源的流量控制和故障熔断框架。通过将两者结合使用,可以实现在网关层面对流量进行实时控制和保护。 Spring Cloud Gateway Sentinel提供了一系列的规则和策略,可以根据业务的需要进行配置。可以通过设置流量控制规则,限制某个接口的访问频率,防止过多的请求导致系统崩溃。另外,还可以设置熔断规则,当某个接口出现异常或者响应时间过长时,可以自动开启熔断策略,避免影响到其他正常的请求。 使用Spring Cloud Gateway Sentinel可以提高系统的可靠性和稳定性。当系统的流量过大或者出现异常时,会自动触发流量控制和熔断策略,保护系统的正常运行。同时,通过监控和日志记录,可以实时了解系统的运行状态和性能指标,方便进行故障排查和性能优化。 总之,Spring Cloud Gateway Sentinel是一个强大的流量控制和故障熔断的组件,可以保护系统免受异常流量的影响,确保系统的稳定性和可靠性。在微服务架构中,它发挥着重要的作用,对于系统的安全和性能优化有着重要的意义。 ### 回答3: Spring Cloud GatewaySpring Cloud生态系统中的一个开源网关项目,它提供了一种统一的的API管理方式,用于处理所有请求并将它们路由到适当的服务上。而Sentinel是一个开源的流量控制和熔断降级的框架,它提供了实时的监控和控制,以保护分布式系统免受故障的影响。 Spring Cloud Gateway集成了Sentinel用于增强网关的功能。它可以通过使用Sentinel进行流量控制和熔断降级,以确保服务的可用性和稳定性。可以根据业务需求,配置规则来限制请求的频率,避免由于高并发造成的系统崩溃,同时还能通过熔断降级机制来防止请求被无效的服务占用,提高整个系统的可靠性。 Spring Cloud Gateway使用Sentinel可以提供实时的流量监控和控制功能,可以根据实时的请求情况对服务进行动态调整。Sentinel可以监控各个服务的QPS(每秒请求数),RT(响应时间)和异常比例等指标,并通过自定义的规则进行实时的流量控制和限制。当某个服务出现异常或超过设定的阈值时,Sentinel可以及时触发熔断降级策略,将请求快速失败,避免传递到后端服务,保护整个系统免受故障的影响。 总之,Spring Cloud Gateway集成Sentinel可以通过流量控制和熔断降级来提高系统的可用性和稳定性,保证服务的高效运行。它能够实时监控服务的运行指标,并根据实时的情况对流量进行动态调整,保护系统免受故障的影响。这是一个非常强大和有用的功能,可以帮助开发人员构建可靠和鲁棒的微服务架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值