三、Sentinel限流熔断

本文详细介绍了Sentinel的安装与使用,包括Sentinel的简介、限流入门、流控规则分析、降级入门及策略、热点规则、系统规则和授权规则。Sentinel是阿里巴巴开源的流量防护工具,提供限流、降级和熔断等功能,确保服务在高流量和异常情况下的稳定性。文章通过实例展示了Sentinel如何在Java应用中集成和配置,以及不同场景下的流控和降级策略。
摘要由CSDN通过智能技术生成

1.Sentinel简介

1.1 背景分析

在我们日常生活中,经常会在淘宝、天猫、京东、拼多多等平台上参与商品的秒杀、抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票、高铁票,甚至有时候还要帮助同事、朋友为他们家小孩拉投票、刷票,这些场景都无一例外的会引起服务器流量的暴涨,导致网页无法显示、APP反应慢、功能无法正常运转,甚至会引起整个网站的崩溃。
我们如何在这些业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?我们可以在系统负载过高时,采用限流、降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生。例如Sentinel。

1.2 Sentinel概述

Sentinel (分布式系统的流量防卫兵/哨兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

Sentinel核心分为两个部分:

  • 核心库(Java 客户端):能够运行于所有 Java 运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):基于 Spring Boot 开发,打包后可以直接运行。

1.3 安装Sentinel服务

Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能,其控制台安装步骤如下:
第一步:打开sentinel下载网址

https://github.com/alibaba/Sentinel/releases

第二步:下载Jar包(可以存储到一个sentinel目录),如图所示:
在这里插入图片描述
第三步:在sentinel对应目录,打开命令行(cmd),启动运行sentinel

java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

检测启动过程,如图所示:
在这里插入图片描述
若在IDEA中启动sentinel。配置如下:
在这里插入图片描述

1.4 访问Sentinal服务

第一步:假如sentinel启动ok,通过浏览器进行访问测试,如图所示:
在这里插入图片描述
第二步:登陆sentinel,默认用户和密码都是sentinel,登陆成功以后的界面如图所示:
在这里插入图片描述

2.Sentinel限流入门

2.1 概述

我们系统中的数据库连接池,线程池,nginx的瞬时并发,MQ消息等在使用时都会跟定一个限定的值,这本身就是一种限流的设计。限流的目的防止恶意请求流量、恶意攻击,或者防止流量超过系统峰值。

2.2 Sentinel集成

第一步:Sentinel 应用于服务消费方(Consumer),在消费方添加依赖如下:

<!--sentinel 依赖(当添加了这个依赖之后,会默认为当前项目添加一个拦截器)-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

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

第二步:打开服务消费方配置文件application.yml,添加sentinel配置,代码如下:

spring:
  cloud:
    sentinel:
      transport:
         dashboard: localhost:8180 # 指定sentinel控制台地址。
         #port: 8099 #跟sentinel控制台交流的端口,随意指定一个未使用的端口即可,默认是8720,可以不写

第三步:启动服务提供者,服务消费者,然后在浏览器访问消费者url,如图所示:
在这里插入图片描述

第四步:刷新sentinel 控制台,检测服务列表,如图所示:
在这里插入图片描述
Sentinel的控制台其实就是一个SpringBoot编写的程序,我们需要将我们的服务注册到控制台上,即在微服务中指定控制台的地址,并且还要在消费端开启一个与sentinel控制台传递数据端的端口,控制台可以通过此端口调用微服务中的监控程序来获取各种信息

2.3 Sentinel限流快速入门

我们设置一下指定接口的流控(流量控制),QPS(每秒请求次数)单机阈值为1,代表每秒请求不能超出1次,要不然就做限流处理,处理方式直接调用失败。

第一步:选择要限流的链路,如图所示:
在这里插入图片描述
第二步:设置限流策略,如图所示:
在这里插入图片描述
第三步:反复刷新访问消费端服务,检测是否有限流信息输出,如图所示:
在这里插入图片描述

3.Sentinel流控规则分析

3.1 阈值类型分析

  • QPS(Queries Per Second):当调用相关url对应的资源,QPS达到单机阈值时,就会限流。
  • 线程数:当调用相关url对应的资源时,线程数达到单机阈值时,就会限流。

3.2 设置限流模式

Sentinel的流控模式代表的流控的方式,直接【默认】、关联、链路。

  1. 直接模式

Sentinel默认的流控处理就是【直接->快速失败】。
在这里插入图片描述

  1. 关联模式

当关联的资源达到了阈值时,就限流自己。例如设置了关联资源为/url2时,若关联资源/url2的qps阀值超过1时,就限流/url1接口(是不是感觉很霸道,关联资源达到阀值,是本资源接口被限流了)。这种关联模式有什么应用场景呢?我们举个例子,订单服务中会有2个重要的接口,一个是读取订单信息接口,一个是写入订单信息接口。在高并发业务场景中,两个接口都会占用资源,如果读取接口访问过大,就会影响写入接口的性能。业务中如果我们希望写入订单比较重要,要优先考虑写入订单接口。那就可以利用关联模式;在关联资源上面设置写入接口,资源名设置读取接口就行了;这样就起到了优先写入,一旦写入请求多,就限制读的请求。例如:
在这里插入图片描述
在这里插入图片描述

  1. 链路模式

链路模式只记录指定链路入口的流量。也就是当多个服务对指定资源调用时,若流量超出了指定阈值,则进行限流。被调用的方法用@SentinelResource进行注解,然后分别用不同业务方法对此业务进行调用,假如A业务设置了链路模式的限流,在B业务中是不受影响的。例如现在设计一个业务对象,代码如下:

package com.cy.service;

@Service
public class ConsumerService {
   

    /** @SentinelResource 描述的方法会作为一个限流链路中的叶子节点*/
    @SentinelResource("doGetResource")
    public String doGetResource(){
   
        //...这里后续可以写对数据库资源的访问
        return "doGetResource";
    }
}

接下来我们在/consumer/doRestEcho1对应的方法中对ConsumerService中的doGetResource方法进行调用(应用consumerService对象之前,要先在doRestEcho01方法所在的类中进行consumerService值的注入)。例如:

package com.cy.controller;

@RestController
public class ConsumerController {
   

	@Value("${spring.application.name}")
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

꯭ 瞎꯭扯꯭蛋꯭

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值