Dubbo源码分析9哪些地方用到了哪些设计模式

Dubbo源码分析9哪些地方用到了哪些设计模式

1.模板方法模式

1.1服务目录Directory

服务目录是什么:服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用,可以理解成Invoker的列表

抽象类 AbstractDirectory ,有两个子类StaticDirectory和RegistryDirectory

AbstractDirectory 源码:

//获取可用的服务列表
public List<Invoker<T>> list(Invocation invocation) throws RpcException {
   
    if (destroyed) {
   
        throw new RpcException("Directory already destroyed...");
    }
    
    // 调用 doList 方法列举 Invoker,doList 是模板方法,由子类实现
    List<Invoker<T>> invokers = doList(invocation);
    
    // 获取路由 Router 列表
    List<Router> localRouters = this.routers;
    if (localRouters != null && !localRouters.isEmpty()) {
   
        for (Router router : localRouters) {
   
            try {
   
                // 获取 runtime 参数,并根据参数决定是否进行路由
                if (router.getUrl() == null || router.getUrl().getParameter(Constants.RUNTIME_KEY, false)) {
   
                    // 进行服务路由
                    invokers = router.route(invokers, getConsumerUrl(), invocation);
                }
            } catch (Throwable t) {
   
                logger.error("Failed to execute router: ...");
            }
        }
    }
    return invokers;
}
// 模板方法,由子类实现
protected abstract List<Invoker<T>> doList(Invocation invocation) throws RpcException;

1.2负载均衡Loadbalance

AbstractLoadBalance中doSelect方法留给子类实现
public abstract class AbstractLoadBalance implements LoadBalance {
   

    static int calculateWarmupWeight(int uptime, int warmup, int weight) {
   
        int ww = (int) ((float) uptime / ((float) warmup / (float) weight));
        return ww < 1 ? 1 : (ww > weight ? weight : ww);
    }

      @Override
    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
   
        if (invokers == null || invokers.isEmpty())
            return null
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值