zookeeper实战与源码分析----ZooKeeper中ACL权限认证使用

初衷:本人做的这个一系列总结的初衷就是为那些ZooKeeper的入门者以及想在工作之余提高自己能力的有志之士节省去查资料的时间,帮助大家提高自学的能力,迅速的掌握Zookeeper,以至于在这个饱和的行业中提高自己技术方面的竞争力。现在市场上有很多买卖的架构方面的学习资料,少则几百,多则上千上万,视频水的不行,而且大部分人还是一时脑热,钱花了,视频不看。笔者是过来人,所以我特别希望、建议你们静下心来,去自学一门技术,然后将你的总结分享出来,互相学习,互相进步。

一言不合,就上代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;

/**
 * ZooKeeper
 * ACL权限认证
 * @author soong
 *
 */
public class MyZookeeperAuth implements Watcher{

	static final String CONNECT_ADDR = "172.21.121.53:2181,172.21.121.54:2181,172.21.121.55:2181";//
	
	static final int SESSION_OUTTIME = 30000;
	
	static final String PARENT_PATH = "/p";
	
	static final String auth_scheme = "digest";//认证scheme:就是认证方式,ZooKeeper提供了2种ACL认证:IP和digest(文摘)
	
	static final String auth_correct_key = "soong:123";
	
	static final String auth_bad_key = "soong:321";
	
	private CountDownLatch _connectCheck = new CountDownLatch(1);
	
	private ZooKeeper _zk = null;
	
	@Override
	public void process(WatchedEvent event) {
		EventType type = event.getType();
		String path = event.getPath();
		KeeperState state = event.getState();
		
		System.out.println("【Watcher】-收到通知:"+	event);
		System.out.println("【Watcher】-事件类型:"+	type);
		System.out.println("【Watcher】-连接状态:"+	state);
		System.out.println("【Watcher】-操作节点:"+	path);
		if(Event.KeeperState.SyncConnected == state){
			
			if(Event.EventType.None == type){
				System.out.println("【Watcher】-" + "Zookeeper连接成功");
				this._connectCheck.countDown();
			}		
		}
		
	}
	
	public void start(){
		this.colse();
		try {
			ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, this);
			this._connectCheck.await();
			this._zk = zk;
			this._zk.addAuthInfo(auth_scheme, auth_correct_key.getBytes());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void colse(){
		if(this._zk!=null){
			try {
				this._zk.close();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	
	public void init(){
		List<ACL> acls = new ArrayList<ACL>(1);
		acls.add(Ids.CREATOR_ALL_ACL.get(0));
		try {
			this._zk.create("/workers", "init data".getBytes(), acls, CreateMode.PERSISTENT);
		} catch (KeeperException | InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 无认证读取
	 * @param path
	 */
	static void readDateNoAuth(String path){
		String prefix = "【无权限读取数据:】-";
		try {
			ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, null);
			byte[] bz= zk.getData(path, false, null);
			System.out.println(prefix + new String(bz));
		} catch (Exception e) {
			System.err.println(prefix+"抛出异常:"+e.getMessage());
			
		}
	}
	
	/**
	 * 错误信息读取
	 * @param path
	 */
	static void readDateBadAuth(String path){
		String prefix = "【错误认证信息读取数据:】-";
		try {
			ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, null);
			zk.addAuthInfo(auth_scheme, auth_bad_key.getBytes());
			byte[] bz= zk.getData(path, false, null);
			System.out.println(prefix + new String(bz));
		} catch (Exception e) {
			System.err.println(prefix+"抛出异常:"+e.getMessage());
			
		}
	}
	
	/**
	 * 正确信息读取
	 * @param path
	 */
	static void readDateCorrectAuth(String path){
		String prefix = "【正确认证信息读取数据:】-";
		try {
			ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, null);
			zk.addAuthInfo(auth_scheme, auth_correct_key.getBytes());
			byte[] bz= zk.getData(path, false, null);
			System.out.println(prefix + new String(bz));
		} catch (Exception e) {
			System.err.println(prefix+"抛出异常:"+e.getMessage());
			
		}
		
	}
	
	
	public static void main(String[] args) throws InterruptedException{
		MyZookeeperAuth zk = new MyZookeeperAuth();
		zk.start();
		zk.init();
		Thread.sleep(5000);
		readDateNoAuth("/workers");
		Thread.sleep(5000);
		readDateBadAuth("/workers");
		Thread.sleep(5000);
		readDateCorrectAuth("/workers");
		Thread.sleep(120000);
		zk.colse();
	}
}

输出如下:

【Watcher】-收到通知:WatchedEvent state:SyncConnected type:None path:null
【Watcher】-事件类型:None
【Watcher】-连接状态:SyncConnected
【Watcher】-操作节点:null
【Watcher】-Zookeeper连接成功
org.apache.zookeeper.KeeperException$NodeExistsException: KeeperErrorCode = NodeExists for /workers
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:119)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
	at org.apache.zookeeper.ZooKeeper.create(ZooKeeper.java:783)
	at bhz.zookeeper.auth.MyZookeeperAuth.init(MyZookeeperAuth.java:88)
	at bhz.zookeeper.auth.MyZookeeperAuth.main(MyZookeeperAuth.java:149)
【无权限读取数据:】-抛出异常:KeeperErrorCode = NoAuth for /workers
【错误认证信息读取数据:】-抛出异常:KeeperErrorCode = NoAuth for /workers
【正确认证信息读取数据:】-init data

因为之前我创建了/workers节点,所以再次创建时候报错:节点已存在;在创建节点时,我没有做存在处理,上一篇代码中有做处理,这里葛优躺犯了,就没写;

仅供参考;


猜你喜欢

转载自blog.csdn.net/soongp/article/details/64921689