Ejemplo de uso del curador del cliente de Zookeeper

1. Introducción a Curator

Apache Curator es un marco de cliente de ZooKeeper relativamente completo que simplifica el funcionamiento de ZooKeeper a través de un conjunto de API encapsuladas de alto nivel. Al verificar los documentos oficiales, podemos encontrar que Curator resuelve principalmente tres tipos de problemas:

1. Encapsular el procesamiento de conexión entre el cliente de ZooKeeper y el servidor de ZooKeeper
2. Proporcionar un conjunto de API de operación de estilo Fluent
3. Proporcionar varios escenarios de aplicación de ZooKeeper (receta, como: servicio de bloqueo distribuido, elección de líder de clúster, contador compartido, mecanismo de caché, cola distribuida, etc.) encapsulación abstracta

El curador reduce principalmente la complejidad del uso de zk de los siguientes aspectos:
Mecanismo de reintento : proporciona un mecanismo de reintento conectable, configurará una estrategia de reintento para capturar todas las excepciones recuperables y también proporciona varias
conexiones internas de estrategia de reintento estándar (como compensación exponencial) Monitoreo del estado : El curador siempre monitoreará la conexión zk después de la inicialización. Una vez que el estado de la conexión cambie, lo tratará en consecuencia.
Administración de la instancia del cliente zk : El curador enviará el cliente zk a La conexión del clúster de servidores está administrada, y el zk La instancia se reconstruye cuando es necesario para garantizar la confiabilidad
de la conexión al clúster de zk.Admite varios escenarios de uso : Curator implementa la mayoría de los escenarios de uso admitidos por zk (incluso los escenarios no admitidos por zk en sí), estas implementaciones siguen las mejores prácticas de zk, y considere varios casos extremos

2. En el proyecto, el archivo .pom introduce la dependencia del curador.

<dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.0.0</version>
</dependency>
<dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>4.0.0</version>
</dependency>

3. Utilice el cliente Curator para conectarse a zookeeper para realizar la creación, modificación y eliminación de nodos zk

public static void main(String[] args) throws Exception {
    
    
		CuratorFramework cf = CuratorFrameworkFactory.builder()
				.connectString("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183")//zk服务器地址
				.sessionTimeoutMs(4000)// 超市时间
				.retryPolicy(new ExponentialBackoffRetry(1000, 3))// 重试策略:初试时间为1s 重试10次
				.namespace("curator-demo")//命名空间
				.build();
		
		cf.start();
		
		System.out.println(States.CONNECTED);
		System.out.println(cf.getState());
		 
         //创建持久化节点
         cf.create().forPath("/che","123".getBytes());
         
         //创建持久化有序节点
         cf.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/che_seq","che_seq data".getBytes());
         
         //创建临时节点
         cf.create().withMode(CreateMode.EPHEMERAL)
             .forPath("/che/tmp1","tmp1data01".getBytes());
  
         //创建临时有序节点
         cf.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath("/che/tmp2","tmp2data".getBytes());
         
         cf.create().withProtection().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/che/tmp3","tmp3data".getBytes());
         
         //测试检查某个节点是否存在
         Stat stat1 = cf.checkExists().forPath("/che");
         Stat stat2 = cf.checkExists().forPath("/che3");
         
         System.out.println("'/che'是否存在: " + (stat1 != null ? true : false));
         System.out.println("'/che3'是否存在: " + (stat2 != null ? true : false));
 
         //获取某个节点的所有子节点
         System.out.println(cf.getChildren().forPath("/"));
         
         //获取某个节点数据
         System.out.println(new String(cf.getData().forPath("/che")));
         
         //设置某个节点数据
         cf.setData().forPath("/che","new123".getBytes());
 
         //创建测试节点
         cf.create().orSetData().creatingParentContainersIfNeeded()
             .forPath("/che/che005","che005data".getBytes());
  
         cf.create().orSetData().creatingParentContainersIfNeeded()
         .forPath("/che/che006","che006data".getBytes());
         
         cf.create().forPath("/che/che007/che007001","che007001data".getBytes());
               
         //删除该节点
         cf.delete().forPath("/che/che005");
         
         //级联删除子节点
      cf.delete().guaranteed().deletingChildrenIfNeeded().forPath("/che/che007");
		
	}

Método orSetData () : si el nodo existe, Curator usará los datos proporcionados para establecer el valor del nodo, que es equivalente al método setData () createParentContainersIfNeeded
() método : Si el nodo padre del nodo especificado no existe, Curator automáticamente creará un
método en cascada para crear un nodo principal Guaranteed () : Si el servidor puede ser eliminado exitosamente, pero el cliente no recibe un mensaje de eliminación exitoso, Curator continuará intentando eliminar el nodo en segundo plano.
Método deletingChildrenIfNeeded () : Si el nodo que se eliminará tiene nodos secundarios, el curador eliminará en cascada los nodos secundarios de este nodo

4. Ejemplos de eventos de Watcher en el cliente Curator

public class CuratorWatcherDemo {
    
    
	
	public static void main(String[] args) throws Exception {
    
    
		CuratorFramework cf = CuratorFrameworkFactory.builder()
				.connectString("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183")//zk服务器地址
				.sessionTimeoutMs(4000)// 超市时间
				.retryPolicy(new ExponentialBackoffRetry(1000, 3))// 重试策略:初试时间为1s 重试10次
				.namespace("curator-demo")//命名空间
				.build();
		
		cf.start();
		
		System.out.println(States.CONNECTED);
		System.out.println(cf.getState());
		
		// PathChildCache 监听一个节点下子节点的创建、删除、修改事件
		addListenerWithNodeChildCache(cf, "/che-test01");
		
		// NodeCache 监听一个节点的修改和创建事件
		addListenerWithNodeCache(cf, "/che-test01");
		
		// TreeCache 监听所有节点的创建、删除、修改事件
		addListenerWithTreeCache(cf, "/che-test01");
		
		System.in.read();
	}
	
	/**
	 * PathChildCache 监听一个节点下子节点的创建、删除、修改事件
	 * @param cf
	 * @param path
	 * @throws Exception
	 */
	public static void addListenerWithNodeCache(CuratorFramework cf,String path) throws Exception {
    
    
		@SuppressWarnings("resource")
		final NodeCache nodeCache = new NodeCache(cf, path, false);
		NodeCacheListener cacheListener = new NodeCacheListener() {
    
    
			
			@Override
			public void nodeChanged() throws Exception {
    
    
				System.out.println("监听到节点事件:" + " - " + nodeCache.getCurrentData().getPath());
			}
		};
		nodeCache.getListenable().addListener(cacheListener);
		nodeCache.start();
	}
	
	/**
	 * NodeCache 监听一个节点的修改和创建事件
	 * @param cf
	 * @param path
	 * @throws Exception
	 */
	public static void addListenerWithNodeChildCache(CuratorFramework cf,String path) throws Exception {
    
    
		@SuppressWarnings("resource")
		final PathChildrenCache pathChildrenCache = new PathChildrenCache(cf, path, true);
		PathChildrenCacheListener cacheListener = new PathChildrenCacheListener() {
    
    
			@Override
			public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
    
    
				System.out.println("监听到子节点事件:" + event.getType());
			}
		};
		pathChildrenCache.getListenable().addListener(cacheListener);
		pathChildrenCache.start(PathChildrenCache.StartMode.NORMAL);
	}
	
	/**
	 * TreeCache 监听所有节点的创建、删除、修改事件
	 * @param cf
	 * @param path
	 * @throws Exception
	 */
	public static void addListenerWithTreeCache(CuratorFramework cf,String path) throws Exception {
    
    
		@SuppressWarnings("resource")
		final TreeCache treeCache = new TreeCache(cf, path);
	    TreeCacheListener cacheListener = new TreeCacheListener() {
    
    
			@Override
			public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
    
    
				System.out.println("监听到节点事件:" + event.getType() + " - " + event.getData().getPath());
			}
		};
		treeCache.getListenable().addListener(cacheListener);
		treeCache.start();
	}
      
}

Supongo que te gusta

Origin blog.csdn.net/ytangdigl/article/details/108593958
Recomendado
Clasificación