Zookeeper(六)Zookeeper实现注册中心【代码实现及解析】
一、引言
Zookeeper除了前面文章写的强大功能以外,另外一个常见应用就是注册中心了,比如Dubbo、SpringCloud等都可以使用ZK作为注册中心,那么注册中心为我们的系统做了什么工作呢?我们可以通过一张图片来了解一下。
二、代码实现
第1步:创建父节点
创建出来的父节点用于管理服务节点
第2步:编写ZK服务端的代码【这里只是以代码的形式来了解ZK的原理,实际ZK已经帮我们做好了注册中心的功能】
/** * 注册中心测试类【服务端】 * * @author 有梦想的肥宅 * @date 2021/8/19 */ public class RegsterServerDemo { private CuratorFramework curatorFramework;//zk客户端 private final String SERVICES_DEMO = "/serviceDemo"; /** * 使用main函数模拟注册中心【ZK】的工作 */ public static void main(String[] args) throws Exception { RegsterServerDemo server = new RegsterServerDemo(); //1、获取zk连接 server.getConnect(); //2、注册服务器到zk集群 server.regist(args[0]);//由于这个是测试类,所以args[0]为从main函数入口传入的主机ip地址【模拟上线一台机器的场景】 //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】 server.business(); } //1、获取zk连接 private void getConnect() throws IOException { curatorFramework = ZookeeperClientUtil.getCuratorFramework(); } //2、注册服务器到zk集群 private void regist(String hostname) throws Exception { //创建临时顺序节点 curatorFramework.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(SERVICES_DEMO + "/" + hostname, hostname.getBytes()); System.out.println(hostname + "上线了~"); } //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】 private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } }
第3步:编写ZK服务消费者的代码【模拟服务消费者去感知服务器的上下线】
/** * 注册中心测试类【客户端/服务消费者】 * * @author 有梦想的肥宅 * @date 2021/8/19 */ public class RegsterClientDemo { private CuratorFramework curatorFramework;//zk客户端 private final String SERVICES_DEMO = "/serviceDemo"; /** * 使用main函数模拟客户端通过zk监听服务上下线 */ public static void main(String[] args) throws Exception { RegsterClientDemo client = new RegsterClientDemo(); //1、获取zk连接 client.getConnect(); //2、监听/serviceDemo下面子节点的增加和删除【获取可用的服务器列表】 client.getServerList(); //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】 client.business(); } //1、获取zk连接 private void getConnect() throws Exception { curatorFramework = ZookeeperClientUtil.getCuratorFramework(); } //2、获取可用的服务器列表 private void getServerList() throws Exception { //服务器列表 ArrayList<String> servers = new ArrayList<>(); //获取/serviceDemo下的子节点,并添加监听 List<String> children = curatorFramework.getChildren().usingWatcher(new Watcher() { @Override public void process(WatchedEvent watchedEvent) { try { //当节点发生变动时,会去调用getServerList()方法获取可用的服务器列表 getServerList(); } catch (Exception e) { e.printStackTrace(); } } }).forPath(SERVICES_DEMO); //循环获取子节点的值【对应的主机地址】 for (String child : children) { byte[] data = curatorFramework.getData().forPath(SERVICES_DEMO + "/" + child); servers.add(new String(data)); } //打印 System.out.println(servers); } //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】 private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } }
第4步:启动服务消费者进行监听,以命令行创建节点观察服务消费者的变化
第5步:启动服务端代码,模拟服务器真实上线
在第4步我们已经验证了,服务消费者可以正常监听节点的变更,现在我们用代码的方式来模拟服务器的上下线
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律