Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

0%

# dubbo 客户端配置的一个重要知识点

发表于 2022-06-11 分类于 Java ， Dubbo 阅读次数： 阅读次数： Disqus：

在配置项目中其实会留着比较多的问题，由于不同的项目没有比较统一的规划和框架模板，一般都是只有创建者会比较了解（可能也不了解），譬如前阵子在配置一个 springboot + dubbo 的项目，发现了dubbo 连接注册中间客户端的问题，这里可以结合下代码来看
比如有的应用是用的这个

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-client</artifactId>
        <version>${curator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>${curator.version}</version>
    </dependency>

有个别应用用的是这个

    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.11</version>
    </dependency>

还有的应用是找不到相关的依赖，并且这些的使用没有个比较好的说明，为啥用前者，为啥用后者，有啥注意点，
首先在使用 2.6.5 的 alibaba 的 dubbo 的时候，只使用后者是会报错的，至于为啥会报错，其实就是这篇文章想说明的点
报错的内容其实很简单, 就是缺少这个 `org.apache.curator.framework.CuratorFrameworkFactory` 类
这个类看着像是依赖上面的配置，但是应该不需要两个配置一块用的，所以还是需要去看代码
通过找上面类被依赖的和 dubbo 连接注册中心相关的代码，看到了这段指点迷津的代码

    @SPI("curator")
    public interface ZookeeperTransporter {

        @Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})
        ZookeeperClient connect(URL url);

    }

众所周知，dubbo 创造了叫自适应扩展点加载的神奇技术，这里的 adaptive 注解中的`Constants.CLIENT_KEY` 和 `Constants.TRANSPORTER_KEY` 可以在配置 dubbo 的注册信息的时候进行配置，如果是通过 xml 配置的话，可以在 `<dubbo:registry/>` 这个 tag 中的以上两个 key 进行配置，
具体在 dubbo.xsd 中有描述

    <xsd:element name="registry" type="registryType">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The registry config ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:element>

并且在 spi 的配置`com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter` 中可以看到

    zkclient=com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperTransporter
    curator=com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter

    zkclient=com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperTransporter
    curator=com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter

    zkclient=com.alibaba.dubbo.remoting.zookeeper.zkclient.ZkclientZookeeperTransporter
    curator=com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter

而在上面的代码里默认的SPI 值是 `curator`，所以如果不配置，那就会报上面找不到类的问题，所以如果需要使用 zkclient 的，就需要在`<dubbo:registry/>` 配置中添加 `client="zkclient"`这个配置，所以有些地方还是需要懂一些更深层次的原理，但也不至于每个东西都要抠到每一行代码原理，除非就是专门做这一块的。
还有一点是发现有些应用是碰运气，刚好有个三方包把这个类带进来了，但是这个应用就没有单独配置这块，如果不了解或者后续忘了再来查问题就会很奇怪