springcloud~Sentinel

介绍

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

历史

2012 年,Sentinel 诞生,主要功能为入口流量控制。
2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
2018 年,Sentinel 开源,并持续演进。
2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。
2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。

基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

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

Sentinel 功能和设计理念

流量控制

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

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

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
  • 运行指标,例如 QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、排队等。
    Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级

什么是熔断降级

除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。
springcloud~Sentinel
Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。

熔断降级设计理念

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

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

  • 通过并发线程数进行限制
    和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
  • 通过响应时间对资源进行降级
    除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

系统负载保护

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

如何工作的

Sentinel 的主要工作机制如下:

  • 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
  • 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
  • Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

流控降级与容错标准

Sentinel 社区正在将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。有关 Sentinel 流控降级与容错 spec 的最新进展,请参考 opensergo-specification,也欢迎社区一起来完善标准与实现。
springcloud~Sentinel

原文链接:https://www.cnblogs.com/lori/p/17373683.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springcloud~Sentinel - Python技术站

(0)
上一篇 2023年5月5日
下一篇 2023年5月5日

相关文章

  • Java中this,static,final,const用法详解

    Java中this、static、final和const用法详解 一、this关键字 1.1 this指代当前对象 在Java中,this关键字可以用来指代当前对象。它通常被用于以下情况: 在一个构造函数中,用来区分成员变量和方法参数。 在一个方法中,用来访问当前对象的成员变量或者其他方法。 下面是一个使用this关键字的简单例子: public class…

    Java 2023年5月26日
    00
  • SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化

    简介在前后端分离的开发模式中,前端使用HTML、CSS和JavaScript等技术提供页面交互体验,向后台服务器发送请求获取数据,后台服务器处理请求并返回数据给前端,前端页面呈现出处理后的数据。本次攻略使用SpringBoot+JSON+AJAX+ECharts实现了一个前后端分离开发可视化的实例。具体实现过程如下。 技术栈 SpringBoot:后端框架 …

    Java 2023年5月20日
    00
  • Tomcat源码解析之Web请求与处理

    Tomcat源码解析之Web请求与处理 前言 Tomcat 是一个流行的Web应用服务器,也是一个开源项目。对于二次开发者,学习Tomcat的源码是非常有益的。本文将对Tomcat的Web请求与处理进行深入的源码解析。 一、Tomcat的主要入口 Tomcat的Http处理入口是由org.apache.catalina.core.StandardHostVa…

    Java 2023年5月20日
    00
  • Springboot集成restTemplate过程详解

    下面是详细讲解“Springboot集成restTemplate过程详解”的完整攻略。 介绍 在Springboot中,restTemplate是一个常用的HTTP客户端,用于发送REST请求和接收REST响应。本文将介绍如何在Springboot中集成restTemplate。 步骤 步骤1:添加依赖 首先,在项目的pom.xml文件中添加以下依赖: &l…

    Java 2023年5月15日
    00
  • java 一个截取字符串的函数

    当我们需要截取字符串的某一部分时,Java中提供了多种方式来实现。下面是使用Java标准库中的函数来截取字符串的示例攻略: 步骤1:了解substring()函数 Java提供了一个原生函数 substring(),它可以从一个字符串中截取出部分内容。 substring() 函数签名如下: public String substring(int begin…

    Java 2023年5月26日
    00
  • spring jpa集成依赖的环境准备及实体类仓库编写教程

    下面就为您详细讲解“spring jpa集成依赖的环境准备及实体类仓库编写教程”。 准备环境 在集成 spring jpa 之前,需要先准备好以下环境: Maven Java JDK Spring Boot 添加依赖 在 pom.xml 文件中,添加以下依赖: <dependencies> <dependency> <group…

    Java 2023年5月20日
    00
  • 22基于java的电影院售票管理系统

    项目背景 随着互联网和电子商务的快速发展,开发一个电影院订票系统来帮助电影院对电影信息,售票信息进行统一化的信息管理; 遇到的问题 在设计的过程中,需要解决以下的几个问题: 电影院会有多个播放厅,从而在同一时间播放不同的电影来满足客户需求 每个厅的大小可能不同,即容纳的人数不同 电影院会不断引进新片 电影院会把电影安排在各个播放厅的不同时间段来进行播放,即会…

    Java 2023年5月5日
    00
  • Java interrupt()方法使用注意_动力节点Java学院整理

    Java中的interrupt()方法用于中断线程的执行。但是,在使用interrupt()方法时需要注意一些问题。下面是使用Java interrupt()方法的注意事项: 1. 如何中断线程? 使用interrupt()方法中断线程,有以下几个步骤: 在线程中使用isInterrupted()或Thread.interrupted()等方法获取中断状态。…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部