zoukankan      html  css  js  c++  java
  • Dubbo之服务注册

    在上一篇文章Dubbo之服务暴露分析中介绍了当远程暴露时,如果有注册中心,需要在服务暴露后再将服务注册到注册中心。该篇将介绍该功能的有关步骤。

    注册的起点

    RegistryProtocol.export()方法包含了服务导出,注册,以及数据订阅等逻辑。其中服务注册先调用RegistryProtocol.register()方法。

    public void register(URL registryUrl, URL registeredProviderUrl) {
        // 获取 Registry
        Registry registry = registryFactory.getRegistry(registryUrl);
        // 注册服务
        registry.register(registeredProviderUrl);
    }
    

    可以看出,服务注册主要包括两部分,获取注册中心实例向注册中心注册服务

    获取注册中心实例

    (1)调用registryFactory.getRegistry(registryUrl)方法,它会先访问缓存,缓存中不存在则调用createRegistry(URL)方法创建Registry,然后写入缓存。这里的createRegistry是一个模版方法,有具体的子类实现。这里假设使用zookeeper作为注册中心,则调用ZookeeperRegistryFactory的createRegistry()方法。

    public Registry createRegistry(URL url) {
            // 创建 ZookeeperRegistry
            return new ZookeeperRegistry(url, zookeeperTransporter);
        }
    
    public ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter) {
        super(url);
        if (url.isAnyHost()) {
            throw new IllegalStateException("registry address == null");
        }
        
        // 获取组名,默认为 dubbo
        String group = url.getParameter(Constants.GROUP_KEY, DEFAULT_ROOT);
        if (!group.startsWith(Constants.PATH_SEPARATOR)) {
            // group = "/" + group
            group = Constants.PATH_SEPARATOR + group;
        }
        this.root = group;
        // 创建 Zookeeper 客户端,默认为 CuratorZookeeperTransporter
        zkClient = zookeeperTransporter.connect(url);
        // 添加状态监听器
        zkClient.addStateListener(new StateListener() {
            @Override
            public void stateChanged(int state) {
                if (state == RECONNECTED) {
                    try {
                        recover();
                    } catch (Exception e) {
                        logger.error(e.getMessage(), e);
                    }
                }
            }
        });
    }
    

    (2) 在ZookeeperRegistry构造方法中调用connect(url)方法,默认是CuratorZookeeperClient, 获得一个ZkClient客户端,之后添加状态监听器。

    向注册中心注册服务

    假设存在一个服务com.alibaba.dubbo.demo.DemoService, 那么 这个服务对应的配置信息(存储在 URL 中)最终被注册到了 /dubbo/com.alibaba.dubbo.demo.DemoService/providers/ 节点下。
    (1) 调用FailbackRegistry.register()方法,之后调用里面的doRegister方法,它是一个模版方法,在ZookeeperRegistry中实现。

    protected void doRegister(URL url) {
        try {
            // 通过 Zookeeper 客户端创建节点,节点路径由 toUrlPath 方法生成,路径格式如下:
            //   /${group}/${serviceInterface}/providers/${url}
            zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));
        } catch (Throwable e) {
            throw new RpcException("Failed to register...");
        }
    }
    

    (2) 调用create()方法。通过递归创建当前节点的上一级路径,然后再根据ephemeral的值决定是创建临时还是持久节点。分别调用createEphemeralcreatePersistent方法。

  • 相关阅读:
    MyBatis学习总结(11)——MyBatis动态Sql语句
    MyBatis学习总结(11)——MyBatis动态Sql语句
    Dubbo学习总结(3)——Dubbo-Admin管理平台和Zookeeper注册中心的搭建
    Dubbo学习总结(1)——Dubbo入门基础与实例讲解
    Dubbo学习总结(1)——Dubbo入门基础与实例讲解
    Maven学习详解(13)——Maven常用命令大全与pom文件讲解
    3分钟了解ServiceStage 应用智能化运维【华为云分享】
    OBS带你玩转图片
    高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能
    【Python成长之路】Python爬虫 --requests库爬取网站乱码(xe4xb8xb0xe5xa)的解决方法
  • 原文地址:https://www.cnblogs.com/maratong/p/12333703.html
Copyright © 2011-2022 走看看