一、Sentinel 简介
1、Sentinel 是什么
一句话解释就是我们之前用过的 Hystrix。由于 Hystrix 存在以下弊端:
- 需要我们程序员自己手工搭建监控平台
- 没有一套 web 界面可以给我们进行更加细粒度化的配置流控、速率控制、服务熔断、服务降级等
而 Sentinel 则解决以上问题:
- 单独一个组件,可以独立出来
- 直接界面化的细粒度统一配置
所以,项目一般选择 Sentinel 作为 Hystrix 的替代品。
2、Sentinel 解决的问题
主要解决服务中的一下问题:
- 服务雪崩
- 服务降级
- 服务熔断
- 服务限流
什么是熔断
A 服务调用 B 服务的某个功能,由于网络不稳定问题,或者 B 服务卡机,导致功能时间超长,如果这样子次数太多,我们就可以直接将 B 断路(A 不在请求 B 接口),凡是调用 B 的请求直接返回降级数据,不必等待 B 的超长执行,这样,B 的故障问题就不会级联影响到 A。
什么是降级
整个网站处于流量高峰期,服务器压力剧增,根据当前业务情况及流量,对一些服务和页面进行有策略的降级停止服务,所有的调用直接返回降级数据,以此缓解服务器资源的压力。这样既可以保证核心业务的正常运行,同时也保证了客户和大部分客户的请求能够得到正确的响应。
熔断和降级的异同点
相同点:
- 为了保证集群大部分服务的可用性和可靠性,防止崩溃,牺牲小我,保全大家;
- 用户最终都是体验到某个功能不可用。
不同点:
- 熔断是被调用方故障,触发的是系统的主动规则;
- 降级是基于全局考虑,停止一些正常服务,释放资源。
限流
对打入服务的请求流量进行控制,使服务能够承担不超过自己能力的流量压力。
更多介绍请参考官网文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
二、Sentinel 应用
1、安装 Sentinel 控制台
Sentinel 组件由两部分构成:
- 后台:核心库(Java客户端),不依赖任何框架/库,能够非运行于所有 Java 环境中,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 前台(8080端口):控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
安装步骤如下:
从官网中下载安装包:https://github.com/alibaba/Sentinel/releases
运行命令(注意要搭建好 Java8 环境并且 8080 端口不能被占用):
java -jar sentinel-dashboard-1.8.0.jar
运行成功之后就可以访问 Sentinel 管理界面:
- 访问网址:http://localhost:8080
- 登录账号密码均为 sentinel
2、项目整合 Sentinel
1)、引入依赖:
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2)、配置 YML 文件:
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 # 配置Sentinel dashboard地址
port: 8719 # 默认 8719 端口,假如被占用会自动从 8719 开始依次 +1 扫描,直到找到未被占用的端口
3)、启动服务并后台查看 Sentinel 控制台
由于 Sentinel 的懒加载机制,刚启动的微服务并不会显示在 Sentinel 控制台上,只用执行依次服务访问后才会出现在 Sentinel 控制台上。
三、Sentinel 功能介绍
Sentinel 控制台中的每个监控服务都包含一下功能服务:
- 实时监控
- 簇点链路
- 流控规则
- 降级规则
- 热点规则
- 系统规则
- 授权规则
- 集群流控
- 机器列表
1、流控规则
图片2
- 资源名:唯一名称,默认请求路径
- 针对来源:Sentinel 可以针对调用者进行限流,填写服务名,默认 default(不区分来源)
- 阈值类型/单机阈值:
- QPS(每秒钟请求数量):当调用该 api 的 QPS 达到阈值的时候,进行限流
- 线程数:当调用该 api 的线程数达到阈值的时候,进行限流
- 是否集群:不需要集群
- 流控模式:
- 直接:api 达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路:之记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值就进行限流)
- 流控效果:
- 快速失败:直接失败,抛异常
- Warm Up:根据 codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的 QPS 阈值
- 排队等候:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为 QPS,否则无效
流控效果的 Warm Up(预热)的应用场景如:秒杀系统在开启瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。
更多流控规则文档可以参考官方文档:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
未完待续。。。