zookeeper快速入门五:用zookeeper实现服务注册与发现中心
系列:
zookeeper快速入门一:zookeeper安装与启动-CSDN博客
zookeeper快速入门二:zookeeper基本概念-CSDN博客
zookeeper快速入门三:zookeeper的基本操作
zookeeper快速入门四:在java客户端中操作zookeeper-CSDN博客
经过前面四章的讲解,我们已经对zookeeper建立起初步的概念,这篇文章就来做一个小小的实践,用zookeeper实现一个简单版的服务注册与发现中心。
zookeeper的一个常见功能就是作为服务注册与发现中心。
我们先创建一个节点/services。
Stat stat = zkClient.exists("/services",false);if (stat == null ){zkClient.create("/services","".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}
每当有一个服务上线时,我们就向我们的服务注册与发现中心zookeeper注册我们的应用。
比如,我们注册一个user服务,服务地址是localhost:8080,那么我们就在/services下面建立一个user子节点,子节点数据为user服务的真实url地址,比如localhost:8080,子节点类型为临时节点。
public void registerService()throws Exception{zkClient.create("/services/user","localhost:8080".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);}
当我们向user请求服务时,首先通过/services节点获取user服务,判断user服务是否存在。进而获取它的地址,发起真正的请求。同时,我们注册一个监听事件,监听节点的状态变化。当user服务出现故障或其他因素而下线时,/services/user节点会被删除,zookeeper server会通知到监听这个节点的客户端,从而使客户端做出自己的响应,同样的,当user服务上线或地址修改,客户端也能收到通知。
public void invokeUserService()throws Exception{Stat stat = zkClient.exists("/services/user",false);if (stat == null){System.out.println("未能找到user服务,服务未注册或已下线");}byte[] url = zkClient.getData("/services/user", new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getType() == Event.EventType.NodeDeleted){System.out.println("服务下线");
// 处理业务逻辑}if (watchedEvent.getType() == Event.EventType.NodeCreated){System.out.println("服务上线");
// 处理业务逻辑}if (watchedEvent.getType() == Event.EventType.NodeDataChanged){System.out.println("服务地址修改了");}}}, null);
// 处理业务逻辑System.out.println("向"+new String(url)+"发起请求");}

如果对前面有印象的话,应该记得zookeeper的watcher只触发一次,当节点状态改变一次之后,节点状态的第二次改变就不能监听到了。为了能够持续监听,我们需要修改一下我们的代码。
我们把判断服务上线的代码挪到上面来,并且在下面的监听事件里回调invokeUserService方法,实现持续监听的功能。
为了简单易懂,这里代码写得并不够好,如果是实际项目,需要再做点拆分与封装。
public void invokeUserService()throws Exception{Stat stat = zkClient.exists("/services/user",false);if (stat == null){System.out.println("未能找到user服务,服务未注册或已下线");zkClient.exists("/services/user", new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getType() == Event.EventType.NodeCreated){System.out.println("服务上线");
// 处理业务逻辑}}});}else{byte[] url = zkClient.getData("/services/user", new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {if (watchedEvent.getType() == Event.EventType.NodeDeleted){System.out.println("服务下线");
// 处理业务逻辑}if (watchedEvent.getType() == Event.EventType.NodeDataChanged){System.out.println("服务地址修改了");}try {invokeUserService();}catch (Exception e){}}}, null);
// 处理业务逻辑System.out.println("向"+new String(url)+"发起请求");}}

zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,简单的了解到这里就已经足够了。下面会讲zookeeper的架构设计与原理,比如zookeeper的原子协议,leader选举算法等。
相关文章:
zookeeper快速入门五:用zookeeper实现服务注册与发现中心
系列: zookeeper快速入门一:zookeeper安装与启动-CSDN博客 zookeeper快速入门二:zookeeper基本概念-CSDN博客 zookeeper快速入门三:zookeeper的基本操作 zookeeper快速入门四:在java客户端中操作zookeeper-CSDN博客…...
Java 中 BitSet 类的用法
Java 中 BitSet 类的用法 API构造置位为 true清除为 false查找位反转长度运算流其他 原理底层数据结构如何工作 API 构造 无参构造 :默认为 64 个 bit 的容量 BitSet bitset new BitSet();有参构造 :设置为 n 个 bit 的容量 BitSet bitset new BitSe…...
Jenkins-pipeline流水线构建完钉钉通知
添加钉钉机器人 在钉钉群设置里添加机器人拿出Webhook地址,设置关键词 Jenkins安装钉钉插件 Dashboard > 系统管理 > 插件管理,搜索构建通知,直接搜索Ding Talk也行 安装DingTalk插件,重启Jenkins 来到Dashboard > 系…...
汽车制造业供应商管理会面临哪些问题?要如何解决?
汽车行业的供应链是及其复杂的,并且呈全球化分布,企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先,将面临巨大的挑战,尽快地将产品推向市场是保持领先的唯一途径。然而,如果没有正确的方式去实现安全…...
day28|93. 复原 IP 地址|Leetcode 78. 子集|90.子集II
Leetcode 93. 复原 IP 地址 链接:93. 复原 IP 地址 class Solution { public:vector<string> res;string path;int pointNum 0;vector<string> restoreIpAddresses(string s) {backtracking(0, s);return res;}void backtracking(int start, string …...
怎样提升小程序日活?签到抽奖可行吗?
一、 日活运营策略 小程序应该是即用即走的,每个小程序都在用户中有自己的独特定位,可能是生活日常必备(美食、团购、商城),也可能是工作办公必备(文档、打卡、工具)。 如果你想要让自己的小程…...
hive语法树分析,判断 sql语句中有没有select *
pom依赖参考以下博文java 通过 IMetaStoreClient 取 hive 元数据信息-CSDN博客1 节点处理器类 import lombok.Getter; import org.apache.hadoop.hive.ql.lib.Dispatcher; import org.apache.hadoop.hive.ql.lib.Node; import org.apache.hadoop.hive.ql.parse.ASTNode; impor…...
【论文阅读】MSGNet:学习多变量时间序列预测中的多尺度间序列相关性
MSGNet:学习多变量时间序列预测中的多尺度间序列相关性 文献介绍摘要总体介绍背景及当前面临的问题现有解决方案及其局限性本文的解决方案及其贡献 背景知识的相关工作背景知识问题表述: Method论文主要工作1.输入嵌入和剩余连接 (Input Embedding and R…...
智慧城市与数字孪生:共创未来城市的智慧生活
目录 一、智慧城市与数字孪生的概念与特点 二、智慧城市与数字孪生共创智慧生活的路径 1、城市规划与建设的智能化 2、城市管理与服务的智慧化 3、城市安全与应急管理的智能化 三、智慧城市与数字孪生面临的挑战与对策 四、智慧城市与数字孪生的发展趋势与展望 1、技术…...
【Ubuntu】FTP站点搭建
配置顺序 前提条件:确保软件仓库可以正常使用,确保已正常配置IP地址 1.安装FTP服务 2.编辑FTP配置文件 3.设置开机自启 4.创建用户 5.配置用户限制名单 6.重启服务 7.查看运行状态 8.测试在同一局域网下的Windows查看文件 1.安装FTP服务 sudo apt insta…...
RK3228H is the same SoC as rk3328.
RK3228H is the same SoC as rk3328....
Golang 开发实战day04 - Standard Library
Golang 开发实战day04 - Standard Library 接下来开始我们第四天学习,Go语言标准库提供了丰富的功能,可以帮助开发者快速完成各种任务。 golang就像其他语言一样,附带了一些非常轻量级的函数和特性,都是开箱即用的,这里…...
程序员排查BUG指南
程序员排查BUG(错误)是软件开发过程中的重要一环, 以下是一份程序员排查BUG的指南,帮助你更有效地识别、定位和修复问题: 1、重现BUG:确保能够准确地重现BUG,这是解决问题的第一步。尽量记录重现BUG的步骤。…...
【Vue】elementUI-MessageBox组件相关
官方代码: <template><el-button type"text" click"open">点击打开 Message Box</el-button> </template><script>export default {methods: {open() {this.$confirm(此操作将永久删除该文件, 是否继续?, 提示…...
数据库运行状况和性能监控工具
数据库监控是跟踪组织中数据库的可用性、安全性和性能的过程,它涉及通过跟踪各种关键指标来分析数据库的性能,确保数据库的正常运行并具有深入的可见性,并在出现潜在问题时触发即时警报,以采取主动措施来确保数据库的高可用性。 …...
CTF-辨别细菌
题目描述:try your best to find the flag. 进入靶场后发现是一个游戏,需要全部答对才可以得到最后的flag 查看了一下源码,发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…...
RuoYi-Vue开源项目2-前端登录验证码生成过程分析
前端登录验证码实现过程 生成过程分析 生成过程分析 验证码的生成过程简单概括为:前端登录页面加载时,向后端发送一个请求,返回验证码图片给前端页面展示 前端页面加载触发代码: import { getCodeImg } from "/api/login&q…...
error: C preprocessor fails sanity check
问题 ./configure --prefix/opt/mips_lib/libev --hostmipsel-openwrt-linux CCmipsel-openwrt-linux-gcc运行后提示 checking how to run the C preprocessor... mipsel-openwrt-linux-gcc --sysroot/opt/mt7628/toolchain-mipsel_24kc_gcc-8.4.0_musl -I/opt/mt7628/toolch…...
Kubernetes实战(三十一)-安装containerd
1 资源 containerd项目官方地址 GitHub - containerd/containerd: An open and reliable container runtime containerd的发布版本地址: Releases containerd/containerd GitHub 2 安装containerd 2.1 解压安装 2.1.1 下载压缩包 curl -LO https://github…...
使用docker搭建faiss向量数据库
为了不污染服务器环境,保证程序运行时有更好的隔离性,领导要求基于容器运行程序。 一、准备工作 1、创建文件夹faiss 该文件夹有用于存放faiss相关的文件及脚本 mkdir ~/faiss 2、创建data文件夹 cd ~/faiss mkdir data 这个文件夹用于volume…...
PHP文本操作+文件夹遍历+递归文件夹操作
1、什么是文件操作?磁盘上用户能看到的逻辑数据结构(文件夹和文件)对文件的增删改查2、为什么要有文件操作? 当程序需要为某些特定操作进行文件夹或者文件处理的时候,都会应用到文件操作。 文件上传的时候创建目录&…...
实战指南(一)易语言与大漠插件:从零打造自动化脚本的避坑手册
1. 易语言与大漠插件入门指南 第一次接触易语言和大漠插件时,我完全被它们的强大功能震撼到了。易语言作为一款中文编程工具,对新手特别友好,而大漠插件则是自动化脚本开发的利器。记得刚开始学习时,我花了一整天时间才成功调通第…...
振动式马铃薯收获机的设计(农业机械毕业设计含CAD图纸)
马铃薯作为全球重要的粮食作物,其收获环节长期面临效率低、损伤率高的难题。传统人工挖掘或简单机械作业易导致块茎破损,且受土壤湿度、地形条件限制较大。振动式马铃薯收获机的设计,正是针对这一痛点展开的创新探索。其核心作用在于通过振动…...
访问管理化技术身份验证与单点登录实现
访问管理化技术:身份验证与单点登录的革新实践 在数字化时代,企业信息系统日益复杂,如何高效、安全地管理用户访问权限成为关键挑战。访问管理化技术通过集中化的身份验证与单点登录(SSO)实现,不仅提升了用…...
VQA系统进入毫秒级响应时代(2026奇点大会闭门报告首次披露)
第一章:VQA系统进入毫秒级响应时代(2026奇点大会闭门报告首次披露) 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点大会闭门技术报告中,三所联合实验室(MIT CSAIL、DeepMind VQA Group、中科院自动化所视觉…...
AWS 账单查看与付款方式设置指南(企业支持实用手册)
一文搞定 AWS 发票下载、费用明细查询和电汇付款配置,适合企业财务和运维人员快速上手。 前言 使用 AWS 的企业经常会遇到这几个问题:月底了发票在哪下载?费用明细怎么导出给财务?公司要用银行电汇付款怎么设置? 这篇文章把这三件事讲清楚,都是控制台操作,不需要写代码…...
[CI/CD] 排障实录:内网环境下 Jenkins + ArgoCD 流水线搭建
说明:本文基于个人学习测试环境编写,部分配置(如镜像仓库使用 HTTP、NodePort 暴露服务等)仅为简化演示,仅供参考,生产环境请遵循安全规范。 1. 基本信息 任务类型:部署 / 故障排查 涉及系统/服务: K3s 集群(v1.33.4+k3s1,1 Master + 2 Worker) Jenkins(Helm 部署…...
5秒获取百度网盘提取码:智能解析工具的技术架构与实战指南
5秒获取百度网盘提取码:智能解析工具的技术架构与实战指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey baidupankey作为专业的百度网盘提取码智能获取工具,通过创新的技术架构解决了用户在访问加密分…...
贵阳纳海川科技·蔬菜配送行业解决方案
AIIoT赋能蔬菜配送数字化转型:全链路技术方案实践据行业数据显示,传统蔬菜配送行业平均损耗率达15%-25%,人工分拣错漏率超8%,车辆空驶率达28%,利润率仅4%左右。面对蔬菜易腐烂、价位波动大、保鲜要求高的行业特性&…...
保姆级教程:在Ubuntu 22.04上从零编译ArmSoM Sige7的RK3588 Linux固件(含环境配置与常见错误排查)
RK3588 Linux固件编译实战:从环境搭建到烧录全流程指南 1. 开发环境准备与SDK获取 在Ubuntu 22.04系统上编译RK3588 Linux固件前,需要确保主机满足以下硬件要求: 磁盘空间:至少40GB可用空间(多系统编译需更大&#…...
