提取码:5555
一、 Zookeeper 简介: 1:什么是zookeeper zooper首先 明白这是一个分布式框架,类似于注册中心,起的主要作用就是一个文件系统中心+一个监听通知 Zookeeper 官网: http://zookeeper.apache.org/ Zookeeper 是 Apache 的一个分布式服务框架,是 Apache Hadoop 的一个子项目。官方 文档上这么解释 Zookeeper ,它主要是用来解决分布式应用中经常遇到的一些数据管理问题, 如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 2:zookeeper的存储结构 zookeeper的存储结构类似于Linux系统的文件结构,根为/,下次有znode节点然后一节一节往下扩展,由此可以看出必然是树形结构,并且吧信息可以存放带每个节点 2.1:znode的节点类型 共四种,持久,带序号持久,临时节点,带序号临时节点 3: 通知机制: Zookeeper 是使用观察者设计模式来设计的。当客户端注册监听它关心的目录节点时, 当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时, Zookeeper 会通知客 户端。 4、 安装 zookeeper
解压 Zookeeper 压缩包
[root@localhost temp]# tar -zxf zookeeper-3.6.0.tar.gz [root@localhost temp]# cp zookeeper-3.6.0 /usr/local/zookeeper -r
4.1 Zookeeper 目录结构
1. bin :放置运行脚本和工具脚本, 2. conf : zookeeper 默认读取配置的目录,里面会有默认的配置文件 3. docs : zookeeper 相关的文档 4. lib : zookeeper 核心的 jar 5. logs : zookeeper 日志
4.2 配置 Zookeeper
这里要提前创建一个data用于作为zookeeper的缓存
Zookeeper 在启动时默认的去 conf 目录下查找一个名称为 zoo.cfg 的配置文件。 在 zookeeper 应用目录中有子目录 conf 。其中有配置文件模板: zoo_sample.cfg cp zoo_sample.cfg zoo.cfg 。 zookeeper 应用中的配置文件为 conf/zoo.cfg。修改配置文件 zoo.cfg - 设置数据缓存路径
4.3 Zookeeper常用命令
默认加载配置文件: ./zkServer.sh start :默认的会去 conf 目录下加载 zoo.cfg 配置文件。 指定加载配置文件: ./zkServer.sh start 配置文件的路径。 停止: ./zkServer.sh stop 状态: ./zkServer.sh status 连接: 默认连接地址为本机地址,默认连接端口为 2181 bin/zkCli.sh 连接指定 IP 地址与端口 bin/zkCli.sh -server ip:port5 Zookeeper 集群 5.1:Zookeeper 集群中的角色
Zooper主要角色有:
领导者,学习者(跟随者,观察者),客服端
领导者:类似Redis中master,跟随者:类似client,
5.2: Zookkeeper集群安装: 5.2.1创建: 使用 3 个 Zookeeper 应用搭建一个伪集群。应用部署位置是: 192.168.233.130 。客户端 监听端口分别为: 2181 、 2182 、 2183 。投票选举端口分别为 2881/3881 、 2882/3882 、 2883/3883 。 tar -zxf zookeeper-3.6.0.tar.gz 将解压后的 Zookeeper 应用目录重命名,便于管理 mv zookeeper-3.6.0 zookeeper01 5.2.1:提供缓存目录 在 zookeeper01 应用目录中,创建 data 目录,用于缓存应用运行数据 cd zookeeper01 mkdir data 复制两份 Zookeeper 应用。用于模拟集群中的 3 个节点。 cp -r zookeeper01 zookeeper02 cp -r zookeeper01 zookeeper03 5.2.3创建并修改配置 在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板: zoo_sample.cfg cp zoo_sample.cfg zoo.cfg zookeeper 应用中的配置文件为 conf/zoo.cfg 。 修改配置文件 zoo.cfg - 设置数据缓存路径 dataDir 参数值为应用运行缓存数据保存目录。 5.2.4 提供应用唯一标识 在 Zookeeper 集群中,每个节点需要一个唯一标识。这个唯一标识要求是自然数。且唯 一标识保存位置是:数据缓存目录 (dataDir=/usr/local/zookeeper/data) 的 myid 文件中。其中 “数据缓存目录”为配置文件 zoo.cfg 中的配置参数 在 data 目录中创建文件 myid : touch myid 为应用提供唯一标识。本环境中使用 1 、 2 、 3 作为每个节点的唯一标识。 vi myid 简化方式为: echo [ 唯一标识 ] >> myid 。 echo 命令为回声命令,系统会将命令发送的 数据返回。 '>>' 为定位,代表系统回声数据指定发送到什么位置。 此命令代表系统回声数 据发送到 myid 文件中。 如果没有文件则创建文件。 5.2.5修改配置文件 zoo.cfg - 设置监听客户端、投票、选举端口clientPort= 2181 # 服务端口根据应用做对应修改 ,zk01-2181,zk02-2182,zk03-2183 server.1=192.168.233.130:2881:3881 server.2=192.168.233.130:2882:3882 server.3=192.168.233.130:2883:3883
5.2.6测试启动
启动 Zookeeper 集群脚本 zookeeper01/bin/zkServer.sh start zookeeper02/bin/zkServer.sh start zookeeper03/bin/zkServer.sh start 可以使用任何节点中的客户端工具连接集群中的任何节点。 ./zkCli.sh -server 192.168.233.130:2183 6:zookeeper中的常用命令: ls 命令 二:Java中使用zookeeper 1、链接: 引入依赖 创建测试类: new 一个zookeeper对象,使用三参构造,ip路由端口,超时时间,事件通知对象(监听对象) // 这里事件监听对象,我们直接使用测试类让其实现Watcher 接口,然后实现process方法即可,可以在process中设置当链接成功,失败等时候执行的回调方法 创建一个Znode 调用zookeeper.create 使用其四参构造,创建路径,Znode值内容,权限,以及Znode节点类型2,获取、修改、删除 zookeeper值public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ZooKeeper zooKeeper = new ZooKeeper("192.168.8.129:2181",150000,new zookeeper_test()); String path = zooKeeper.create("/wufan/zookeeper/test","oldlu".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT_SEQUENTIAL); System.out.println(path);public void process(WatchedEvent watchedEvent) { if (watchedEvent.getState() == Event.KeeperState.SyncConnected){ System.out.println("链接成功"); } }
byte[] b1 = zooKeeper.getData("/wufan/zookeeper/test/xxxd",new zookeeper_test(),new Stat());
System.out.println(new String(b1));
List list = zooKeeper.getChildren("/wufan/zookeeper/test/",new zookeeper_test(),null);
for(String paths : list){
byte [] data = zooKeeper.getData("/wufan/zookeeper/test/"+paths,new zookeeper_test(),null);
System.out.println(data);
}
Stat就是 当前节点的详细信息,修改次数,版本等
Stat stat = zooKeeper.setData("/bjsxt/test0000000001","bjsxt".getBytes(),-1);
// -1 代表匹配任意版本
zooKeeper.delete( "/bjsxt/test0000000001" ,- 1 );三 、远程登录项目 实战案例介绍:使用 Zookeeper 与 RMI 技术实现一个 RPC 框架。 1 基于 RMI 实现远程方法调用 1.1RMI 简 介 : 让java的刻意跨主机,跨内存,牛啤 RMI(Remote Method Invocation) 远程方法调用。 RMI 是从 JDK1.2 推出的功能,它可以实现在一个 Java 应用中可以像调用本地方法一样 调用另一个服务器中 Java 应用(JVM)中的内容。 1.2 执行流程 有一个注册表,放置所有服务器对象的命名空间,每次服务端创建一个对象时,它 都会使用 bind() 或 rebind() 方法注册该对象。 这些是使用称为绑定名称的唯一名称注册的。 要调用远程对象,客户端需要该对象的引用。即通过服务端绑定的名称从注册表中获取 对象 (lookup() 方法 ) 1.3 RMI接口介绍: Remote 接口 :表示可以被远程调用的接口(没什么需要实现的,就是一个标志) RemoteException 类: 每一个实现Remote的方法需要抛出的异常类 UnicastRemoteObject 类:实现方法需要继承的类,并且会自动生成构造方法,需要吧protect改为public LocateRegistry 类: 需要在本机上创建一个Registry,创建的时候需要给出一个被访问的端口 Naming 类: Naming 定义了发布内容可访问 RMI 名称。也是通过 Naming 获取到指定的远程方法, 1.3 创建开始,创建server 首先构建一个接口继承Remote,在接口中创建方法 构建接口实现类,先继承UnicasRemoteObject,然后实现接口 使用继承生成无参构造类。将 protect改为public,然后实现接口方法,在返回的时候抛出异常RemoteException 创建 server层中DemoServer,在其中编写主类 实例化接口,通过LocalRigest中静态方法create创建注册表传入端口参数 使用Numing.bing绑定实例化的接口,第一参数为name需要唯一,一般格式为
Naming.bind("rmi://localhost:8888/xxxxx",xxxxx);
1.4 创建client
复制其 要链接servfer的抽象类,这个是后面获取完的信息是Object为了让系统设别他本来是什么类有什么方法,所使用的
创建server层,通过Naming.lockup(),参数为注册表中的标识,获取数据,然后转为抽象接口对象
public class ClientServer {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
DemoService demoService = (DemoService) Naming.lookup("rmi://localhost:8810/demoService");
String reslut = demoService.test1("aaa");
System.out.println(reslut);
}
}
1.5 通过Zookeeper实现注册中心:(这样就可以动态方法标识字段)
前面的没有变化
在server中需要创建zookeeper对象,然后创建节点,以存放url标识,
ZooKeeper zooKeeper = new ZooKeeper("192.168.8.129:2181",150000,new zk_Server());
zooKeeper.create("/bjsxt/zk_Server",url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("服务发布成功");
客户端区别也不大:
首先创建zookeeper对象,通过getdata拿取路径下url值,转换为字符串,
然后在通过Naming去拿取数据
完结撒花!!!!
补充两个bug:
org.apache.zookeeper.KeeperException$InvalidACLException: KeeperErrorCode = InvalidACL for
这类情况就是你的Znode要么是创建问题,要么是存值出现了问题:
首先检查防火墙关了没,然后看自己自己java的create中的参数值都对不
xception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
这个也是,自己自己java的create中的参数值都对不,尤其是权限,看清是ZooDefs.Ids.CREATOR_ALL_ACL 还是 ZooDefs.Ids.OPEN_ACL_UNSAFE



