介绍
之前发多一篇滑动窗口的文章 最近工作不是很忙就有了解了一下熔断降低原理 自己写了一个简单的demo可能在一些小型的场景可能实用 目前应该还不能进行比较严格的推敲 后期会对此进行不定期修改 熔断的目的是的目的就为了保证不能因为个别的服务不可用导致其他的服务也不可用 要对一些有可能问题的地方进行及时的止损 使用以上隔离的方式可以尽可能的避免这种情况的发生
熔断设计方式
现在熔断降级一般采用资源隔离的方式
资源隔离又有线程池隔离和信号量
线程池隔离又有在下游对上有发来来的请求做隔离和上游发送请求是对线程做隔离分配到不同的下游中
信号量就更好理解了 上游在请求前去获取一下信号量 如果还存在信号就继续执行下游服务 不存在就不在调用
涉及到重要的点
1 什么方法能降级?
2 什么时候降级?
3 降级之后怎么恢复?
1 什么方法能降级?
拿淘宝举例 在大型的降价活动 例如双十一双十二 这个时候你会发现 你是不能修改自己的头像的 还有前几年微信问题 腾讯异地的多活的服务器因为大水机房被冲没了 导致只有单机房能够正常运行 这个时候微信就关闭了修改个人资料 头像 等等功能 其实就是把这方面功能关闭 但是你去操作的时候又不能给你有报错的信息 就采用了补偿的方式 提示给你不能修改
由此 在一些不重要的功能在一些重要的场合 进行熔断关闭 达到快速响应保证其他服务的正常运行
2 什么时候降级?
这个要设计合适的断路器控制和熔断阈值与数据的统计
断路器 服务熔断开关 当对下游服务调用异常亮达到设定的阈值打开断路器 触发熔断
统计数据:将某段时间内的请求量 失败数量成功数量 做数据统计
这里要考虑好数据维度 节点?接口?服务? 这里目前采用的是滑动窗就的实行 这个不做过多解释
代码
我这里采用的切面的形式 按照方法的维度去做熔断 这里是结合的feign的接口做的一个熔断
大致思路:
跟上图的熔断器差不多 在每次调用可能降级的服务方法的时候计算这个方法的成功率 当低于设定的成功率的时候就打开降级并设置一个窗口期限 当窗口关闭把熔断器的状态设置成半开 并且将百分之三十左右的流量打入到下方服务 当成功率上来再关闭降级 达到正常的运行
这里把部分的代码粘贴出来 详细代码自行在下方git下载
1 计算成功率:
![计算成功率]()
2 设置百分三十请求打入到下游
方式有很多种 下面的方式虽然不是很完善 大佬勿喷 也可以提提其他的建议
3 设计延迟事件来达到窗口期的效果
java的jdk1.5之后 添加了Delayed类 具体使用就不做过多的解释
spring中给了事件类 但是并没有添加延时的功能 然后就想着两者结合一下
具体步骤就是将事件类实现Dalayed实现 在创建事件类的时候将延时时间传入在里面
延时队列也在在推送事件的时候添加进去 推送使用异步的操作 不然在一个线程中的话主线程会一直等待延时并指示完成再结束
至此 比较难的点应该是都完了 其他的都是一些比较简单的功能 只要思想对 实现比较简单 这种方式还不是很完善 毕竟是自己个人写的 推敲也都是个人自己完成 可能有一些不妥当的地方 有大佬看见望指明 后续还需更新 现在功能已经实现了 感兴趣的可以下载下来尝试一下 架构图还在画
git:https://gitee.com/xzj0957/fuse-fuseProtection.git
--------------------------------------------------------关注 持续更新-----------------------------------------------------------