文章目录
一、Setinel
1.什么是sentinel?
sentinel在 springcloud Alibaba 中的作用是实现熔断和限流。类似于Hystrix豪猪。
2.sentinel有啥用
服务雪崩、服务降级、服务熔断、服务限流
3.sentinel的主要特性
4.sentinel启动
条件:安装sentinel、JDK8环境、8080端口未被占用
到sentinel的安装目录下,使用java -jar sentinel-dashboard-1.8.3.jar
启动。浏览器访问localhost:8080
,用户名和密码都是sentinel。
5.sentinel初始化监控
新建cloudalibaba-sentinel-service8401
(1)pom.xml
<dependencies>
<!-- 后续做Sentinel的持久化会用到的依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- springcloud alibaba nacos 依赖,Nacos Server 服务注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- springboot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 日常通用jar包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(2)application.yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
# nacos服务注册中心地址
server-addr: localhost:8848
sentinel:
transport:
# 配置sentinel dashboard地址
dashboard: localhost:8080
# 默认8719端口,加入被占用会自动从8719每次加1扫描,直到扫描未被占用的端口
port: 8719
management:
endpoints:
web:
exposure:
include: '*' # 监控的东西
(3)业务控制类
@RestController
public class SentinelController {
@GetMapping("/testA")
public String testA(){
return "testA-----";
}
@GetMapping("testB")
public String testB(){
return "testB-----";
}
}
(4)主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class SentinelMain8401 {
public static void main(String[] args) {
SpringApplication.run(SentinelMain8401.class,args);
}
}
启动Nacos,启动sentinel,启动8401微服务后台查看sentinel控制台
你会发现什么也没有,因为sentinel采用的是懒加载机制,执行访问一次即可监控到。
二、流控
1.各种流控规则
2.重要属性
3.编辑流控规则
1.流控模式
1.1 直接失败
直接:当api达到限流条件时,直接限流自己。
QPS直接失败和线程数直接失败的区别:
QPS 类似于银行的保安 :所有的请求到Sentinel 后,他会根据阈值放行,超过报错
线程数类似于银行的窗口:所有的请求会被放进来,但如果阈值设置为1 那么,其他的请求就会报错也就是,银行里只有一个窗口,一个人在办理业务中,其他人跑过来则会告诉你,不行,没到你
1.2 关联
关联:当关联的资源达到阈值时,就限流自己。
举个栗子:支付接口达到阈值,就限流下订单接口,防止连坐效应。
1.3 链路
2.流控效果
2.1 快速失败
直接—>快速失败(默认的流控处理)
2.2 Warmup(预热)
举个栗子:秒杀系统在刚开始的一瞬间,会有很多的请求打进来,Warmup(预热)可以保护系统,使请求慢慢增加,防止系统挂掉。
2.3 排队等待
3.降级
Sentinel熔断降级会在调用链路中某个资源出现不稳定的状态时(例如调用超时或异常比例升高)。对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。
当资源降级后,在接下来的降级时间窗口之内,对该资源的调用都会自动熔断
Sentineld的熔断器没有半开的状态,Hystrix存在半开状态
半开的状态系统自动去检测是否请求异常,没有异常就关闭断路器恢复异常,有异常则继续打开断路器不可用
3.1 RT(平均响应时间)
平均响应时间(DEGRADE_GRADE_RT):当一秒内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阀值(毫秒为单位)那么在接下来的时间窗口(秒为单位)内对这个方法的调用都会自动熔断。注意:RT最大4900(更大的需要通过-Dcsp.Sentinel.statistic.max.rt=XXXX才能生效)
3.2 异常比例
异常比例(DEGRADE-GRADE-EXCEPTION-RATIO):当资源的每秒请求量>=5,并且每秒异常总数占通过的比值超过阈值(DegradeRule中的count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRu1e中的timeWindow,,以s为单位)之内,对这个方法的调用都会自动地返回。异常b阈值范围是[0.0,l.0],代表0%一100%。
3.3 异常数
异常数:当资源接近一分钟的异常数目超过超过阀值之后会进行熔断。注意由于统计时间的窗口是分钟级别的,若timeWindow小于60s,则结束熔断后仍可能进入熔断状态(时间窗口一定要大于等于60秒)
4.热点key限流
4.1 何为热点?
热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的TopK数据,并对其访问进行限制。比如:
- 商品ID为参数,统计一段时间内最常购买的商品ID并进行限制
- 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制
参数限流会统计传入参数中的参数,并根据配置流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
兜底方法分为系统默认和客户自定义两种,之前的case,限流出问题后,都是用sentinel系统默认的提示Blocked by Sentinel (flow limiting),我们可以定义一个类似于hystrix,某个方法出问题后找到对应的兜底方法
4.2 参数例外项
上述案例演示了第一个参数p1,当QPS超过一秒一次点击后马上限流,但我们期望p1的参数当他是某个特殊值时,他的限流和平时不一样,假如当p1等于5时,他的阀值可以达到10
说明:
@SentinelResource :处理的是Sentine1控制台配置的违规情况,有blockHandler方法配置的兜底处理
@RuntimeException:int age=10/0,这个是java运行时报出的运行时异常RunTimeException,@Sentine1Resource不管
5.系统规则
5.1 系统自适应限流
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
5.2 系统规则支持以下的模式
- Load自适应:系统的load作为启发的指标,进行自适应系统保护,当系统的load超过预定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段),系统容量由系统的maxQPSminRT估算得出,设定参考值一般为CPU cores2.5
- CPU usage(1.5.0+版本):当系统CPU的使用率超过阈值即触发保护系统(取值范围0.0-1.0),比较灵敏
- 平均RT:当单台机器上所有入口流量的平均RT达到阀值即触发保护系统,单位是毫秒
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阀值即触发保护系统
- 入口QPS:当单台机器上所有入口流量的QPS达到阀值即触发保护系统
6.服务熔断
fallback负责业务异常
blockHandler值赋值控制台sentinel配置违规
@SentinelResource(value = “fallback”,fallback =“handlerFallback”,blockHandler = “blockHandler”)若block和Handler都进行就配置,则被迫降级而报出的BlockException是只会进入blockHandler处理逻辑
7.sentinel持久化
将限流配置规则持久化建nacos保存,只要刷新某个rest地址,sentinel控制台的流控规则就能看到,只要nacos里面的配置不删除,sentinel的流控规则持久有效。
目前的sentinel 当重启以后,数据都会丢失,和 nacos 类似原理。需要持久化。它可以被持久化到nacos 的数据库中。
三、分布式事务
分布式面临的事务问题
单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。
业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
1.什么是seata?
seate是一款开源的分布式事务解决方案,致力于微服务构架下提供高性能和简单易用的分布式事务服务。
2.seata的组成
seate是一个典型的分布式事务处理过程,由一个ID和三组件模型组成
一个ID:全局唯一的事务ID
三组件:
① TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
② TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
③ RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
3.处理过程