前言

在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码解析-zookeeper连接中已经讲到,这周解析的是另一道,即服务提供者能实现失效踢出是根据什么原理?

上周就有朋友问到我,为什么我的源码解析总是偏偏要和面试题挂上钩呢?原因很简单

1.dubbo源码这么多,试问你从哪里做为切入点?也就是说该从哪里看起?所以以面试题为切入点,你可以理解为我是在回答"怎么看源码"这个问题.

2.我们研发飞机大炮并不是为了侵略,有时候可能只是单纯的想保护自己.

3.我的源码解析虽然以面试题为基础,但却不以面试为目的.因为面试如果问到dubbo的问题,绝大多数都是官方文档的内容,根本就没到需要看源码的程度.看源码的最终目的是为了解决实际问题,后面我会以实际的问题为例子,实战讲一讲看源码我究竟解决了什么网上搜不到,必须要看源码才能弄清楚的问题.所以现在就可以大胆在简书关注肥朝,已免后面错过精彩内容.

插播面试题

  • 服务提供者能实现失效踢出是什么原理(高频题)

  • zookeeper的有哪些节点,他们有什么区别?讲一下应用场景

直入主题

同上周的zookeeper连接一样,这周我们讲的还是一行代码,如下图

那么我们打上断点开始

下面就要开始创建节点了

现在我们虽然看完源码了,但是还是没法回答面试题?那么下面就要敲黑板划重点了

敲黑板画重点

zookeeper中节点是有生命周期的.具体的生命周期取决于节点的类型.节点主要分为持久节点(Persistent)临时节点(Ephemeral),但是更详细的话还可以加上时序节点(Sequential),创建节点中往往组合使用,因此也就是4种.

  • 持久节点
  • 持久顺序节点
  • 临时节点
  • 临时顺序节点

其实不要纠结于分为几种,这就和语文的断句一样,你断句的方法不同,断出来的结果也不同.那么我们主要讲讲持久节点临时节点的区别

持久节点

所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点,也就是说不会因为创建该节点的客户端会话失效而消失

临时节点

临时节点的生命周期和客户端会话绑定,也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉

应用场景

zookeeper常用的应用场景我在上周已经画了思维导图,这里就不重复展示了.就拿分布式协调/通知来举例(这个例子既是在回答第一个面试题,也是在回答第二个面试题).

在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过Ping某个主机来实现,Ping得通说明对方是可用的,相反是不可用的,ZK 中我们让所有的机其都注册一个临时节点,我们判断一个机器是否可用,我们只需要判断这个节点在ZK中是否存在就可以了,不需要直接去连接需要检查的机器,降低系统的复杂度

写在最后

集群容错后,服务发布的内容讲得也差不多了.下周来和大家一起对服务发布做一个总结.期待下周继续与你相遇.鉴于本人才疏学浅,不对的地方还望斧正,也欢迎关注我的简书,名称为肥朝

dubbo使用的 zkclient 会自动给 zookeeper发送心跳检测的
18:29:10.363 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 9ms
18:29:20.363 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 9ms
18:29:30.366 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 9ms
18:29:40.369 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 11ms
18:29:50.366 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 8ms
18:30:00.369 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 9ms
18:30:10.370 [main-SendThread(114.67.228.245:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x165add7ce0d000e after 9ms
测试发送心跳代码 会自动打印出debug的日志
package com.TestZookeeper;import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;public class ZookerProgram {//zookeeper连接地址private static final String CONNECT_ADR="XX.XX.XX.XX:2181";public static void main(String[]args)  throws Exception{ZkClient zkClient = new ZkClient(CONNECT_ADR,5000);String path="/qq";System.out.println("链接成功");zkClient.createEphemeral(path,"contentaaa");System.out.println("创建临时节点成功");//  String msg=   zkClient.getChildren("/qq");
zkClient.subscribeDataChanges(path, new IZkDataListener() {public void handleDataDeleted(String dataPath) throws Exception {System.out.println("Node " + dataPath + " deleted.");}public void handleDataChange(String dataPath, Object data) throws Exception {System.out.println("Node " + dataPath + " changed, new data: " + data);}});System.out.println("关闭前:"+zkClient.getCreationTime(path));
//       zkClient.close();
//        System.out.println("关闭后:"+zkClient.getCreationTime(path));// zkClient.writeData(path,"456");//   Thread.sleep(1000);//   zkClient.delete(path);
       Thread.sleep( Integer.MAX_VALUE );}}

dubbo源码解析-zookeeper创建节点相关推荐

  1. Dubbo源码解析 —— Zookeeper 订阅

    作者:肥朝 原文地址:https://www.jianshu.com/p/73224a6c07bb 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友 ...

  2. dubbo源码解析-逻辑层设计之服务降级

    Dubbo源码解析系列文章均来自肥朝简书 前言 在dubbo服务暴露系列完结之后,按计划来说是应该要开启dubbo服务引用的讲解.但是现在到了年尾,一些朋友也和我谈起了明年跳槽的事.跳槽这件事,无非也 ...

  3. dubbo源码解析(二)

    大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...

  4. dubbo(5) Dubbo源码解析之服务调用过程

    来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...

  5. Dubbo源码解析 —— Router

    作者:肥朝 原文地址:http://www.jianshu.com/p/278e782eef85 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友情 ...

  6. Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)

    前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...

  7. dubbo源码解析-集群容错架构设计

    前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心态,在交流过程中也发表了个人的一些粗劣的 ...

  8. dubbo源码解析(九)远程通信——Transport层

    远程通讯--Transport层 目标:介绍Transport层的相关设计和逻辑.介绍dubbo-remoting-api中的transport包内的源码解析. 前言 先预警一下,该文篇幅会很长,做好 ...

  9. dubbo源码解析(十)远程通信——Exchange层

    远程通讯--Exchange层 目标:介绍Exchange层的相关设计和逻辑.介绍dubbo-remoting-api中的exchange包内的源码解析. 前言 上一篇文章我讲的是dubbo框架设计中 ...

最新文章

  1. 技术总监需要会些什么?
  2. RIP 数据包类型 路由中毒
  3. python怎么按键开始与停止_python 图形化开始与停止功能的实现
  4. python网页爬取方法_Python爬取网页的三种方法
  5. Ubuntu10.04下安装Ns2的一系列错误及解决方案
  6. Solr router 路由介绍
  7. 通货膨胀时是否提前还本付息--郎咸平
  8. 【Kafka】Kafka如何彻底删除Kafka中的topic
  9. 设计模式之观察者模式PHP实现
  10. 程序员,建立你的商业意识
  11. Java进阶:SpringMVC中获取Restful风格的参数(从请求路径中获取参数 )
  12. ElasticSearch 核心概念
  13. 抖音短视频去水印网站 视频消重防删免费
  14. 基于Docker从零搭建Prometheus监控报警系统
  15. FPGA数码管显示自动计数+按键计数+蜂鸣器
  16. 单片机片内存储器烧写
  17. 打造新圣魔大战简体中文终极版(H补丁、不能安装、运行问题)
  18. matlab怎么取小数点后十五位,matlab 如何取出小数点后第几位数
  19. 2018王者服务器维护,王者荣耀:2018年最后一次更新,大量装备改动,玩法全部迭代!...
  20. 试论and连接并列主语时的主谓一致

热门文章

  1. 怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?
  2. apt-get 获取源码的方法
  3. element ui 空格_空格是您的UI朋友。 大量使用它。
  4. saej1929_(1929年-2020年)
  5. 火焰和烟雾的训练图像数据集_游戏开发者是烟雾和镜子的大师
  6. 网易前端进阶特训营,邀你免费入营!一举解决面试晋升难题!
  7. 『流畅的Python』第1~4章笔记_数据结构、编码
  8. 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)
  9. Struts 整合 SpringMVC
  10. that is why用法