下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务。对于zookeeper的原理本文档不分析,后面有时间在做专题。

zookeeper注册中心

Zookeeper对数据存储类似linux的目录结构,下面给出官方文档对dubbo注册数据的存储示例

假设读者对zookeeper有所了解,能够搭建zookeeper服务,其实不了解也没关系,谷歌百度下分分钟搞起。

作为测试调试dubbo,我是在本地起的zookeeper

指定zookeeper配置文件地址

配置文件中两个关键参数:

dataDir zookeeper存储文件的地址

clientPort 客户端链接的端口号

Dubbo服务提供者配置

<dubbo:registry protocol=”zookeeper” address="127.0.0. 1:2181" />

<beanid="demoService" class="com.alibaba.dubbo.demo.provi der.DemoServiceImpl"/>

<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoServi ce" ref="demoService"/>

除了配置注册中心的,其他都一样

Dubbo服务消费者配置

<dubbo:registry protocol=”zookeeper” address="127.0.0. 1:2181" />

<dubbo:referenceid="demoService"interface="com.alibaba.dubbo.demo.DemoService"/>

除了配置注册中心的,其他都一样

客户端获取注册器

服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器

Registry registry = registryFactory.getRegistry(url);

这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码

public class ZookeeperRegistryFactory extends AbstractRegistryFactory {

public Registry createRegistry(URL url) {

return new ZookeeperRegistry(url, zookeeperTransporter);

}

}

这里创建zookeepr注册器ZookeeperRegistry

ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。

接口定义:

@SPI("zkclient")

public interface ZookeeperTransporter {

@Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})

ZookeeperClient connect(URL url);

}

默认采用zkClient, dubbo源码集成两种zookeeper客户端,除了zkClient还有一个是curator

ZookeeperRegistry注册器的实现

1.构造器利用客户端创建了对zookeeper的连接,并且添加了自动回复连接的监听器。

zkClient = zookeeperTransporter.connect(url);

zkClient.addStateListener(new StateListener() {

public void stateChanged(int state) {

if (state ==RECONNECTED)

recover();

}

});

2.注册url就是利用客户端在服务器端创建url的节点,默认为临时节点,客户端与服务端断开,几点自动删除

zkClient.create(toUrlPath(url),url.getParameter(Constants.DYNAMIC_KEY,true));

3.取消注册的url,就是利用zookeeper客户端删除url节点

zkClient.delete(toUrlPath(url));

4. 订阅url, 功能是服务消费端订阅服务提供方在zookeeper上注册地址,这个功能流程跟DubboRegister不一样, DubboRegister是通过Dubbo注册中心实现SimpleResgiter在注册中心端,对url变换、过滤筛选然后将获取的provierUrl(提供者ulr)利用服务消费者暴露的服务回调在refer。

由于这里注册中心采用的是zookeeper,zookeeper不可能具有dubbo的业务逻辑,这里对订阅的逻辑处理都在消费服务端订阅的时候处理。

1) 对传入url的serviceInterface是*代表订阅url目录下所有节点即所有服务,这个注册中心需要订阅所有

2) 如果指定了订阅接口通过toCategoriesPath(url)转换需要订阅的url

如传入url consumer://10.33.37.8/com.alibaba.dubbo.demo.DemoService?application=demo-consumer&category=providers,configurators,routers&dubbo=2.5.4-SNAPSHOT&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=4088&side=consumer&timestamp=1417405597808

转换成urls

/dubbo/com.alibaba.dubbo.demo.DemoService/providers,/dubbo/com.alibaba.dubbo.demo.DemoService/configurators, /dubbo/com.alibaba.dubbo.demo.DemoService/routers

3) 设配传入的回调接口NotifyListener,转换成dubbo对zookeeper操作的ChildListener

4)以/dubbo/com.alibaba.dubbo.demo.DemoService/providers为例创建节点zkClient.create(path, false);

但是一般情况下如果服务提供者已经提供服务,那么这个目录节点应该已经存在,Dubbo在Client层屏蔽掉了创建异常。

5) 以/dubbo/com.alibaba.dubbo.demo.DemoService/providers为例给节点添加监听器,返回所有子目录

List<String> children = zkClient.addChildListener(path, zkListener);

if (children !=null) {urls.addAll(toUrlsWithEmpty(url, path,hildren));}

toUrlsWtihEmpty用来配置是不是需要订阅的url,是加入集合

6) 主动根据得到服务提供者urls回调NotifyListener,引用服务提供者生成invoker可执行对象

5. 取消订阅url, 只是去掉url上的注册的监听器

 

分布式锁之三:mysql实现-待整理的更多相关文章

  1. 分布式锁之三:Redlock实现分布式锁

    之前写过一篇文章<如何在springcloud分布式系统中实现分布式锁?>,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的.那篇文章实现的大概思路是用setNx命 ...

  2. 死磕 java同步系列之mysql分布式锁

    问题 (1)什么是分布式锁? (2)为什么需要分布式锁? (3)mysql如何实现分布式锁? (4)mysql分布式锁的优点和缺点? 简介 随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化 ...

  3. Redis的“假事务”与分布式锁

    关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...

  4. spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)

    一,为什么要使用分布式锁? 如果在并发时锁定代码的执行,java中用synchronized锁保证了线程的原子性和可见性 但java锁只在单机上有效,如果是多台服务器上的并发访问,则需要使用分布式锁, ...

  5. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第26篇. 本篇我们使用my ...

  6. 分布式锁(redis/mysql)

    单台机器所能承载的量是有限的,用户的量级上万,基本上服务都会做分布式集群部署.很多时候,会遇到对同一资源的方法.这时候就需要锁,如果是单机版的,可以利用java等语言自带的并发同步处理.如果是多台机器 ...

  7. 【分布式锁】通过MySQL数据库的表来实现-V1

    一.来源 之所以要写这篇文章是因为想对自己当前的分布式知识做一个归纳.今天就先推出一篇MySQL实现的分布式锁,后续会继续推出其他版本的分布式锁,比如通过Zookeeper.Redis实现等. 二.正 ...

  8. redis整理:常用命令,雪崩击穿穿透原因及方案,分布式锁实现思路,分布式锁redission(更新中)

    redis个人整理笔记 reids常见数据结构 基本类型 String: 普通key-value Hash: 类似hashMap List: 双向链表 Set: 不可重复 SortedSet: 不可重 ...

  9. 整理分布式锁:业务场景&分布式锁家族&实现原理

    1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...

随机推荐

  1. ReflectionZ_测试_01

    1.Java代码 public class TreflectionZ { public static void main(String[] args) throws Exception { Class ...

  2. Spring:通配符的匹配很全面, 但无法找到元素 XXXXX' 的声明

    问题:配置Spring的时候容易发生如题的这样一个经常性的错误,错误如下(以context为例) org.springframework.beans.factory.xml.XmlBeanDefini ...

  3. 将hibernate.cfg.xml文件都放到spring中时报错

    报错如下所示: 私以为是配置文件出现问题了. <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  4. NLP(三)_统计语言模型

    概念 统计语言模型:是描述自然语言内在的规律的数学模型.广泛应用于各种自然语言处理问题,如语音识别.机器翻译.分词.词性标注,等等.简单地说,语言模型就是用来计算一个句子的概率的模型 即P(W1,W2 ...

  5. 在windows x64上部署使用Redis

    一.下载Redis 下载地址:https://github.com/MSOpenTech/redis/releases 二.安装Redis 将下载文件解压到D:\redis 后,可见: 三.启动Red ...

  6. mybatis 批量修改接口的几种实现方式

    -----------------我也是有上线的--------------我也是有上线的------------我也是有上线的---------------我也是有上线的-------------- ...

  7. Juniper

    Juniper Networks[编辑]     Juniper Networks 公司类型 上市(NYSE:JNPR) 成立 1996年2月 代表人物 执行长:Shaygan Kheradpir技术 ...

  8. CountDownLatch闭锁

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...

  9. ComBox绑定枚举

    (转自:http://blog.csdn.net/chao88552828/article/details/9903159) /// <summary> /// 参数枚举 /// < ...

  10. 【51nod-1605】棋盘问题

    上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色,然后将这些格子染白. 如果谁不能操作了,那么那个人就输了. ...