首页 > 其他分享 >五、Sentinel介绍

五、Sentinel介绍

时间:2023-06-17 21:01:17浏览次数:34  
标签:降级 请求 介绍 线程 流量 Sentinel 资源

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

一、Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

二、Sentinel 功能和设计理念

流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
  • 运行指标,例如 QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级

什么是熔断降级

除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。

Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。

熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。

Sentinel 对这个问题采取了两种手段:

通过并发线程数进行限制

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。

通过响应时间对资源进行降级

除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

系统负载保护

Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

流控降级与容错标准

Sentinel 社区正在将流量治理相关标准抽出到 OpenSergo spec 中,Sentinel 作为流量治理标准实现。

三、简单使用

Sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

 

这里用springBoot项目做简单演示:

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

    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
        <version>1.8.6</version>
    </dependency>

导入依赖。新建controller:

@RestController
public class MyController {

    @RequestMapping("/hello")
    public String hello() throws BlockException {
        initFlowRules();
        try (Entry entry = SphU.entry("HelloWorld")) {
            // 被保护的逻辑
            return "hello";
        } catch (BlockException ex) {
            throw ex;
            // 处理被流控的逻辑
          //  return "系统访问人数较多,请稍后访问";
        }
    }
    
    private static void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("HelloWorld");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // Set limit QPS to 20.
        rule.setCount(20);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

initFlowRules配置流控规则,RuleConstant.FLOW_GRADE_QPS表示QTS,即每秒请求数。这里设置最大值是20。也就是每秒最多处理20个请求。把需要控制流量的代码用 Sentinel API SphU.entry("HelloWorld") 和 entry.exit() 包围起来即可。这里用try-with-resources 特性。启动后用jemeter测试:

1、请求数是10时的汇总报告:
 

 

可以看到异常率是0。

2、请求数是20时的汇总报告(新建的汇总报告):
 

 
可以看到异常率还是0。

3、请求数是40时的汇总报告(新建的汇总报告):
 

 

4、请求数是300时的汇总报告(新建的汇总报告):
 

 

标签:降级,请求,介绍,线程,流量,Sentinel,资源
From: https://www.cnblogs.com/shigongp/p/17488079.html

相关文章

  • 项目介绍+环境搭建
    项目介绍+环境搭建1、什么是神领物流是一个基于微服务架构体系的【生产级】物流项目系统神领物流系统类似顺丰速运,是向C端用户提供快递服务的系统2、公司组织架构公司有六个一级部门java开发位于信息中心部门,主要负责集团新系统的研发、维护、更新迭代该部门下有三个二......
  • KeepAlived和HAproxy的介绍和原理及应用
    KeepAlived是一款基于VRRP协议实现的负载均衡软件,可以在多个服务器节点之间实现高可用部署和负载均衡。它通过检测后端节点的健康状态,将请求分发到可用的节点上。同时,Keepalived还支持多种健康检查方式和自定义的负载均衡算法,可以满足不同场景的需求。HAproxy是一款高性能的负载均......
  • Day02 2.1 逆向基本流程介绍
    逆向基本流程介绍1获取目标app(官网,豌豆荚),安装到手机上2使用抓包工具抓包分析(charles,fiddler,Wireshark。。)3使用反编译工具(JADX、JD-GUI),反编译apk成java代码,分析代码,定位代码位置4使用动态分析工具,如Frida、XposedFramework等,在运行时跟踪应用程序的行为和交互。理解应......
  • MongoDB入门介绍
    MongoDB简介MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库数据特征数据存储量较大,甚至是海量对数据读写的响应速度要求较高某些数据安全性要求不高,可以接受一定范围内的误差MongoDB存储......
  • 如何翻译 Markdown 文件?-2-几种商业及开源解决方案介绍
    背景近期在搭建英文博客-<e-whisper.com>,需要对现有的所有中文Markdown翻译为英文。需求如下:将Markdown文件从中文(zh-CN)翻译为英文(en)翻译后要保留Markdown的完整格式部分Markdownblock不需要翻译,如:front-matter、代码块等但是实际使用中,试了好几款翻译(......
  • 当前高校火灾隐患问题分析及预防校园火灾知识介绍
    安科瑞虞佳豪近几年,随着高校的扩招,高校的师生也在不断增加,办学规模不断扩大。而校园作为特殊的公共场所,都有个共同特点:场地分散、积大、管理人员少,学生人数众、活泼好动、防范意识差。学校的实验室、学生活动中心、运动场、图书馆、学生宿舍、餐厅、教学楼等公共场合都存在电气火灾......
  • 电源参数计算常用的Mathcad功能介绍
    mathcad作为一款常用的数学计算软件,在很多个领域都用应用。本文用于总结在电源参数计算常用的功能或者函数。  一、分段函数在变量后面输入英文状态下的]键,就能出现分段函数的格式,将函数f(x)分为两段,再次按]键,将函数分为三段。不过分段函数一般是结合其他函数命令......
  • Zero-Shot, One-Shot, and Few-Shot Learning概念介绍
    导语本文将介绍零样本学习、一次样本学习和少样本学习的概念,它们使得机器学习模型能够在仅有有限数量的示例情况下对对象或模式进行分类和识别。在机器学习中,我们通常需要大量的训练数据来训练模型,以便它能够准确地识别和分类新的输入。然而,在现实世界中,获取大规模标记数据集可能是......
  • 如何翻译 Markdown 文件?-2-几种商业及开源解决方案介绍
    背景近期在搭建英文博客-<e-whisper.com>,需要对现有的所有中文Markdown翻译为英文。需求如下:将Markdown文件从中文(zh-CN)翻译为英文(en)翻译后要保留Markdown的完整格式部分Markdownblock不需要翻译,如:front-matter、代码块等但是实际使用中,试了好几款翻译......
  • 安科瑞远程预付费管理系统设计的意义与具体功能介绍
    安科瑞虞佳豪《安科瑞远程预付费管理系统》是安科瑞公司新研制的与DDSY-1352单相电子式预付费电能表及DTSY-1352三相电子书预付费电能表配套的售电管理系统。它是以电能管理软件和集中抄表软件为主,包括计算机,通讯管理机,打印机等设置在内的集成系统。另外可以选配远传阀......