Dubbo-服务消费者是如何告诉注册中心自己关注哪些 Provider

33 篇文章 0 订阅

注册consumer节点-ZookeeperRegistry -doRegister

消费者启动时,会根据订单订阅的接口
在这里插入图片描述
在对应的节点下创建consumer节点
在这里插入图片描述

ZookeeperRegistry -doSubscribe

doSubscribe() 方法是订阅操作的核心实现

在这里插入图片描述

consumer://192.168.5.1/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=providers,configurators,routers&check=false&dubbo=2.0.2&init=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=9112&qos.port=33333&side=consumer&sticky=false&timestamp=1596681445600

Protocol 为 consumer ,表示是 Consumer 的订阅协议,
其中的 category 参数表示要订阅的分类,这里要订阅 providers、configurators 以及 routers 三个分类;
interface 参数表示订阅哪个服务接口,这里要订阅的是暴露 org.apache.dubbo.demo.DemoService 实现的 Provider
175行左右

              List<URL> urls = new ArrayList<>();
              //根据url获取订阅的path
                for (String path : toCategoriesPath(url)) {
                //循环创建监听器
                    ConcurrentMap<NotifyListener, ChildListener> listeners = zkListeners.computeIfAbsent(url, k -> new ConcurrentHashMap<>());
                    ChildListener zkListener = listeners.computeIfAbsent(listener, k -> (parentPath, currentChilds) -> ZookeeperRegistry.this.notify(url, k, toUrlsWithEmpty(url, parentPath, currentChilds)));
                    zkClient.create(path, false);
                    List<String> children = zkClient.addChildListener(path, zkListener);
                    if (children != null) {
                        urls.addAll(toUrlsWithEmpty(url, path, children));
                    }
                }
                notify(url, listener, urls);
            }
  • toCategoriesPath
 private String[] toCategoriesPath(URL url) {
        String[] categories;
        if (ANY_VALUE.equals(url.getParameter(CATEGORY_KEY))) {
            categories = new String[]{PROVIDERS_CATEGORY, CONSUMERS_CATEGORY, ROUTERS_CATEGORY, CONFIGURATORS_CATEGORY};
        } else {
            categories = url.getParameter(CATEGORY_KEY, new String[]{DEFAULT_CATEGORY});
        }
        String[] paths = new String[categories.length];
        for (int i = 0; i < categories.length; i++) {
            paths[i] = toServicePath(url) + PATH_SEPARATOR + categories[i];
        }
        return paths;
    }

在这里插入图片描述

最终返回3个path
在这里插入图片描述

通过 URL 中的上述参数,ZookeeperRegistry 会在 toCategoriesPath() 方法中将其整理成一个 ZooKeeper 路径,然后调用 zkClient 在其上添加监听。

provider节点,因为服务端已经创建这里加入容器即可

在这里插入图片描述
这里有个递归
在这里插入图片描述
创建完父节点,再创建
在这里插入图片描述

  • 节点存在,异常被捕获了
 @Override
    public void createPersistent(String path) {
        try {
            client.create().forPath(path);
        } catch (NodeExistsException e) {
        //如果节点存在,只打印日志不做处理
            logger.warn("ZNode " + path + " already exists.", e);
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }

之后会依次创建

在这里插入图片描述

  • 提供者 启动时,只会创建
    configurators, providers,

  • 消费者启动时创建
    consumers, routers

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值