zoukankan      html  css  js  c++  java
  • Dubbo探索(六)

    一、本地伪装

    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" />
  • 相关阅读:
    读《暗时间》
    文献笔记8
    文献笔记4
    文献笔记2
    文献笔记5
    文献笔记6
    文献笔记1
    文献笔记3
    读《暗时间》2
    文献笔记7
  • 原文地址:https://www.cnblogs.com/java-wgm/p/7097981.html
Copyright © 2011-2022 走看看