在配置项目中其实会留着比较多的问题,由于不同的项目没有比较统一的规划和框架模板,一般都是只有创建者会比较了解(可能也不了解),譬如前阵子在配置一个 springboot + dubbo 的项目,发现了dubbo 连接注册中间客户端的问题,这里可以结合下代码来看 比如有的应用是用的这个1 2 3 4 5 6 7 8 9 10 <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 >
有个别应用用的是这个1 2 3 4 5 <dependency > <groupId > com.101tec</groupId > <artifactId > zkclient</artifactId > <version > 0.11</version > </dependency >
还有的应用是找不到相关的依赖,并且这些的使用没有个比较好的说明,为啥用前者,为啥用后者,有啥注意点, 首先在使用 2.6.5 的 alibaba 的 dubbo 的时候,只使用后者是会报错的,至于为啥会报错,其实就是这篇文章想说明的点 报错的内容其实很简单, 就是缺少这个 org.apache.curator.framework.CuratorFrameworkFactory
类 这个类看着像是依赖上面的配置,但是应该不需要两个配置一块用的,所以还是需要去看代码 通过找上面类被依赖的和 dubbo 连接注册中心相关的代码,看到了这段指点迷津的代码1 2 3 4 5 6 7 @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 中有描述1 2 3 4 5 <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
中可以看到1 2 3 4 5 6 7 8 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"
这个配置,所以有些地方还是需要懂一些更深层次的原理,但也不至于每个东西都要抠到每一行代码原理,除非就是专门做这一块的。 还有一点是发现有些应用是碰运气,刚好有个三方包把这个类带进来了,但是这个应用就没有单独配置这块,如果不了解或者后续忘了再来查问题就会很奇怪