一、本地伪装
Mock通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。Mock是Stub的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现RpcException(比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用Stub,可能就需要捕获并依赖RpcException类,而用Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行。
实现:
1) 在api中实现UserService接口,并按约定命名为UserServiceMock。此处我们实现出现RpcException时,返回伪造数据,进行容错。
/** * Version: 3.0 * Author: pattywgm * Time: 17/6/5 下午4:24 * Desc: 容错处理 */ public class UserServiceMock implements UserService { /** * provider出现RpcException时,返回mock数据,进行容错处理 * * @return */ public List<UserVo> findAllUsers() { List<UserVo> userVos = new ArrayList<UserVo>(); userVos.add(new UserVo("000001", "默认用户", 22, "***********")); return userVos; } public UserVo findUserById(String id) { return new UserVo("000001", "默认用户", 22, "***********"); } }
2)在dubbo-consumer.xml中配置
<dubbo:reference id="userService" group="db" interface="com.patty.dubbo.api.service.UserService" timeout="10000" retries="3" mock="true" check="false"> </dubbo:reference>
设置 mock="true",表示启用容错处理,当出现RpcException时,服务端会在客户端执行容错逻辑,Mock的方法会被调用。
3)如果服务的消费方经常需要try-catch捕获异常,如:
Offer offer = null; try { offer = offerService.findOffer(offerId); } catch (RpcException e) { logger.error(e); }
请考虑改为Mock实现,并在Mock中return null。
如果只是想简单的忽略异常,在2.0.11以上版本可用:
<dubbo:service interface="com.foo.BarService" mock="return null" />
二、延迟暴露
如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露,设置delay="5000"表示延迟5s暴露服务,delay="-1"表示延迟到Spring初始化完成后,再暴露服务,这样做可以避免Spring2.x初始化死锁问题。
三、并发控制
1) 服务端并发
<
dubbo:service
interface
=
"com.foo.BarService"
executes
=
"10"
/> 表示限制服务的各个方法,服务器端并发执行(或占用线程池线程数)不能超过10个。也可以指定特定方法的并发数,在<dubbo: method>中配置
2)客户端并发
<
dubbo:service
interface
=
"com.foo.BarService"
actives
=
"10"
/> 表示限制服务的各个方法,客户端并发执行(或占用连接的请求数)不能超过10个。也可以指定特定方法的并发数,在<dubbo: method>中配置。 actives属性也可在<dubbo: reference>中配置,并且如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>优先
四、连接控制
限制服务器端接受的连接不能超过10个:(以连接在Server上,所以配置在Provider上)
<dubbo:provider protocol="dubbo" accepts="10" /> or <dubbo:protocol name="dubbo" accepts="10" />
限制客户端服务使用连接连接数:(如果是长连接,比如Dubbo协议,connections表示该服务对每个提供者建立的长连接数)
<dubbo:reference interface="com.foo.BarService" connections="10" /> or <dubbo:service interface="com.foo.BarService" connections="10" />
accepts是指定服务端的最大可接受连接数, connections则是指定客户端对每个提供者的最大连接数,rmi、http、hessian等短连接协议表示限制连接数,dubbo等长连接协表示建立的长连接个数。
五、延迟连接
延迟连接,用于减少长连接数,当有调用发起时,再创建长连接,相当于一种懒加载的模式,只对使用长连接的dubbo协议生效。
<dubbo:protocol name="dubbo" lazy="true" />
六、粘滞连接
粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。粘滞连接将自动开启延迟连接,以减少长连接数。
<dubbo:protocol name="dubbo" sticky="true" />