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