一.什么是服务降级?
服务降级是在服务器压力剧增的情况下,根据当前的业务情况及流量对一些服务和页面有策略地进行降级,以释放服务器资源并保证核心任务的正常运行.
扩展: 服务熔断是一种保护措施,一般用于防止在软件系统中由于某些原因使服务出现了过载现象.从而造成整个系统发生故障,有时也被称为过载保护.
二.应用场景?
(1)大促或者业务高峰,为了保证核心业务的SLA(服务级别协议(Service Level Agreement,SLA)保证服务的可靠性),往往需要停掉一些不太重要的业务,
例如商品评论/论坛/粉丝积分等.
(2)某些服务因为某些原因不可用,但是流程不能直接失败,需要本地mock服务端实现,做流程放通.
例子: 以图书阅读为例,如果用户登录金额鉴权服务不能正常工作,需要做业务放通,记录消费话单,允许用户继续阅读,而是返回失败.
服务降级模式
(1)屏蔽降级
(2)容错降级
屏蔽降级
屏蔽降级指的是什么?
对非核心业务做强制降级,不发起远程服务调用,直接返回空/异常/执行特定的本地逻辑,减少自身对公共资源的消费,把资源释放出来供核心服务使用.
流程

设计实现
(1) 用于服务运行态治理,开发时不会配置,当外界的触发条件达到某个临界值时,由运维人员和开发人员决策,通过服务治理控制台,进行人工降级操作.
2)取值:
1>mock = force: return null. 不发起远程服务调用,直接返回空对象
2>mock = force: throw Exception. 不发起远程服务调用,直接抛出指定异常.
3>mock = force: execute Bean:<beanName>. 不发起远程服务调用,直接执行本地模拟接口实现类.
容错降级
指的是什么?
当非核心服务不可用时,可以对故障服务做业务逻辑放通,或者服务提供方在客户端执行容错逻辑
类型
(1)RPC异常: 通常指超时异常/消息解码异常/流控异常/系统拥塞保护异常等
(2)Service异常: 例如登陆校验失败异常/数据库操作失败异常等
计实现
(1)容错降级是根据服务调用结果,自动匹配触发的.
(2)策略
1>mock = fail: throwException. 将异常转义.
2>mock = fail: execute Bean: <beanName>. 将异常屏蔽掉,直接执行本地模拟接口实现类,返回mock接口的执行结果.
3>通常在开发态, 就需要制定容错降级的策略,消费者配置:
容错与屏蔽主要差异:
1>触发条件: 根据服务调用结果,自动匹配触发; 通过人工根据系统运行情况手工操作触发
2>作用: 当服务提供者不可用时,让消费者执行业务放通;将原属于降级业务的资源调配出来供核心业务使用.
3>调用机制: 发起远程服务调用; 只做本地调用.
总结
1>运行时容错降级:如果开发态没有制定容错降级策略,系统上线运行后,需要临时增加容错降级策略,服务框架也需要支持在线动态增加容错降级策略
2>服务降级并不能100%满足所有业务放通场景,对于不满足的特殊场景需要业务自己开发业务层的降级框架.
3>服务降级策略配置的优先级为: 消费者配置策略>服务提供者配置策略,屏蔽降级高于容错降级.
4>给予分布式服务框架的服务降级功能, 可以优先提升线上的服务治理框架,保证服务的SLA,但服务降级反向对服务的设计和开发有一定的约束:
(1)哪些服务是核心服务?哪些是非核心服务?
(2)哪些服务支持降级,降级策略是什么?
(3)除了服务降级之外,是否还存在更为复杂的业务放通场景,它的策略是什么?
实战
Dubbo通过使用mock配置来实现服务降级,mock在出现非业务异常(比如超时,提供者全部挂掉或网络异常)时执行,mock支持如下两种配置:
1>配置为boolean值.默认配置为false,如果配置为true,则默认使用mock的类名,即类名+Mock后缀
2>配置为return null
在spring配置文件中按如下方式配置:
<dubbo:service interface="com.bill.IHelloService" mock="true" />
<dubbo:service interface="com.foo.BarService" mock="return null" />
















