Dubbo探索(六)

1、本地假装api

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的方法会被调用。ide

3)若是服务的消费方常常须要try-catch捕获异常,如:spa

Offer offer = null;
try {
    offer = offerService.findOffer(offerId);
} catch (RpcException e) {
   logger.error(e);
}

请考虑改成Mock实现,并在Mock中return null。线程

若是只是想简单的忽略异常,在2.0.11以上版本可用:code

<dubbo:service interface="com.foo.BarService" mock="return null" />

 

2、延迟暴露xml

若是你的服务须要Warmup时间,好比初始化缓存,等待相关资源就位等,可使用delay进行延迟暴露,设置delay="5000"表示延迟5s暴露服务,delay="-1"表示延迟到Spring初始化完成后,再暴露服务,这样作能够避免Spring2.x初始化死锁问题。

 

3、并发控制

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>优先

 

4、链接控制

限制服务器端接受的链接不能超过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等长链接协表示创建的长链接个数。

 

5、延迟链接

延迟链接,用于减小长链接数,当有调用发起时,再建立长链接,至关于一种懒加载的模式,只对使用长链接的dubbo协议生效。

<dubbo:protocol name="dubbo" lazy="true" />

 

6、粘滞链接

粘滞链接用于有状态服务,尽量让客户端老是向同一提供者发起调用,除非该提供者挂了,再连另外一台。粘滞链接将自动开启延迟链接,以减小长链接数。

<dubbo:protocol name="dubbo" sticky="true" />
相关文章
相关标签/搜索