偶尔一碗热鸡汤:一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。
日常
1、6:00起床√
2、健身1.5h:练了背和胸,今天没跑步
3、LeetCode刷了2题
- 分割回文串:回溯、中
- 使用递归+回溯来解答,递归遍历整个字符串,在递归函数中先判断当前递归深度是否等于字符串长度,如果等于说明当前分割满足要求,则加入ans后恢复状态继续递归
- 先从当前字符串开始找到第一个回文串,然后加入output序列中,继续对下一个字符串进行递归,递归结束后恢复状态进行回溯,继续递归别的可能的情况
- 在Java传递引用类型数据时要判断是传递地址还是传递值,对于值传递要传入复制过的数据
- 最小栈:栈、中
- 用空间换时间,在维护栈的同时维护一个存放最小值的数组,其中min[i]是指栈中前i个元素的最小值,在每次入栈的时候同步维护其中的数据,将插入数据和前面的最小值插入栈中
- 在使用栈结构时,一定要注意入栈时top++,出栈时top–,栈结构用ArrayList数组+top进行实现,可以动态改变栈的长度,出栈时直接调用remove(–top)进行出栈,入栈时要栈顶+1,出栈时要栈顶-1
4、复盘22:30√
不复盘等于白学!!!
学习和感想
1、 SpringCloud学习:CircuitBreaker断路器:服务熔断和降级
-
为什么要有:禁止服务雪崩故障,对故障结点快速熔断或降级(保险丝)
1. 分布式系统微服务之间有多种级联的调用关系,当某一个调用失败时,会导致雪崩(一个故障导致所有都不能正常运行),此时就需要对故障和延迟进行隔离和管理
2. 之前是Hystrix豪猪,分布式容错,当一个出错时不会发生级联错误-
有什么作用:服务熔断、服务降级
- 服务熔断就相对于保险丝,当出现故障时直接熔断使服务不可用,并对服务降级(系统繁忙,请稍后再试)返回友好的兜底界面
- 服务熔断就相对于保险丝,当出现故障时直接熔断使服务不可用,并对服务降级(系统繁忙,请稍后再试)返回友好的兜底界面
-
CircuitBreaker实现原理:circuitbreak只是一套规范和接口
- 当某一个组件发生故障时会切换到OPEN状态,过一会会切换到HALF_OPEN状态来试探是否恢复,恢复了则切换到CLOSED状态
- 保护分布式系统免受故障和异常,当一个组件发生故障时,会切换到OPEN状态,阻止请求发送到该组件从而避免更多请求发送到该组件
-
Resilience4J:轻量级的容错库,专门做服务熔断和服务降级
-
能干吗: 断路、速率限制、舱壁(隔离)
- 引入对应的POM依赖后,并修改resilience4j.xxx yml配置后,在controller对应的方法上加入要实现功能的注解以开启相应的功能
- 断路、速率限制、舱壁(隔离)
-
resilience4j.Circuitbreaker:断路
-
断路器
- 三大状态之间的转换:刚开始默认是CLOSED关闭状态,此时任何请求均可以通过,当最近N次调用或者最近N秒内调用故障率过高时,则会判定服务提供者发生了故障,就会将状态切换为OPEN,此时会拒绝任何请求,过一段时间后会进入HALF_OPEN状态,此时会通过一些请求,然后根据这些请求的结果将状态切换为CLOSED或者OPEN
- 配置参数
-
基于次数的实战演示:断路器配置在客户端的,指定对某个服务的熔断
3. 先修改POM引入starter-circuitbreaker以及startrt-aop
4. 然后写yml,引入 spring.cloud.openfeign.circuitbreaker.enable=true,断路器在客户端的openfeign配置中进行配置,默认不开启分组,开了分组之后就是精确优先,然后配置resilience4J的属性**(可以去官网查找,也可以在CircuitBreakerConfig类中查看)- 配置好yml文件后在服务调用者客户端的调用方法上使用@CircuitBreaker(name=“yml文件中配置的instance名称”, fallbackMethod=“服务降级函数”)来实现对该请求的熔断以及降级配置
- 服务熔断要达到配置的错误率时才会熔断,但只要有错误均会服务降级fallback
-
基于时间的实战演示
-
-
resilience4j.bulkhead: 舱壁隔离:限制并发数量
- 就是将服务调用分割在不同的舱壁中,以防止出现牵连故障,可以限制并发执行的数量,有两种实现方式
- SemaphoreBulkHead信号量舱壁
- ![[Pasted image 20241012214026.png]]![[Pasted image 20241012214326.png]]
- 实战:先在客户端(Circuitbreaker是在客户端进行配置的)引入舱壁隔离的POM依赖resilience-bulkhead,再修改yml加入resilience4j.bulkhead的配置和实例,然后再修改业务类,在调用服务的方法上用@Bulkhead(name(指的是yml文件中配置的instance名称), fallbackMethod, type=‘Bulkhead.type.SEMAPHORE’)注解进行标注(当信号量已经满的时候,会等待设置的时间,如果结束后仍未有新的位置,则服务降级)
-
-