网站首页 > 精选教程 正文
1 Sentinel简介
1.1 概述
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
1.2 sentinel的主要特性
1.3 sentinel的主要优势和特性
轻量级,核心库无多余依赖,性能损耗小 方便接入,开源生态广泛 丰富的流量控制场景 易用的控制台,提供实时监控、机器发现、规则管理等能力 完善的扩展性设计,提供多样化的 SPI 接口,方便用户根据需求给 Sentinel 添加自定义的逻辑
1.4 sentinel与spring cloud Hystrix 对比
1.5 sentinel分为两个部分
核心库(Java 客户端): 不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持 控制台(Dashboard): 基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器
1.6 Sentinel 基本概念
- 资源 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
- 规则 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
1.7 Sentinel 是如何工作的
Sentinel 的主要工作机制如下:
- 对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
- 根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。
- Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。
2 安装及演示
2.1 Sentinel控制台的下载
下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3
下载下来是个jar包
2.2 Sentinel控制台的启动
cmd 启动jar包
java -jar sentinel-dashboard-1.8.3.jar
2.3 访问
浏览器输入:localhost:8080 账号密码 默认都是 sentinel
2.4 为服务打开sentinel的监控
(1)引入sentinel依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
专栏的上一篇文章已经为项目引入了sentinel的依赖,以及介绍了feign的使用 感兴趣的可以跳转 手把手教你搭建springcloud alibaba微服务–openfeign
(2)yml文件添加sentinel相关配置
server:
port: 9090
spring:
application:
name: mdx-shop-user
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: mdx
group: mdx
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
feign:
sentinel:
enabled: true
启动user服务并访问user服务的测试接口
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("getOrderNo")
public String getOrderNo(String userId,String tenantId,HttpServletRequest request){
return userService.getOrderNo(userId,tenantId,request);
}
}
浏览器访问 http://localhost:9090/user/getOrderNo?userId=mdx123456&tenantId=123
然后查看sentinel控制台
发现已经监控到了我们服务的接口
3 Sentinel的控制规则
本次演示以sentinel 1.8.0版本为例,讲解sentinel中流控、降级、热点、系统、授权五大规则。
3.1 流控规则
流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
- 资源名:接口路径名
- 针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制
- 阈值类型和单机阈值: 1)QPS(每秒请求数量):: 当调用该接口的QPS达到阈值的时候,进行限流 2)线程数:当调用该接口的线程数达到阈值的时候,进行限流
- 是否集群:暂不需要集群
- 流控模式: 1)直接:直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。 2)关联:当指定接口关联的接口达到限流条件时,对指定接口开启限流。 3)链路:A、B接口都在调用C接口,A、B接口谁调用C达到限流条件就限流谁。
- 流控效果: 1)快速失败(默认):直接失败,抛出异常,不做任何额外的处理,是最简单的效果。 2)Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。 3)排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。
3.2 降级规则
- 资源名:接口路径名
- 熔断策略: 慢调用比例(以前的版本也叫RT):选择一个慢调用比例作为阈值。引入一个场景:A模块调用B模块
- 最大RT:Response Time 最大响应时间,即A调用B,B超过这个时间响应即为慢调用。
- 比例阈值:百分比,即访问接口慢调用达到百分之多少时,采用服务降级。
- 熔断时长:即触发熔断后,熔断持续的时长,如A调用B,B响应太慢,因此A模块采用降级处理,在一个时间段之内不会重复调用B。超过这个时间段过后再进行调用。
- 最小请求数:熔断触发的最小请求数(避免1次2次偶尔响应时间慢就开启降级处理,没必要)。
3.3 热点规则
在进行RESTful 设计的时候,一般都需要在 Action 的处理方法中进行请求参数的接收,于是这个时候可以针对于参数进行限流,这种规则就称为热点规则。
热点参数流控规则是一种更细粒度的流控规则, 它允许将规则具体到参数上。
- 资源名:接口路径名
- 参数索引:一般接口都有参数,从接口的第一个参数开始,以0为下标累加,每个参数都有一个下标。每个接口独立计算。
- 单机阈值:接口每秒的访问数。
- 统计窗口时长:限流接口的时效。
- 是否集群:默认不集群。
- 参数例外项:参数例外项就是可以达到更加细粒度的控制,比如我们的某个被设置为限流的参数,可以通过参数例外项设置参数具体等于某个特殊的值的时候,触发不同的限流效果。例如有参数userId,普通设置为一个阈值,当userId等于某个具体的数时,设置特殊阈值。
3.4 系统规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 、CPU使用率和线程数五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量 (进入应用的流量) 生效。
- Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过 系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般 是 CPU cores * 2.5。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
- CPU使用率:当单台机器上所有入口流量的 CPU使用率达到阈值即触发系统保护
3.5 授权规则
授权规则可以对请求方来源做判断和控制。
- 白名单:来源(origin)在白名单内的调用者允许访问
- 黑名单:来源(origin)在黑名单内的调用者不允许访问
- 资源名:接口名
- 流控应用:是来源者的名单。
3.6 使用@SentinelResource配置流控规则
controller
/**
* 使用@SentinelResource标签开启热点参数限流功能
* @SentinelResource(value)对应Sentinel控制台-流控规则-资源名
* @SentinelResource(blockHandeler)指定流控规则生效后的处理函数
*/
@GetMapping("byResource")
@SentinelResource(value = "byResource", blockHandler = "handleException")
public String byResource(){
return "----------------- 按资源名称设置流控规则 -------------------";
}
public String handleException(BlockException exception){
return "-------------------- 流控规则生效后执行的函数 ------------------";
}
Sentinel控制台
使用@SentinelResource标签的好处在于能够自定义流控规则生效后返回的消息。
4 Sentinel 原理及核心概念
4.1 核心概念
- ResourceWrapper
Sentinel 控制的对象即为资源,调用 Entry 方法的时候会 New 一个资源对象,资源由一个全局唯一的资源名称标识。
- Context
Sentinel 的上下文,包含了上下文名称,一个调用链一个 Context,可以显示创建或者在调用 Entry 的时候隐式创建。
- Node
持有运行时的资源的各种统计数据。
- 一个 Resource 在同一个 Context 中有且仅有一个 DefaultNode 与之对应
- 一个 Resource 全局有且仅有一个 ClusterNode
- Entry
代表一次对资源的访问,每访问一个资源都会创建一个 Entry,在 Context 中以一个双向链表存在。
必须调用 exit() 方法的原因就在于这个链表:exit 方法中会判断上下文的当前 entry 是不是 this,此时其他 entry 掉用 exit 会发现不相等,从而抛出异常。
- ProcessorSlot
处理插槽,资源的各种控制都通过不同的 Slot 实现类去完成。
- ProcessorSlotChain
由各个处理插槽组成的链表,每个资源在整个服务中对应一个处理链。
- Rule
用户定义的各种规则。
- RuleManager
加载并管理 Rule。
4.2 工作原理
在 Sentinel 里,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:
- NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
- ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, Thread Count 等等,这些信息将用作为多维度限流,降级的依据;
- StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
- FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
- AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
- DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
- SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量。
整体框架图:
Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。可以自行加入自定义的 slot 并编排 slot 间的顺序,来为 Sentinel 添加自定义功能:
猜你喜欢
- 2024-11-17 SpringCloudAlibabaSentinel熔断限流
- 2024-11-17 2022届秋招Java岗高频面试题盘点,老司机也未必全会,真的太卷了
- 2024-11-17 2022春招,Java面试项目推荐,15个项目吃透两个offer拿到手软
- 2024-11-17 微服务网关如何防止雪崩?阿里开源项目之Sentinel限流、熔断
- 2024-11-17 SpringCloud之Hystrix服务降级
- 2024-11-17 分布式服务限流降级熔断解决方案Nacos之Dashboard界面配置含义
- 2024-11-17 2022年腾讯首发Java岗分布式面试真题,助力金三银四我是认真的
- 2024-11-17 一个可供参考的Java高并发异步应用案例--转
- 2024-11-17 面试官:聊聊服务熔断降级Sentinel
- 2024-11-17 2019年高级Java程序员面试题汇总,含个人答案总结
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)