From: http://www.cnblogs.com/rjzheng/p/10340176.htmlhtml
什么是服务熔断?java
当下游服务不可用或者响应缓慢, 则阻止进一步调用目标服务, 而是直接返回,快速释放资源, 直到目标服务恢复,再继续调用它。框架
熔断是一个框架级的处理, 基本的处理方式:断路器模式。。。。异步
熔断器的状态: Closed Open Half-Open。微服务
若是失败比例达到阈值,则开始熔断器 Closed -> Open
打开的时候, 有个reset timeout, 若是到了这个时间, 状态会变为Half-Open。 Closed -> Half-Open
处于Half-Open状态时, 会尝试将一部分请求调用下游服务, 若是能够成功调用下游服务, 则关闭熔断器 Half-Open -> Closed; 若是仍然不能成功调用,则继续开启熔断器 Half-Open -> Openui
在Hystrix 中, 配置:
// 滑动窗口, 即 调用次数
circuitBreaker.requestVolumeThreshold=20
// 多长时间后,开始进入半开启状态
circuitBreaker.sleepWindowInMilliseconds=5000
// 服务调用错误率
circuitBreaker.errorThresholdPercent=50%htm
上述配置的意思是每20个请求中, 调用失败次数超过50%,就开启熔断器。过了5秒以后, 尝试调用目标服务, 根据结果判断熔断器开始或者关闭。blog
什么是服务降级?事件
先说2个场景:ci
下游服务因为某种缘由响应过慢,下游服务主动停掉一些不过重要的业务, 释放服务资源, 增长响应速度。
下游服务因为某种缘由不可用, 上游主动调用本地一些降级逻辑, 避免卡顿, 迅速将结果返回给用户。
这样2个场景并没以为和熔断有啥区别, 做者说能够理解为:服务降级有不少方式,好比限流降级、开关降级、熔断降级;而服务熔断只不过是服务降级的一种方式
好比, 上游代码:
try{
// 调用下游服务
xxRpc.helloWorld();
} catch(Exception e){
// 由于熔断, 而抛出异常
doSomething();
}
下游的helloWorld服务由于熔断而调用不一样(抛出异常)。此时上游服务会进入catch代码块, 那么doSomething执行的逻辑就是降级逻辑。
服务降级更多的属于业务级别的降级。在配置中心更改开关, 决定哪些服务降级。至于配置变更后, 应用怎样监控配置变化, 应该用到Rxjava之类的了。
在应用中, 添加用于降级使用的开关,也能够叫作埋点。。。。
那么埋点的形式是啥呢?
简化执行流程:本身梳理核心流程和非核心流程,而后在非核心流程上加开关, 一旦发现系统扛不住, 经过开关关掉那些非核心流程。
关闭次要功能: 同简化流程
下降一致性: 发现都是核心流程,没法简化流程, 那只能下降一致性, 也就是将核心流程的同步改成异步, 强一致性改成最终一致性。
上面3个都是手动降级, 怎么实现自动降级??通常降级场景能够预见,好比某某活动。有突发事件、流量异常也会有监控邮件通知, 提供咱们手动降级。
固然,这并不表明不能自动降级。。。。
自动降级思路:先设置预警阈值;监控是否达到阈值,若是达到阈值, 则更改配置中心的配置(启动开关降级);配置中心监测到配置的变化, 则会推送这些变化到相应的微服务(PS: 配置中心具备热刷新功能)。