Dubbo再阿里内部的注册中心实现方案,并不是官方推荐的zk方式。而是采用数据库的方式实现了注册中心的功能。为什么阿里内部不用zookeeper作为服务发现呢?阿里中间件给出了答案:
http://jm.taobao.org/2018/06/13/做服务发现?/
原因大致如下:
- 注册中心,应该更加偏向于AP系统。注册中心不能因为自身的任何原因破环服务之间本身的可联通性。
- zk 不能做到当所有节点都挂了情况下,注册中心还依然能够提供服务列表的功能
- zk常用再大数据场景,分布式协调场景
但是针对开源项目而言,还是大家学习使用ZK作为服务发现的注册中心
Zookeeper 伪分布式集群搭建
环境配置
阿里云ecs Centos7
1. 下载对应的zk
下载好后,将程序上传至远程服务器
scp -r zookeeper-3.4.11.tar.gz root@远程服务器ip /root/zk
2. 将对应的tar.gz进行解压缩
tar -xvf zookeeper-3.4.11
3. 需要拷贝三份相同的zk程序
如下的目录结构:
其次 还需要创建zk程序中数据的存放目录,目录结构如下:/root/zzjmay/data/zkData/
注意:需要注意的是data下要创建myid的文件,里面存放的节点对应的数字 例如zk1 --> 1 zk2 --> 2 zk3 -->3
4. 设置zk的配置文件 zoo.cfg
# 通信心跳时间
tickTime=2000
# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
initLimit=10
# 集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数
syncLimit=5
# 该属性对应的目录是用来存放myid信息跟一些版本,日志,跟服务器唯一的ID信息等
dataDir=/root/zzjmay/data/zkData/zk1/data
dataLogDir=/root/zzjmay/data/zkData/zk1/log
# 客户端链接端口
clientPort=2181
# the maximum number of client connections.
#maxClientCnxns=60
#server.x = ip:A,B
##x 代表服务器编号,和myid下的编号对应
##ip 表示服务器地址
##A 端口 表示flower和leader服务器之间的通信端口
##B 端口 表示选举的监听端口
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
5. 配置好后就分别启动对应的zkServer.sh
#!/bin/bash
startZk(){
echo "进入zk的目录"
cd /root/zzjmay/zkwork/$1/bin
pwd
sh zkServer.sh start ../conf/zoo.cfg
}
echo "开始执行...1"
startZk zookeeper1
startZk zookeeper2
startZk zookeeper3
echo "结束执行...2"
这是用于批量启动zk的脚本文件哈哈
6. 设置阿里云的安全组策略
7. 使用java zkclient就可以进行连接
ZkClient zkClient = new ZkClient(CONNECT_ADDR,5000);
//2.创建永久节点,zkClient支持递归创建父节点,但是不能递归赋值
zkClient.createPersistent("/test/appName",true);
zkClient.createPersistent("/test/appVersion",true);
//3.赋值
zkClient.writeData("/test/appName","cpaytrade");
zkClient.writeData("/test/appVersion","1.0.0");
//4.获取节点信息
List<String> childrenList = zkClient.getChildren("/test");
for (String p:childrenList) {
System.out.println("当前节点p:"+p);
String rp = "/test/"+p;
String data = zkClient.readData(rp);
System.out.println("当前节点为:"+rp+",内容为:"+data);
}