Sentinel实现熔断与限流

本文介绍了Sentinel在分布式服务中的流量控制应用,包括下载和启动流程,Nacos集成,配置Sentinel规则,并展示了如何通过关联和链路模式实现服务限流。重点讲解了预热和排队等待策略在实际场景中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sentinel 是什么

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

下载sentinel链接:https://pan.baidu.com/s/1B8XG1138G4-fXGi66vnN-Q 
提取码:tiuj

开启sentinel 

C:\Users\DELL>cd D:
D:\

C:\Users\DELL>cd D:\Download

C:\Users\DELL>D:

D:\Download>java -jar sentinel-dashboard-1.7.2.jar

开启成功的页面如下

 访问sentinel管理界面:(这里8080端口不能被其他占用)

http://localhost:8080

登录账号密码均为sentinel

启动nacos8848成功 

1.新建Module

cloudalibaba-sentinel-service8401

2.改POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.liang.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-sentinel-service8401</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.liang.springcloud</groupId>
            <artifactId>common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</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-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

3.写yaml

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口

management:
  endpoints:
    web:
      exposure:
        include: '*'

4.主启动

package com.atgui.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class SentinelMain8401 {
    public static void main(String[] args) {
        SpringApplication.run(SentinelMain8401.class,args);
    }
}

 5.controler

package com.atgui.springcloud.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FlowlimitController {
    @GetMapping("/testA")
    public  String testA(){
        return "------testA";
    }

    @GetMapping("/testB")
    public  String testB(){
        return "------testB";
    }
}

流控规则 

资源名:唯一名称,默认请求路径
针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
阈值类型/单机阈值:
      QPS(每秒的请求数量):当调用改API的QPS达到阈值的时候,进行限流
      线程数:当调用改API的线程数达到阈值的时候,进行限流
流控模式:
      直接:api达到限流条件时,直接限流
      关联:当关联的资源达到阈值时,就限流自己
      链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流【api级别的针对来源】)
流控效果:
     快速失败:直接失败,抛异常
     Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
     排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

一秒内可以查询一次,若次数超过1次,就直接快速失败,报默认错误。

测试:
快速点击访问http://localhost:8401/testA

关联

  • 是什么?

当关联的资源达到阈值时,就限流自己

当与A关联的资源B达到阈值后,就限流自己

 当关联资源/testB的qps阈值超过1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名

 大批量线程高并发访问B,导致A失效了

链路

多个请求调用了同一个微服务

新增方法

两个方法调用一个资源 

预热 

  • 说明
    公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

  • 官网
    默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值。
    限流 冷启动

  • Warmup配置
    默认coldFactor为3,即请求QPS从(threshold/3)开始,经多少预热时长才逐渐升至设定的QPS阈值。
    阈值为10+ 预热时长设置5秒
    系统初始化的阈值为10/3 约等于3,即阈值刚开始为3;然后过了5秒以后慢慢升高至10

 应用场景
如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统、可以慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值

排队等待

匀速排队,阈值必须设置为QPS

这种方式主要用于处理间隔性突发的流量,例如消息队列,想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值