zKclient:
代码:
代码:
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.CreateMode;
import java.util.concurrent.CountDownLatch;
public class zKclientTest {
private static final String CLUSTER = "192.168.244.130:2181,192.168.244.131:2181,192.168.244.132:2181";
private static final String PATH = "/fdy";
final static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) throws InterruptedException {
ZkClient zkClient = new ZkClient(CLUSTER);
// 指定序列化器
zkClient.setZkSerializer(new SerializableSerializer());
// 创建节点
CreateMode mode =CreateMode.PERSISTENT;
String data = "fdySon";
String nodeName = zkClient.create(PATH+"/fdySon1",data,mode);
System.out.println("创建节点成功"+nodeName);
Object readData = zkClient.readData(PATH);
System.out.println("获取节点成功"+readData);
zkClient.writeData(PATH,"new");
Object readDataNew = zkClient.readData(PATH);
System.out.println("获取节点成功"+readDataNew);
zkClient.delete(PATH);
boolean isExists = zkClient.exists(PATH);
System.out.println("节点存在"+isExists);
zkClient.subscribeDataChanges(PATH, new IZkDataListener() {
@Override
public void handleDataChange(String s, Object o) throws Exception {
System.out.println("节点"+s);
System.out.println("数据"+o);
latch.countDown();
}
@Override
public void handleDataDeleted(String s) throws Exception {
}
});
System.out.println(777);
zkClient.writeData(PATH,"new123");
System.out.println(888);
latch.await();
}
}
Curator:
创建临时节点要求父类节点必须要有的。不能创建已经存在的节点。
代码:
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import java.util.List;
public class zkFluentTest {
private static final String PATH = "/fdyFluent";
public static void main(String[] args) throws Exception {
new Person().setName("123").setSex("123");
// 创建会话
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.244.130:2181,192.168.244.131:2181,192.168.244.132:2181")
.sessionTimeoutMs(15000).connectionTimeoutMs(13000).retryPolicy(retryPolicy).namespace("logs")// 客户端 隔离的命名空间
.build();
client.start();
System.out.println(1);
String nodeName = client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(PATH+"/fdySon1/cbbb","flunt".getBytes());
System.out.println(2);
System.out.println("创建节点成功"+nodeName);
// 删除节点
client.delete().forPath(PATH);
client.delete().deletingChildrenIfNeeded().forPath(PATH);
// 获取数据 注册watcher。这个监听是监听PATH的
byte[] data = client.getData().usingWatcher((CuratorWatcher)event->{
System.out.println(event.getPath()+"内容变化");
}).forPath(PATH);
// 获取子节点列表
List<String> children = client.getChildren().forPath(PATH);
}
}
--------------
新的知识点:
zk的顺序节点。在某一个范围里面为服务起一个唯一的标识。
uuid是多少个字符?36个32个字符+4个-。
顺序节点。
订单编号和支付编号是业务相关的还是唯一的。
---
域名和指定的ip:端口绑定,通过域名访问主机。
注册中心和DNS的作用是一样的。
app1是一个应用程序,app2是另一个应用程序。每个应用程序有子节点就是域名,域名下有很多主机的ip:port列表。
修改域名就是新增一个节点。
状态收集器是定期的搜集服务提供者的状态,写入到status里面去。
---2019-02-27-1---
分布式同步:分布式不是集群。
都对同一个znode就行监听。
总体的架构是两个组件,元数据的组件,复制组件。复制组件去元数据组件读取元数据,然后把数据从主机复制到从机。
首先在zookeeper注册复制任务。
复制线程启动则复制任务开启。
创建子任务节点,是支付表还是订单表。
热备容灾方案。
多个主机都可以完成复制任务。
同一时间只有一个主机是running的,其他的都是standby的。最小的running,其他的sstandby。
这个是完成复制任务的机器节点,是临时节点,down机要watch的。
status主要是记录了哪个instance是down机了还有进度的(binlog)。
down机了,通过binlog记录消费进度,在status里面维护的。
如果down机马上切换状态。
instances的watcher机制。
status是如何写入的?watch监听主机临时节点的数量,down机器则给status更新。
pay_recode是表。
分布式拦栅:https://blog.csdn.net/weixin_34227447/article/details/91898959
https://www.cnblogs.com/qingfei1994/p/7670326.html
分布式拦栅的实现:
代码:
---
集群的主机都注册临时节点。有节点的变化就知道了。
---
---2019-02-27-2---
这是最全的。
zookeeper的分布式锁:
zk的锁,是临时的顺序节点。
读锁可以加多个的。
锁是在方法上加锁,加在对象上的,线程调用方法,如果加锁了,则在集合里面等待的,直到锁释放。
分布式队列:
---2019-02-27-2---