一、本地伪装

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" />

 

posted on 2017-06-30 11:17  pattywgm  阅读(830)  评论(1编辑  收藏  举报