第一章 Sentinel

1. 雪崩问题

1.1 应对方案

2. Sentinel

2.1 流控模式

(1)直接模式:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式

(2)关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

(3)链路模式:统计从指定链路访问到本地资源的请求,触发阈值时,对指定链路限流

2.2 流控效果

流控效果是指请求到达流控阈值时应该采取的措施。

(1)快速失败:达到阈值后,新的请求会被立刻拒绝并抛出FlowException异常。是默认的处理方式。

(2)warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

(3)排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长。

2.3 线程隔离

2.3.1 线程隔离的两种手段是?

信号量隔离

线程池隔离

2.3.2 信号量隔离的特点是?

基于计数器模式,简单,开销小;

Sentinel的线程隔离就是信号量

2.3.3 线程池隔离的特点是?

基于线程池模式,有额外开销,但隔离控制更强

2.4 熔断降级

2.4.1 熔断策略

(1)慢调用比例:

超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断。

(2)异常比例:

统计单位时长内异常调用的比例,超过阈值则熔断

(3)异常数:

统计单位时长内异常调用的次数,超过阈值则熔断

2.5 规则持久化

(1)原始模式:保存在内存

(2)pull模式:保存在本地文件或数据库,定时去读取

(3)push模式:保存在nacos,监听变更实时更新

3. 踩坑记录

1.依赖兼容性

https://www.jianshu.com/p/9e847aca49c3

这个兼容性问题让我吃了不少苦😭

2.在编写feign的降级逻辑代码时,出现一个想法:

在UserClientFallBackFactory类上添加@Component注解,而不是用@Bean注解在逻辑上不是一样吗?

通过实际运行程序,发现报错:找不到该对象。后来仔细想了想发现问题的原因:

在Spring框架中,当你想要将第三方库中的组件集成到你的应用中时,由于你无法修改第三方库的源代码来添加 @Component注解,因此不能直接使用Spring的自动装配功能。这是因为 @Component是一个类级别的注解,它允许Spring通过类路径扫描自动检测并注册这些组件为Bean。但是,对于第三方库中的类,你并没有这样的权限或能力去修改它们的代码。

在这种情况下,你可以使用 @Bean注解来达到相同的目的。@Bean是一个方法级别的注解,它允许你在配置类中声明一个Bean,并提供更多的灵活性。通过在配置类中使用 @Bean注解的方法,你可以创建并配置第三方库中的组件实例,并将其注册为Spring容器管理的Bean。这样,你就可以在应用中像使用其他Spring管理的Bean一样使用这些第三方组件了。

代码中的FallbackFactory就是第三方库,所以不能用@Component。

3.更换jdk版本一直失败

之前jdk的环境变量版本是17,在运行Spring项目时一直报错:无效的标记: --release。查找资料后发现可能是本地jdk版本与IDEA的jdk版本不一致的问题,但是在修改环境变量并且多次重启电脑后还是jdk17.

在查找相关资料后得知,jdk17会自动配置环境变量:

将自己配置的jdk路径上移,就能更改jdk的优先级了。

相关推荐
听风起1 分钟前
面向对象高级-抽象类、接口
java·开发语言
潜洋7 分钟前
Spring Boot教程之七: Spring Boot –注释
java·spring boot·后端·注释
一见12 分钟前
go编程中yaml的inline应用
开发语言·后端·golang
小丁爱养花14 分钟前
网络原理(一):应用层自定义协议的信息组织格式 & 初始 HTTP
java·服务器·网络·网络协议·http
程序猿进阶28 分钟前
Otter 安装流程
java·数据库·后端·mysql·数据同步·db·otter
暗夜绿32 分钟前
【GoF23种设计模式】01_建造者模式
java·设计模式·建造者模式
I_Am_Me_34 分钟前
【JavaEE进阶】SpringBoot 快速上⼿
java·spring boot·java-ee
大佬,救命!!!35 分钟前
自动化unittest框架
开发语言·笔记·python·算法·pycharm·自动化·unittest
200不是二百36 分钟前
短信发送业务
java·开发语言·junit