dubbo系列之实现SOA服务降级
简介
什么是服务开关?
先讲一下开关的由来,例如淘宝在11月11日做促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的, C只是附加的功能(例如在下单的时候做一下推荐,或push消息),可有可无,在平时系统没有压力,容量充足的情况下,调用下没问题,但是在类似店庆之类的大促环节, 系统已经满负荷了,这时候其实完全可以不去调用C接口,怎么实现这个呢? 改代码?最好是设置一个开关,在大促环节就把开关关掉就可以了。
什么是服务降级?
服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
dubbo如何实现服务降级?
容错:当系统出现非业务异常(比如并发数太高导致超时,网络异常等)时,不对该接口进行处理。(不可知) mock=fail:return null
屏蔽:在大促,促销活动的可预知情况下,例如双11活动。采用直接屏蔽接口访问。(可知) mock=force:return null
场景重现
容错
启动zk,启动服务端,启动客户端。
给服务端打上断点就会出现,请求超时
配置容错(状态改成-启用)
报错信息立刻消除,结果如下
屏蔽
方法同上,即将所有方法的Mock值改成-屏蔽
源码分析
从前面几篇博客不难看出,进入集群的起点就是MockClusterInvoker.invoke
1 | public Result invoke(Invocation invocation) throws RpcException { |
看这个逻辑,在正常和容错的情况下时,都是要result = this.invoker.invoke(invocation);,请求服务端的,只是容错时,在出现异常情况下,会有特殊处理。而在屏蔽的情况下,是不会再去请求服务端了,直接doMockInvoke,先看看容错。
容错
容错
doMockInvoker()
1 |
|
selectMockInvoker()
1 | /** |
这里返回的invokers是null,也就是在出现超时情况下,注解屏蔽注册中心zk中的所有内容了。
接着看doMockInvoker()
1 |
|
invoke()
1 | public Result invoke(Invocation invocation) throws RpcException { |
这样容错的处理就讲完了
屏蔽
直接请求doMockInvoke(invocation, null);过程和容错一致