【Dubbo】与ZK交互

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Dubbo】与ZK交互相关的知识,希望对你有一定的参考价值。

参考技术A Dubbo内部使用zkclient操作zookeeper

Dubbo与zk交互主要是通过Registry这个接口的实现类ZookeeperRegistry来完成的,ZookeeperRegistry封装了和注册中心交互的细节,底层使用ZookeeperClient接口通过zkclient或者Curator操纵zk

获取RegistryFactory 扩展点,扩展点名称为zookeeper,用于创建Registry

使用 AbstractRegistryFactory#getRegistry 获取Registry,调用子类 ZookeeperRegistryFactory.createRegistry 创建Registry

Registry的继承关系如下

把文件C:\Users\bobo.dubbo\dubbo-registry-192.168.48.117.cache中的内容加载为properties,内容每个接口对应注册中心的地址的缓存

最终得到的Registry实例为ZookeeperRegistry类型

zookeeperTransporter.connect(url); 初始化ZK

使用中间转换层解耦底层不同客户端的事件机制,将底层不同的事件转换后向上层传递

RegistryProtocol.export
-->>registryFactory.getRegistry
-->>ZookeeperRegistryFactory.createRegistry
-->>ZookeeperRegistry
-->>zookeeperTransporter.connect
-->>ZookeeperClient
-->>ZkclientZookeeperClient

创建并获取到连接了zk的registry之后就向zk注册provider的节点,执行流程如下:

/dubbo/com.alibaba.dubbo.demo.DemoService/configurators 包含服务的配置信息,在注册完成provider之后需要订阅该节点,当这个节点数据变更的时候zk会通知订阅了监听器

创建持久化节点 /dubbo/com.alibaba.dubbo.demo.DemoService/configurators ,然后创建上层统一的监听器ChildListener通过抽象类 AbstractZookeeperClient 完成事件的监听,并在方法回调的时候触发 ZookeeperRegistry.this.notify

将上层统一的监听器转换成为zk(IZkChildListener )或者curatro需要的监听器,并注册到各自的实现中

dubbo zk 分布式服务项目搭建与配置

1. 项目 jar  -----提供接口

2. 项目 jar  -----接口实现   provider
启动zk

main方法启动 start applicationContext.xml

 

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="test_provider" />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://localhost:2181" />
    <dubbo:monitor protocol="registry"/>  

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />



    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.beta_ai.med.service.TestService" ref="testService" />

    <!-- 具体的实现bean -->
    <bean id="testService" class="com.beta_ai.med.service.impl.TestServiceImpl" />
</beans>

3. 项目 war
调用服务

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd  
       http://code.alibabatech.com/schema/dubbo  
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="test_consumer" />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://localhost:2181" />
    <dubbo:monitor protocol="registry"/>  

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:reference interface="com.beta_ai.med.service.TestService" id="testService" check="false" />

</beans>

 

以上是关于【Dubbo】与ZK交互的主要内容,如果未能解决你的问题,请参考以下文章

Kafka:ZK+Kafka+Spark Streaming集群环境搭建VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网。

记一次zk节点内容异常,导致dubbo-admin无法启动

dubbo zk 分布式服务项目搭建与配置

dubbo

使用Dubbo进行系统之间的交互

Dubbo + ZK + SpringBoot 分布式实战