Sentinel熔断限流组件学习

本文详细介绍了Sentinel在微服务场景中的应用,包括熔断降级、限流降级的重要性和作用。Sentinel作为一个流量治理组件,通过流量控制规则、熔断规则保护服务稳定性。文中通过具体的例子和配置,讲解了Sentinel的工作流程、资源定义和规则设定,如限流规则的QPS计算、熔断规则的慢调用比例和异常数阈值等。此外,还讨论了如何整合Nacos实现规则的远程读取。
摘要由CSDN通过智能技术生成

微服务场景

微服务架构中,切分的服务越多,调用关系就越复杂.
如果在多个服务调用过程中,由于某个服务的实例故障,导致调用失败,延迟,等待.
需要不需要对这种调用失败的问题进行处理,如果不处理会不会有重大影响?
如果不及时解决这个问题,会导致A服务中所有服务实例,访问B服务这个宕机故障节点等待排队,压力向上传递了,积累到一定程度,A服务也会有不可访问的危险.
最终A作为调用者,瘫痪,整个服务调用链路压力上传,全部瘫痪.

熔断降级

上述场景,由调用者处理调用失败,影响导致全部链路瘫痪的问题,要使用的策略叫做熔断降级.

  • 熔断
    牺牲局部,保存全局,就是熔断.(局部就是故障的实例)
    在现有熔断机制中,都是采用断路器的规则.像一个开关一样,一旦发现调用出现临界阈值(故障).断路器将会处在断开状态,实例之间就不可以相互访问,过一段时间,断路器半开状态,允许部分请求访问,如果访问成功,说明故障解除,回归到闭合状态,如果不成功,继续断开状态,循环这个流程.
    短路器的三种状态: 闭合,断开,半开
  1. 发现调用失败,统计失败次数,次数达到断路器断开的要求-- 断开
  2. 断开一段时间之后-- 半开
  3. 半开请求成功执行-- 闭合
  4. 半开的请求没有成功-- 断开
  • 降级
    在服务,功能不可用的时候,采用退而求其次的数据,进行用户请求的响应. 前提条件是 业务组成部分,当前故障的数据,不是必要数据(查询商品的时候,价钱,库存,商品信息是必要数据,但是评论缺少部分,全部缺少并不影响)

限流降级

目的: 限流的目的,防止服务接收超过上限的请求,导致崩溃.
根据服务器性能,配置,所有的实例都有上限访问量,比如 4C8G 运行的一个tomcat软件,承受的并发200-500,占用cpu线程50个左右.不可能无上限的承受访问,为了防止访问雪崩,冲垮服务进程,要对程序做限流处理,超出流量上限的,直接拒绝,或者排队等待,目的是保护服务进程.
访问雪崩: 功能服务集群(微服务),某个实例宕机,并发请求没有消失,压力,转给了其他人.
流量计算中的一些概念和公式: RT qps 并发 日pv量.

  • RT: Reaction Time 表示一次请求,服务器处理时长.
    • 服务器没有连接任何工具,mysql,redis,es,rocketmq. SS框架. 请求10ms内(时间花费90%都在
      网络上)
    • 如果有第三方工具(redis),10ms左右
    • 如果有第三方工具(mysql数据库),30-50ms,考虑表格的具体数据量大小,考虑表格的优化.
  • QPS: web应用中,每秒访问的请求次数.
  • 并发: web应用中,同时在服务器中存在的请求数据量(线程处理的请求). 服务器实例,web实例的并发是有上限的(很大一部分程度取决于CPU,另一部分取决于代码设计,系统调优)
  • 日pv(page view)量: pv 表示一次请求(静态数据 js css html json, 动态数据),和QPS有紧密的关系.
    需要通过pv计算QPS.
    QPS=并发/RT 一般计算上限使用的公式.
    日pv=2亿 能计算平均qps 2300/s,不是最高QPS. 计算原则: 2/8原则, 20%时间段产生80%pv量.
    2亿0.8/(240.2*3600)=9000/s 如果每个服务3000/s 需要3台
    假设问的问题: 集群什么规模,qps最高多少 pv多少?
  1. 日pv=10个亿 (RT预估80ms tomcat并发100 单台qps1250) 总qps上限 5万 40台.
  2. 数据库规模 redis规模(运维负责搭建集群 mysql 2000/s(10个左右) redis 1万/s(6个左右))

sentinel介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

重要的核心概念

资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

准备一个测试的工程

添加依赖

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	</dependency>
</dependencies>

定义资源

硬编码的方式,定义代码中某个代码片段为资源.

@RestController
public class HelloController {
   
    @Autowired
    private HelloService helloService;
    @GetMapping("/hello")
    public String sayHi(String name){
   
        //准备资源的入口 entry
        Entry entry=null;
        try{
   
            //对资源赋值,定义资源的名字
            entry= SphU.entry("sayHi");
            String result=helloService.sayHi(name);
            return result;
        }catch(FlowException e){
   
            //捕获异常之后,编写降级的逻辑
            return "对不起,您的请求,被流控了";
        }catch (BlockException e){
   
            //捕获异常之后,编写降级的逻辑
            return "对不起,您的请求,被blocked";
        }finally {
   
            //释放资源
            if (entry!=null){
   
                entry.exit();
            }
        }
    }
}

定义规则

如果sentinel可以控制熔断和限流的逻辑,本质就是控制资源,控制资源里包裹的代码,服务等.
如何控制,取决于我们在项目程序中植入的规则.
入门案例的规则需求定义: 限流规则.
在启动类中,定义规则内容.每秒钟qps 超过1个,就对sayHi资源做限流控制,一旦限流,sentinel会在调用资源时抛出异常.

@SpringBootApplication
public class SentinelD1App {
   
    public static void main(String[] args) {
   
        SpringApplication.run(SentinelD1App.class,args);
        //启动类,定义限流规则,熔断规则,每个规则,都针对自己的资源设置
        List<FlowRule> rules=new ArrayList<>();
        FlowRule flowRule=new FlowRule();
        //告诉这个流量控制规则,你限制的资源是谁
        flowRule.setResource("sayHi");
        //设置规则 qps上限是1/s count是上限阈值
        flowRule.setCount(150
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值