微服务实战系列之ZooKeeper(上)

前言

历经1个多月的创作和总结,纵观博主微服务系列博文,大致脉络覆盖了以下几个方面:

  1. 数据方面(缓存&安全)
    比如Redis、MemCache、Ehcache、J2cache(两级缓存框架)、RSA加密、Sign签名…
  2. 传输方面(消息系统)
    MQ、通信基础
  3. 服务方面(支撑服务)
    Feign、Token、Sentinel、Nacos、Gateway

显然,我们可以观察到,如果只有这些工具或组件,还不足以支撑一个中型微服务系统。

如此,今天博主继续拉新,谈一谈 ZooKeeper 是怎么回事,为什么我们有时候对它望而生畏而又难以割舍呢?
在这里插入图片描述
我们一起走进今天的话题,请各位盆友紧随博主,以防迷路。

走进ZooKeeper

ZooKeeperis a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

翻译成大白话:
ZooKeeper 是一个“中央处理器”,主要面向配置管理与维护目录服务分布式集群服务提供相关能力和支持。

一、配置管理

提到Zookeeper的配置管理,我们是不是立刻可以想到另外一个工具:Nacos?对了,Nacos也可以管理配置,实现热部署。那么ZooKeeper 又是怎么回事?

首先这里的配置比较泛泛而谈,可以见到理解为一段文本或一个服务信息等等。比如我们经典的dubbo,使用ZooKeeper作为注册中心,其实利用了它的该特点,也充当了“配置或服务管理员”的角色。

在这里插入图片描述
每个Client(客户端)初始化时,会向ZooKeeper注册一个Watcher,通过它实现监听与同步,最终完成配置或服务的一致性管理。

二、目录和命名管理

目录和命名服务又是什么?是否可以立刻联想到JNDI(Java Naming and Directory Interface,Java命名和目录接口)?,当年大名鼎鼎SUN提供的一整套命名服务API,为J2EE的建设立下了汗马功劳。

比如我们常见的datasource 配置就是典型的JNDI服务:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
	<local-tx-datasource>
		  <jndi-name>myds-msql</jndi-name>
		  <connection-url>jdbc:mysql://localhost:3306/test</connection-url>
		  <driver-class>com.mysql.jdbc.Driver</driver-class>
		  <user-name>root</user-name>
		  <password>123456</password>
	</local-tx-datasource>
</datasources>

那么ZooKeeper又是怎么设计的呢?请转向下图:
在这里插入图片描述
ZooKeeper提供了一种 树形 结构的数据存储方式。这样做的好处是在分布式环境下,实现全局唯一性。
在这里插入图片描述

我们可以提前把各种服务、各种地址、各种目录,比如地址信息以数据存储于ZooKeeper中。在使用的时候,只需从中读取即可,原理与JNDI类似。

统一命名的含义,可以理解为对一个服务转为一个代号。比如我们经常使用的域名,其实就是对某个主机IP的“翻译”

三、分布式集群

谈到分布式,其实我们实现微服务就是为了分布式部署和运行。ZooKeeper作为分布式的利器,主要体现在强大的集群运行能力。

博主首选带着各位盆友看一下,集群是如何运行的:

在这里插入图片描述

这是官方提供的ZooKeeper集群运行示意图。从上图我们可以看到,ZooKeeper集群并非采用Master-Slave模式,而是采用了Leader-Follower模式。上图中除了标识为“Leader(领袖)”的Server节点外,其他Server均为“Follower(随从)”。当然还有另外一种角色是“Observer(观察员)”,我们后面再讲它。

当然Zookeeper集群中,哪个节点应该做领袖,哪个节点应该是随从,说来话长,且听下回分解。


结语

通过以上总结性叙述,博主简单介绍了ZooKeeper具备的核心能力。当然它还具备一些非主打的特性,在这里就不再详细展开了。

此刻,博主不禁感慨:离开了ZooKeeper,分布式将变的困难的多;离开了分布式,微服务也将黯然失色。

好了,ZooKeeper第一篇到此为止,希望对各位盆友有所帮助,GoodNight!


历史回顾

  • 微服务实战系列之MQ
  • 微服务实战系列之通信
  • 微服务实战系列之J2Cache
  • 微服务实战系列之Cache(技巧篇)
  • 微服务实战系列之MemCache
  • 微服务实战系列之EhCache
  • 微服务实战系列之Redis
  • 微服务实战系列之Cache
  • 微服务实战系列之Nginx(技巧篇)
  • 微服务实战系列之Nginx
  • 微服务实战系列之Feign
  • 微服务实战系列之Sentinel
  • 微服务实战系列之Token
  • 微服务实战系列之Nacos
  • 微服务实战系列之Gateway
  • 微服务实战系列之加密RSA
  • 微服务实战系列之签名Sign

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/248263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣22. 括号生成(java 回溯法)

Problem: 22. 括号生成 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们首先要知道&#xff0c;若想生成正确的括号我们需要让右括号去适配左括号&#xff0c;在此基础上我们利用回溯去解决此题目 1.题目给定n个括号&#xff0c;即当回溯决策路径长度等于 2 n 2n…

学习笔记9——JUC三种量级的锁机制

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/197325.html 多线程访问共享资源冲突 临界区&#xff1a;一段代码块存在对共享资源的多线程读写操作&#xff0c;称这段代码块为临界区 竞态条件&#xff1a;多个线程在临界…

Anaconda文件目录(打开默认路径)更改

Anaconda 文件默认目录更改 每次打开 Anaconda 都在C盘怎么办&#xff0c;如何改为D盘或是其他盘符位置&#xff1f; 可以进行下述操作。 1. 单次修改路径 单次修改路径&#xff1a;在 exe 文件(Anaconda Prompt (Anaconda_py))中写入下面代码&#xff1a; jupyter notebook …

微信小程序ec-canvas(echarts)显示地图【以甘肃省为例】

文章目录 一、效果图二、实现1、下载echarts插件2、定制图形&#xff0c;生成 echarts.min.js 文件3、小程序中使用&#xff08;1&#xff09;下载甘肃地图&#xff08;2&#xff09;使用 参考文档《微信小程序使用echarts显示全国地图》《如何在微信小程序开发中使用echarts以…

详解Keras3.0 KerasCV API: StableDiffusion image-generation model

Stable Diffusion 图像生成模型&#xff0c;可用于根据简短的文本描述&#xff08;称为“提示”&#xff09;生成图片 keras_cv.models.StableDiffusion(img_height512, img_width512, jit_compileTrue) 参数说明 img_height&#xff1a;int&#xff0c;要生成的图像的高度…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后&#xff0c;后按照Tools->IP Generator顺序&#xff0c;创建IP核&#xff0c;如下图&#xff1a; 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图&#xff0c;生成的.v文件只…

美国 AGU 发布 AI 应用手册,明确 6 大指导方针

爆发性的 AI 应用&#xff1a;风险与机遇并存 在空间和环境科学领域&#xff0c;AI 工具的应用越来越广泛——诸如天气预报和气候模拟&#xff0c;能源及水资源管理等等。可以说&#xff0c;我们正在经历前所未有的 AI 应用爆发&#xff0c;面对其中的机遇与风险&#xff0c;更…

DTC 故障严重程度

文章目录 简介DTC严重性 位定义DTC 类别定义参考 简介 DTCSeverityMask&#xff08;DTC严重性掩码&#xff09;/ DTCSeverity&#xff08;DTC严重性&#xff09;包含了DTC严重性和DTC类别信息。 DTCSeverityMask&#xff08;DTC严重性掩码&#xff09;&#xff0f;DTCSeverit…

找不到mfc100u.dll,程序无法继续执行?三步即可搞定

在使用电脑过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到mfc100u.dll”。mfc100u.dll是Microsoft Foundation Class&#xff08;MFC&#xff09;库中的一个版本特定的DLL文件。MFC是微软公司为简化Windows应用程序开发而提供的一套C类库。它包…

接口测试工具Postman接口测试图文教程

一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致&#xff0c;任何一方的进度跟不上&#xff0c;都无法及时…

牛客网BC107矩阵转置

答案&#xff1a; #include <stdio.h> int main() {int n0, m0,i0,j0,a0,b0;int arr1[10][10]{0},arr2[10][10]{0}; //第一个数组用来储存原矩阵&#xff0c;第二个数组用来储存转置矩阵scanf("%d%d",&n,&m); if((n>1&&n<10)&&am…

【最新版】PyCharm基础调试功能详解

文章目录 一、断点1. 断点的类型a. 行断点b. 异常断点 2. 设置断点a. 设置行断点b. 设置异常断点 3. 管理断点a. 删除断点b. 将断点静音 二、调试功能0. 测试代码1. 设置断点2. 调试的多种启动方式3. 观察调试控制台a. 步过b. 步入c. 单步执行代码d. 步出e. 运行到光标处f. 重新…

vivado约束方法6

生成的时钟 定时约束向导建议在的输出上创建一个生成的时钟顺序单元&#xff0c;当它直接或通过驱动其他顺序单元的时钟引脚时一些互连逻辑。与PLL或MMCM不同&#xff0c;用户逻辑不能将主时钟&#xff0c;因此向导仅提供指定除法系数的选项&#xff0c;如中所示如下图所示&am…

protobuf基础学习

部分内容出自&#xff1a;https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件&#xff0c;简单地说&#xff0c;就是一个消息的协议文件&#xff0c…

Cloudflare始终使用HTTPS且带参数跳转到www的域名

文章目录 设置教程设置图跳转实测 设置教程 关闭 SSL/TLS -> 边缘证书 的 Always Use HTTPS 规则 -> 页面规则 -> URL: http://www.example.com/* 设置成始终使用HTTPS 规则 -> 页面规则 -> URL: example.com/* 设置成 转发URL301重定向到 to https://www.ex…

sql 数据类型注入+tamper

数字型 0-9 查询语句&#xff1a; $sql"select * from sy_guestbook where id$i"; 字符型 a-z 中文 标点符号 加入了单引号 查询语句&#xff1a; $sql"select * from sy_guestbook where gTpl$g"; simple order by 16--select * from sy_guestbook w…

【Spring】Spring AOP

Spring AOP AOP概述什么是AOP Spring AOP快速入门1.引入AOP依赖2. 编写AOP程序 Spring AOP 详解Spring AOP 核心概念切点(Pointcut)连接点(Join Point)通知(Advice)切面(Aspect) 通知类型PointCut切面优先级Order切点表达式execution表达式annotation自定义注解切面类 AOP原理代…

记录一下github深度学习的错误

解决办法&#xff1a;Anaconda\envs\pytorch_gpu\Lib\site-packages\visdom\server 修改run_server.py中注释掉第1917行的代码 def download_scripts_and_run(): #download_scripts() ~~~~~~~~这行 main() 替换static 获取方式&#xff1a;GitHub - littledee…

Vue 子传父 组件传参 defineEmits

defineEmits 属性&#xff1a;用于创建自定义事件&#xff0c;接收子组件传递过来的数据。 注意&#xff1a;如果自定义事件的名称&#xff0c;和原生事件的名称一样&#xff0c;那么只会触发自定义事件。 defineEmits 仅适用于 setup 语法糖&#xff0c;其它写法请见&#x…

docker创建镜像 Dockerfile

目录 docker的创建镜像的方式 dockerfile形成&#xff08;原理&#xff09; docker的核心作用 docker的文件结构 dockerfile的语法 CMD和ENTRPOINT的区别 创建dockerfile镜像 区别 RUN命令的优化 如何把run命令写在一块 copy和ADD区别 区别 centos7 构建Apache的d…