热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Ⅶ:教你一招利用zookeeper作为服务的配置中心

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Ⅶ:教你一招利用zookeeper作为服务的配置中心相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Ⅶ:教你一招利用zookeeper作为服务的配置中心相关的知识,希望对你有一定的参考价值。






2021最新zookeeper系列

❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️

Ⅰ:zookeeper的单机安装 - 详细教程:https://blog.csdn.net/Kevinnsm/article/details/116134397?spm=1001.2014.3001.5501

Ⅱ:zookeeper的相关shell命令:https://blog.csdn.net/Kevinnsm/article/details/116137602?spm=1001.2014.3001.5501

Ⅲ:zookeeper之查看节点的状态信息:https://blog.csdn.net/Kevinnsm/article/details/116143218?spm=1001.2014.3001.5501

Ⅳ:zookeeper的acl权限控制:https://blog.csdn.net/Kevinnsm/article/details/116167394?spm=1001.2014.3001.5501

Ⅴ:zookeeper的相关Java Api:https://blog.csdn.net/Kevinnsm/article/details/116462557?spm=1001.2014.3001.5501

Ⅵ:zookeeper的Watcher事件监听机制:https://blog.csdn.net/Kevinnsm/article/details/116501842?spm=1001.2014.3001.5501

Ⅶ:教你一招利用zookeeper作为服务的配置中心:https://blog.csdn.net/Kevinnsm/article/details/116542974?spm=1001.2014.3001.5501

❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️



文章目录


  • 前置:--》把握住Watcher流程《--
  • 一、环境搭建
    • Ⅰ、使用工具
    • Ⅱ、创建节点
    • Ⅲ、代码编写






前置:–》把握住Watcher流程《–

1、连接zookeeper服务器
2、连接时必须使当前线程等待(等待其他线程创建连接zookeeper服务成功,使用计数器实现)
3、执行回调函数process
4、释放当前线程



一、环境搭建

演示mysql的连接配置(将mysql连接属性配置到zookeeper服务器)



Ⅰ、使用工具



使用云服务器作为zookeeper的演示环境,本地使用xshell远程连接
如果不知,请移步:https://blog.csdn.net/Kevinnsm/article/details/116134397?spm=1001.2014.3001.5501



Ⅱ、创建节点



create /config “config”
create /config/mysql “datasource”
create /config/mysql/driver "com.mysql.cj.jdbc.Driver
create /config/mysql/url "jdbc:mysql://127.0.0.1/test?serverTimezone=UTC
create /config/mysql/username “root”
create /config/mysql/password “xxxxxxx”
在这里插入图片描述



Ⅲ、代码编写

package com.zookeeper.config;
import com.zookeeper.watcher.WatcherConnection;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* @author:抱着鱼睡觉的喵喵
* @date:2021/5/8
* @description:
*/

public class ZookeeperConfigCenter implements Watcher {
//mysql的本地变量
private String driver;
private String url;
private String username;
private String password;
static ZooKeeper zooKeeper;
static CountDownLatch countDownLatch = new CountDownLatch(1);
final static String IP = "8.140.37.103:2181";
//构造函数,只要一创建该类,就执行getProperty()方法
public ZookeeperConfigCenter() {
getProperty();
}
//重写回调函数
@Override
public void process(WatchedEvent watchedEvent) {
try {
if (watchedEvent.getType() == Event.EventType.None) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
System.out.println("连接成功");
//如果连接成功,放行当前线程
countDownLatch.countDown();
} else if (watchedEvent.getState() == Event.KeeperState.Disconnected) {
System.out.println("连接中断");
} else if (watchedEvent.getState() == Event.KeeperState.Expired) {
System.out.println("连接超时");
//如果连接超时就重新进行连接
zooKeeper = new ZooKeeper(IP, 5000, new WatcherConnection());
} else if (watchedEvent.getState() == Event.KeeperState.AuthFailed) {
System.out.println("验证失败");
}
//如果监听到节点数据发生了变化,就重新连接读取节点数据
} else if (watchedEvent.getType() == Event.EventType.NodeDataChanged) {
getProperty();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//核心方法
public void getProperty() {
try {
//连接zookeeper服务
zooKeeper = new ZooKeeper(IP, 20000, this);
//等待其他线程连接zookeeper服务
countDownLatch.await();
this.driver = new String(zooKeeper.getData("/config/mysql/driver", true, null));
this.url = new String(zooKeeper.getData("/config/mysql/url", true, null));
this.username = new String(zooKeeper.getData("/config/mysql/username", true, null));
this.password = new String(zooKeeper.getData("/config/mysql/password", true, null));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
@Test
public void test() {
try {
ZookeeperConfigCenter configCenter = new ZookeeperConfigCenter();
for (int i &#61; 1; i < 6; i&#43;&#43;) {
System.out.println(configCenter.driver);
System.out.println(configCenter.url);
System.out.println(configCenter.username);
System.out.println(configCenter.password);
//休眠10秒
Thread.sleep(10000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

另外也用到了一个简单的连接类作为zookeeper连接超时的回调处&#xff0c;然后进性重新连接&#xff08;实现了watcher接口&#xff09;

public class WatcherConnection implements Watcher {
static CountDownLatch countDownLatch &#61; new CountDownLatch(1);
//计数器
static ZooKeeper zooKeeper;
public static void main(String[] args) {
try {
zooKeeper &#61; new ZooKeeper("123.57.252.59:2181", 5000, new WatcherConnection());
countDownLatch.await();
Thread.sleep(10000);
zooKeeper.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
&#64;Override
public void process(WatchedEvent watchedEvent) {
try {
if (watchedEvent.getType() &#61;&#61; Event.EventType.None) {
if (watchedEvent.getState() &#61;&#61; Event.KeeperState.SyncConnected) {
System.out.println("连接成功!");
countDownLatch.countDown();
} else if (watchedEvent.getState() &#61;&#61; Event.KeeperState.Disconnected) {
System.out.println("断开连接");
} else if (watchedEvent.getState() &#61;&#61; Event.KeeperState.Expired) {
System.out.println("超时了");
} else if (watchedEvent.getState() &#61;&#61; Event.KeeperState.AuthFailed) {
System.out.println("认证失败!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

测试
在这里插入图片描述
在这里插入图片描述



可以看出当监听到/config/mysql/username节点的数据发生变更时&#xff0c;控制台就会重新获取节点值


如果控制台出现了ConnectionLoss错误&#xff0c;可能是网络差导致连接断开或者服务器宕机






推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
author-avatar
mobiledu2502896655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有