李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.Sentinel介绍
Leefs
2023-01-14 PM
582℃
0条
[TOC] ### 前言 + 在基于 SpringCloud 构建的微服务体系中,服务间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素。 + 在并发流量比较高的情况下,由于网络调用之间存在一定的超时时间,链路中的某个服务出现宕机都会大大增加整个调用链路的响应时间,而瞬间的流量洪峰则会导致这条链路上所有服务的可用线程资源被打满,从而造成整体服务的不可用,这也就是我们常说的 “雪崩效应”。 + 而在微服务系统设计的过程中,为了应对这样的糟糕情况,最常用的手段就是进行 ”流量控制“ 以及对网络服务的调用实现“熔断降级”。 + 因此,Sentinel 就因运而生了。 ### 一、Sentinel介绍 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以**流量**为切入点,从**流量路由**、**流量控制**、**流量整形**、**熔断降级**、**系统自适应过载保护**、**热点流量防护**等多个维度来帮助开发者保障微服务的稳定性。 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html ### 二、Sentinel特性 Sentinel是分布式系统的流量防卫兵,组成流量防卫兵有如下特性 + **丰富的应用场景**:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 + **完备的实时监控**:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 + **广泛的开源生态**:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。 + **完善的 SPI 扩展机制**:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。  ### 三、Sentinel的开源生态  **Sentinel分为两个部分** + 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 + 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。(**官方提供的这个Dashboard是个简版,上生产环境需要改造**) ### 四、Sentinel 功能和设计理念 #### 4.1 流量控制 + 流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。 + 然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。 + 任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。 + 我们需要根据系统的处理能力对流量进行控制。 Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:  流量控制有以下几个角度: - 资源的调用关系,例如资源的调用链路,资源和资源之间的关系; - 运行指标,例如 QPS、线程池、系统负载等; - 控制的效果,例如直接限流、冷启动、排队等。 Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。 #### 4.2 熔断降级 ##### 什么是熔断降级 除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和Hystrix里面描述的问题是一样的。  Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。 **熔断降级设计理念** 在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。 Hystrix 通过线程池的方式,来对依赖进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。 **Sentinel 对这个问题采取了两种手段**: - 通过并发线程数进行限制 和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。 - 通过响应时间对资源进行降级 除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。 #### 4.3 系统负载保护 Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。 针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。 ### 五、Sentinel 是如何工作的 Sentinel 的主要工作机制如下: - 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。 - 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。 - Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。 ### 六、Sentinel与Hystrix 的对比 | | Sentinel | Hystrix | | :------------- | :--------------------------------------------- | ----------------------------- | | 隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 | | 熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 | | 实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) | | 规则配置 | 支持多种数据源 | 支持多种数据源 | | 扩展性 | 多个 SPI 扩展点 | 插件的形式 | | 基于注解的支持 | 支持 | 支持 | | 限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | | 流量整形 | 支持慢启动、匀速器模式 | 不支持 | | 系统负载保护 | 支持 | 不支持 | | 控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 | | 常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix | ### 七、安装步骤 本次安装的版本是sentinel 1.8.5版本。 **(1)下载Jar包** + *下载地址:https://github.com/alibaba/Sentinel/releases*  **(2)通过cmd启动** ``` java -jar sentinel-dashboard-1.8.5.jar ```  注意:sentinel-dashboard默认端口是8080,如果8080端口被占用可以通过如下配置修改启动端口。 ``` java -jar -Dserver.port=8050 sentinel-dashboard-1.8.5.jar ``` **启动参数说明** + `-Dserver.port`:指定启动的端口,默认8080 + `-Dproject.name`:指定本服务的名称 + `-Dcsp.sentinel.dashboard.server`:指定sentinel控制台的地址,用于将自己注册进入实现监控自己 + `-Dsentinel.dashboard.auth.username=sentinel` 用于指定控制台的登录用户名为 "sentinel",默认值为 “sentinel” + `-Dsentinel.dashboard.auth.password=123456` 用于指定控制台的登录密码为 "123456",默认值为 "sentinel" + `-Dserver.servlet.session.timeout=7200` 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟,需要注意的是,部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。 **(3)访问页面** 浏览器访问如下链接:http://localhost:8080/#/login  登录账号密码均为sentinel/sentinel *附参考文章链接* *https://sentinelguard.io/zh-cn/docs/introduction.html*
标签:
SpringCloudAlibaba
,
Sentinel
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2775.html
上一篇
04.Nacos作为服务配置中心分类配置演示
下一篇
02.Sentinel初始化演示工程
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
40
标签云
MyBatis-Plus
队列
前端
BurpSuite
Beego
随笔
LeetCode刷题
DataX
Sentinel
锁
数据结构和算法
Thymeleaf
MyBatis
Java编程思想
Azkaban
SpringBoot
递归
持有对象
Tomcat
Nacos
排序
容器深入研究
ClickHouse
设计模式
正则表达式
Flink
Spark Core
JavaScript
Kibana
线程池
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞