zoukankan      html  css  js  c++  java
  • dubbo源码4-cluster

    cluster包定义了dubbo集群相关封装,主要使用在消费端。

    cluster包根目录下类定义了集群相关的顶层抽象,主要包括:

    Router: 消费时实现服务端机器过滤功能。 参见 https://dubbo.apache.org/zh/docs/v2.7/user/examples/routing-rule/。代码上体现为传入invoker list返回一个过滤后的invoker list。

    RouteChain: 通过传入的url配置信息获取RouteFactory列表,然后通过RouteFactory列表获取Router列表,该类会维护一个invoker列表,对外提供的接口就是一个route方法,返回经过router列表过滤后的invoker list。

    Directory: 定义一个服务,内部维护该服务的提供者列表(invoker list)。 对外接口主要是获取当前服务的interface和获取该服务的提供者列表(list)。具体实现在cluster包里有StaticDirectory。 

    Cluster:可以理解为集群版本invoker的工厂,该接口主要对外输出的是invoker,接收Directory作为参数。

    LoadBalance: 多服务提供者的负载均衡。 传入服务者列表(invoker list), 返回单个invoker。

    Router和LoadBalance的功能定义比较类似,都是对服务提供者的选择。 Router是实现过滤功能,而LoadBalance是实现选择,比如LoadBalance的实现有一致性hash选择、随机选择、顺序选择等。

    下面从消费者代码看这些类是如何串联起来的:

    首先在服务消费者引用外部服务时会调用ReferenceConfig的get方法。

     get方法内部会调用ReferenceConfig的init方法。

    init内部再调用createProxy方法创建代理:

     createProxy内部通过protocol传入url创建invoker list。 然后通过如下代码创建最终的invoker:

     > 首先创建StaticDirectory。 静态Directory是Directory的一个实现类,主要实现的逻辑是先通过静态传入invoker list,然后通过调用RouteChain进行invoker的过滤获得过滤后的invoker。

    1. 获取静态invoker list

     2. RouteChain过滤:

    > 然后获取指定集群,这里以AvailableCluster为例,直接返回对应的invoker,比如availableCluster直接返回availableClusterInvoker。

    最后在availableclusterinvoker中顺序找到一个available的invoker执行:

    有个疑问点,就是如何通过url获取到invoker list,url中只存储了register的信息,如何通过register最终生成invoker list? todo:

  • 相关阅读:
    python连接mysql数据库(MySQL)
    PHP+Redis 实例【一】点赞 + 热度 上篇
    linux centos7安装phpMyAdmin详解,以及解决各种bug问题
    Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法
    composer安装教程 windows系统 | Linux系统 | mac系统
    CentOS 7.0下使用yum安装MySQL
    Linux PHP多版本切换 超简单办法
    tornado 入门
    Websocket、长连接、循环连接
    阻塞和非阻塞,同步和异步
  • 原文地址:https://www.cnblogs.com/caiyao/p/14911737.html
Copyright © 2011-2022 走看看