【第四阶段 day25】Sentinel简介 Sentinel限流 Sentinel流控规则分析

【第四阶段 day25】Sentinel简介 Sentinel限流 Sentinel流控规则分析,第1张

【第四阶段 day25】Sentinel简介 Sentinel限流 Sentinel流控规则分析

文章目录
  • 1.Sentinel简介
      • 1.1 概述
  • 2.Sentinel限流
      • 2.1 概述
      • 2.2 过程
          • 2.2.1 Sentinel应用于服务的提供方(sca-provider),在pom中添加依赖
          • 2.2.2 在配置文件中,添加Sentinel配置
          • 2.2.3 创建一个Controller对象,用于演示限流 *** 作
          • 2.2.4 启动服务,进行测试
      • 2.3 Sentinel限流
          • 2.3.1 选择需要限流的链路
          • 2.3.2 设置限流策略
          • 2.3.3 反复刷新访问消费端服务,检测是否有限流信息输出
          • 2.3.4 刷新sentinel控制台,实时监控信息
      • *2.4 面试题
  • 3.Sentinel流控规则分析
      • 3.1 阈值类型
      • 3.2 设置限流模式
          • 3.2.1 直接模式
          • 3.2.2 关联模式
          • 3.2.3 链路模式
      • *3.3 面试题
  • 4.Sentinel降级应用
      • 4.1 降级入门

1.Sentinel简介
  • 我们如何在业务流量变化无常的情况下,保证各种业务安全运营,系统在任何情况下都不会崩溃呢?
  • 我们可以在系统负载过高时,采用限流,降级和熔断,三种措施来保护系统,由此一些流量控制中间件诞生,例如sentinel
1.1 概述

sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案,他以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来保护服务的稳定性

承接:

  • 秒杀(突发流量控制在系统容量可以承受的范围)
  • 消息削峰填谷
  • 集群流量控制
  • 实时熔断下游不可用应用

核心:

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

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

2.2 过程 2.2.1 Sentinel应用于服务的提供方(sca-provider),在pom中添加依赖

    com.alibaba.cloud
    spring-cloud-starter-alibaba-sentinel

2.2.2 在配置文件中,添加Sentinel配置

spring:
  cloud:
    sentinel:
      transport:
         dashboard: localhost:8180 # 指定sentinel控制台地址。
2.2.3 创建一个Controller对象,用于演示限流 *** 作

package com.jt.provider.controller;

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

@RestController
@RequestMapping("/provider")
public class ProviderSentinelController {
    @GetMapping("/sentinel01")
    public String doSentinel01(){
        return "sentinel 01 test  ...";
    }
}

2.2.4 启动服务,进行测试


或者

2.3 Sentinel限流

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

2.3.1 选择需要限流的链路

2.3.2 设置限流策略

这里设置1秒内只能请求1次

2.3.3 反复刷新访问消费端服务,检测是否有限流信息输出

此时,我在1秒内请求了多次,出现限流信息

2.3.4 刷新sentinel控制台,实时监控信息

*2.4 面试题
  • Sentinel是什么?(阿里推出的一个流量控制平台,防卫兵)
  • 类似Sentinel的产品还有哪些(hystrix – 一代微服务产品)
  • Sentinel是如何对请求进行限流的(基于sentinel依赖提供的拦截器)
  • 有哪些限流算法(计数器,令牌桶,漏斗算法,滑动窗口算法)
  • Sentinel默认的限流算法是什么(滑动窗口算法)
3.Sentinel流控规则分析 3.1 阈值类型
  • QPS: 当调用相关的url对应的资源时,QPS达到单机阈值时,就会限流
  • 线程数:当调用相关url对应的资源时,线程数达到单击阈值时,就会限流
3.2 设置限流模式

默认 [直接] ,还有关联,链路

3.2.1 直接模式

默认情况下就是【直接->快速失败】

3.2.2 关联模式

比如现在有两个业务,有一个业务相对重要,当这个重要的业务资源达到阈值,另外一个业务被限流

  • 在ProviderSentinelController中添加一个方法
 @GetMapping("/sentinel02")
   public String doSentinel02(){
     return "sentinel 02 test  ...";
   }
  • 在sentinel中做限流设计

3.2.3 链路模式
  • 在指定包创建一个ResourceService类
package com.jt.provider.service;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class ResourceService{
    @SentinelResource("doGetResource")
    public String doGetResource(){
        return "doGetResource";
    }
}

  • 在ProviderSentinelController中添加一个方法
 @Autowired
    private ResourceService resourceService;
    @GetMapping("/sentinel03")
    public String doSentinel03() throws InterruptedException {
    	//请求链路中的资源访问
        resourceService.doGetResource();
        return "sentinel 03 test";
    }
  • 在sentinel中配置限流规则


  • 设置链路流控控制后,在频繁对限流链路进行访问,检测是否出现500异常,若出现,就是限流了
  • 为了不让所有的节点都聚集在sentinel_spring_web_context下面,可以进行以下配置
    链路不执行sentinel_spring_web_context默认聚集
sentinel:
     web-context-unify: false
*3.3 面试题
  • sentinel中的阈值应用类型吗?(两种-QPS,线程数)
  • sentinel的限流规则中默认有哪些限流模式(直连,关联,链路)
  • sentinel的限流效果有哪些(快速失败,预热,排队)
4.Sentinel降级应用
  • 除了流量控制以外,对调用链路中不稳定的资源熔断降级也是保障高可用的重要措施
  • Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(比如说调用超时,异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他资源导致级联错误.当资源被降级以后,在接下来的降级时间窗口内,对该资源的调用都自动熔断(默认行为是抛出
    DegradeException)
4.1 降级入门
  • 在ProviderController 类中添加doSentinel04方法,基于此方法演示慢调用过程下的限流
  //AtomicLong 类支持线程安全的自增自减 *** 作
    private AtomicLong atomicLong=new AtomicLong(1);
    @GetMapping("/sentinel04")
    public  String doSentinel04() throws InterruptedException {
        //获取自增对象的值,然后再加1
        long num=atomicLong.getAndIncrement();
        //设置休眠,目的是为了演示慢调用(响应时间比较长)
        if(num%2==0){//模拟50%的慢调用比例
            Thread.sleep(200);
        }
        return "sentinel 04 test";
    }
  • 服务启动以后,选择要降级的链路


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5608477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存