第一章 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的优先级了。

相关推荐
cui_win8 分钟前
Redis 连接池被占满(泄漏)问题排查
java·redis·连接泄露
Doris_LMS9 分钟前
JDK11的安装教程
java·jdk
JIngJaneIL9 分钟前
基于java+ vue建筑材料管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
一 乐12 分钟前
办公系统|基于springboot + vueOA办公管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
半梅芒果干15 分钟前
vue3 新建文件store自动导入
开发语言·前端·javascript
Tony Bai16 分钟前
Go 1.26 新特性前瞻:从 Green Tea GC 到语法糖 new(expr),性能与体验的双重进化
开发语言·后端·golang
多则惑少则明20 分钟前
AI大模型实用(五)Java快速实现智能体整理(LangChain4j构建Java AI智能体)
java·ai大模型
uup23 分钟前
字符串比较的经典坑:== vs equals
java
悟能不能悟27 分钟前
Java 中将 List 中对象的某一列转换为 Set
java·开发语言·list
vortex532 分钟前
Bash Shell 的展开与补全机制
开发语言·bash