Java之Zookeeper注册中心原理剖析

 更新时间:2021年07月31日 09:17:06   作者:java构架师  
这篇文章主要介绍了Java之Zookeeper注册中心原理剖析,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

RPC框架中有3个重要的角色:

Zookeeper用作注册中心的原理

注册中心 :保存所有服务的名字,服务提供者的IP列表,服务消费者的IP列表

服务提供者: 提供跨进程服务

服务消费者: 寻找到指定命名的服务并消费。

Zookeeper用作注册中心
简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(IP+端口)去访问具体的服务提供者。如下图所示:

在这里插入图片描述

具体来说,zookeeper就是个分布式文件系统,每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上: /{service}/{version}/{ip:port},比如我们的HelloWorldService部署到两台机器,那么zookeeper上就会创建两条目录:分别为/HelloWorldService/1.0.0/100.100.0.237:16888

/HelloWorldService/1.0.0/100.100.0.238:16888。

如图:

在这里插入图片描述

在zookeeper中,进行服务注册,实际上就是在zookeeper中创建了一个znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正网络拓扑位置以及得知如何调用。RPC服务注册、发现过程简述如下:

1.服务提供者启动时,会将其服务名称,ip地址注册到配置中心。

2.服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。

3.当服务提供者的某台服务器宕机或下线时,相应的ip会从服务提供者IP列表中移除。同时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。

4.当某个服务的所有服务器都下线了,那么这个服务也就下线了。

5.同样,当服务提供者的某台服务器上线时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。

6.服务提供方可以根据服务消费者的数量来作为服务下线的依据。

感知服务的下线&上线

zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除。比如100.100.0.237这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.100.0.238:16888。

服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方、服务提供者地址列表已经发生改变,从而进行更新。

更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。

使用 zookeeper 作为注册中心时,客户端订阅服务时会向 zookeeper 注册自身;主要是方便对调用方进行统计、管理。但订阅时是否注册 client 不是必要行为,和不同的注册中心实现有关,例如使用 consul 时便没有注册。

到此这篇关于Java之Zookeeper注册中心原理剖析的文章就介绍到这了,更多相关Java之Zookeeper注册中心原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解Java如何系统地避免空指针问题

    一文详解Java如何系统地避免空指针问题

    新手Java开发总是经常空指针检查,甚至某些老手也会犯这样的问题,所以这篇文章小编就带大家一起来看看如何系统地避免空指针问题,希望对大家有所帮助
    2024-01-01
  • SpringBoot + Shiro前后端分离权限

    SpringBoot + Shiro前后端分离权限

    这篇文章主要为大家详细介绍了SpringBoot + Shiro前后端分离权限,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Springboot实现邮件发送功能

    Springboot实现邮件发送功能

    这篇文章主要为大家详细介绍了Springboot实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • java动态线程池的简单实现思路

    java动态线程池的简单实现思路

    本文主要介绍了java 动态线程池的简单实现思路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java笔记学习之操作符

    java笔记学习之操作符

    本篇文章给大家分享了关于Java中操作符的相关知识点以及难点总结,有需要的朋友参考学习下吧。
    2018-04-04
  • Mybatis 动态sql if 判读条件等于一个数字的案例

    Mybatis 动态sql if 判读条件等于一个数字的案例

    这篇文章主要介绍了Mybatis 动态sql if 判读条件等于一个数字的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java报错org.hibernate.TypeMismatchException的解决方法

    Java报错org.hibernate.TypeMismatchException的解决方法

    在Java开发领域,尤其是涉及到数据持久化的项目中,Hibernate是一款广泛使用的强大工具,然而,可能会在使用过程中遭遇各种报错,其中org.hibernate.TypeMismatchException就是一个让人头疼的问题,下面我们一起深入剖析这个报错信息
    2024-11-11
  • java IO流文件的读写具体实例

    java IO流文件的读写具体实例

    这篇文章主要介绍了java IO流文件的读写具体实例,有需要的朋友可以参考一下
    2013-12-12
  • Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录

    Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录

    这篇文章主要给大家介绍了关于Spring Boot整合MyBatis连接Oracle数据库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Java线程状态及jstack命令详解

    Java线程状态及jstack命令详解

    jstack是Java虚拟机(JVM)提供的一个非常有用的命令行工具,它允许开发人员和系统管理员在运行时获取Java应用程序的线程堆栈跟踪,在某些情况下,可能需要以管理员或root用户的身份运行jstack命令,这篇文章主要介绍了Java线程状态及jstack命令详解,需要的朋友可以参考下
    2024-03-03

最新评论