Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ZookeeperµäÐÍÓ¦Óó¡¾°½éÉÜ
 
×÷Õß±ÊÃû£º ÓÀÔ¶_²»»á¶®
  1949  次浏览      28
 2020-6-16
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Ҫͨ¹ý¼¸¸öÀý×ÓÀ´¾ßÌåµÄ˵Ã÷ZookeeperÔÚÌØ¶¨³¡¾°ÏµÄʹÓ÷½Ê½ ,Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
À´×ÔÓÚCSDN,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

1.ǰÑÔ

֮ǰ×Ô¼ºÐ´ÁËһЩ¹ØÓÚZookeeperµÄ»ù´¡ÖªÊ¶£¬Zookeeper×÷ΪһÖÖЭµ÷·Ö²¼Ê½Ó¦ÓøßÐÔÄܵĵ÷¶È·þÎñ£¬Êµ¼ÊµÄÓ¦Óó¡¾°Ò²·Ç³£µÄ¹ã·º£¬ÕâÀïÖ÷Ҫͨ¹ý¼¸¸öÀý×ÓÀ´¾ßÌåµÄ˵Ã÷ZookeeperÔÚÌØ¶¨³¡¾°ÏµÄʹÓ÷½Ê½£¨ÏÂÃæµÄÕâЩ¹¦ÄܹÀ¼ÆconsulºÍetcdÒ²ÄÜʵÏÖ£¬ÒÔºóѧµ½ÁËÔÙ˵°É£©¡£

2.¾ßÌåÓ¦ÓÃ

2.1.Ò»ÖÂÐÔÅäÖùÜÀí

ÎÒÃÇÔÚ¿ª·¢µÄʱºò£¬ÓÐʱºòÐèÒª»ñȡһЩ¹«¹²µÄÅäÖ㬱ÈÈçÊý¾Ý¿âÁ¬½ÓÐÅÏ¢µÈ£¬²¢ÇÒżȻ¿ÉÄÜÐèÒª¸üÐÂÅäÖá£Èç¹ûÎÒÃǵķþÎñÆ÷ÓÐN¶ą̀µÄ»°£¬ÄÇÐÞ¸ÄÆðÀ´»áÌØ±ðµÄÂé·³£¬²¢ÇÒ»¹ÐèÒªÖØÐÂÆô¶¯¡£ÕâÀïZookeeper¾Í¿ÉÒԺܷ½±ãµÄʵÏÖÀàËÆµÄ¹¦ÄÜ¡£

2.1.1.˼·

½«¹«¹²µÄÅäÖôæ·ÅÔÚZookeeperµÄ½ÚµãÖÐ

Ó¦ÓóÌÐò¿ÉÒÔÁ¬½Óµ½ZookeeperÖв¢¶ÔZookeeperÖÐÅäÖÃ½Úµã½øÐжÁÈ¡»òÕßÐ޸썶ÔÓÚд²Ù×÷¿ÉÒÔ½øÐÐȨÏÞÑéÖ¤ÉèÖã©£¬ÏÂÃæÊǾßÌåµÄÁ÷³Ìͼ£º

2.1.2.ÊÂÀý

Êý¾Ý¿âÅäÖÃÐÅÏ¢Ò»ÖÂÐÔµÄά»¤

ÅäÖÃÀࣺ


public class CommonConfig implements Serializable{
// Êý¾Ý¿âÁ¬½ÓÅäÖÃ
private String dbUrl;
private String username;
private String password;
private String driverClass;

public CommonConfig() {}

public CommonConfig(String dbUrl, String username, String password, String driverClass) {
super();
this.dbUrl = dbUrl;
this.username = username;
this.password = password;
this.driverClass = driverClass;
}

public String getDbUrl() {
return dbUrl;
}

public void setDbUrl(String dbUrl) {
this.dbUrl = dbUrl;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getDriverClass() {
return driverClass;
}

public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}

@Override
public String toString() {
return "CommonConfig:{dbUrl:" + this.dbUrl +
", username:" + this.username +
", password:" + this.password +
", driverClass:" + this.driverClass + "}";
}
}

ÅäÖùÜÀíÖÐÐÄ

1.»ñÈ¡±¾µØÅäÖÃÐÅÏ¢

2.ÐÞ¸ÄÅäÖ㬲¢Í¬²½

ͬ²½ÅäÖÃÐÅÏ¢µ½Zookeeper·þÎñÆ÷

public class ZkConfigMng {
private String nodePath = "/commConfig";
private CommonConfig commonConfig;
private ZkClient zkClient;

public CommonConfig initConfig(CommonConfig commonConfig) {
if(commonConfig == null) {
this.commonConfig = new CommonConfig("jdbc:mysql://127.0.0.1:3306/mydata?useUnicode=true&characterEncoding=utf-8",
"root", "root", "com.mysql.jdbc.Driver");
} else {
this.commonConfig = commonConfig;
}
return this.commonConfig;
}

/**
* ¸üÐÂÅäÖÃ
*
* @param commonConfig
* @return
*/
public CommonConfig update(CommonConfig commonConfig) {
if(commonConfig != null) {
this.commonConfig = commonConfig;
}
syncConfigToZookeeper();
return this.commonConfig;
}

public void syncConfigToZookeeper() {
if(zkClient == null) {
zkClient = new ZkClient("127.0.0.1:2181");
}
if(!zkClient.exists(nodePath)) {
zkClient.createPersistent(nodePath);
}
zkClient.writeData(nodePath, commonConfig);
}
}

ÒÔÉÏÊÇÌṩÕߣ¬ÏÂÃæÎÒÃÇÐèÒªÒ»¸ö¿Í»§¶Ë»ñÈ¡ÕâЩÅäÖÃ


public class ZkConfigClient implements Runnable {

private String nodePath = "/commConfig";

private CommonConfig commonConfig;

@Override
public void run() {
ZkClient zkClient = new ZkClient(new ZkConnection("127.0.0.1:2181", 5000));
while (!zkClient.exists(nodePath)) {
System.out.println("ÅäÖýڵ㲻´æÔÚ!");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// »ñÈ¡½Úµã
commonConfig = (CommonConfig)zkClient.readData(nodePath);
System.out.println(commonConfig.toString());
zkClient.subscribeDataChanges(nodePath, new IZkDataListener() {

@Override
public void handleDataDeleted(String dataPath) throws Exception {
if(dataPath.equals(nodePath)) {
System.out.println("½Úµã£º" + dataPath + "±»É¾³ýÁË£¡");
}
}

@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
if(dataPath.equals(nodePath)) {
System.out.println("½Úµã£º" + dataPath + ", Êý¾Ý£º" + data + " - ¸üÐÂ");
commonConfig = (CommonConfig) data;
}
}
});
}

}

ÏÂÃæÆô¶¯Mainº¯Êý

ÅäÖùÜÀí·þÎñÆô¶¯

public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ZookeeperApiDemoApplication.class, args);

ZkConfigMng zkConfigMng = new ZkConfigMng();
zkConfigMng.initConfig(null);
zkConfigMng.syncConfigToZookeeper();
TimeUnit.SECONDS.sleep(10);

// ÐÞ¸ÄÖµ
zkConfigMng.update(new CommonConfig("jdbc:mysql://192.168.1.122:3306/mydata?useUnicode=true&characterEncoding=utf-8",
"root", "wxh", "com.mysql.jdbc.Driver"));
}
}

¿Í»§¶ËÆô¶¯£º


public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ZookeeperApiDemoApplication.class, args);

ExecutorService executorService = Executors.newFixedThreadPool(3);
// Ä£Äâ¶à¸ö¿Í»§¶Ë»ñÈ¡ÅäÖÃ
executorService.submit(new ZkConfigClient());
executorService.submit(new ZkConfigClient());
executorService.submit(new ZkConfigClient());
}
}

2.2.·Ö²¼Ê½Ëø

ÔÚÎÒÃÇÈÕ³£µÄ¿ª·¢ÖУ¬Èç¹ûÊǵ¥¸ö½ø³ÌÖжԹ²Ïí×ÊÔ´µÄ·ÃÎÊ£¬ÎÒÃÇÖ»ÐèÒªÓÃsynchronized»òÕßlock¾ÍÄÜʵÏÖ»¥³â²Ù×÷¡£µ«ÊǶÔÓÚ¿ç½ø³Ì¡¢¿çÖ÷»ú¡¢¿çÍøÂçµÄ¹²Ïí×ÊÔ´ËÆºõ¾ÍÎÞÄÜΪÁ¦ÁË¡£

2.1.1.˼·

1.Ê×ÏÈzookeeperÖÐÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸ö/distributed_lock³Ö¾Ã»¯½Úµã

2.È»ºóÔÙÔÚ/distributed_lock½ÚµãÏ´´½¨×Ô¼ºµÄÁÙʱ˳Ðò½Úµã£¬±ÈÈ磺/distributed_lock/task_00000000008

3.»ñÈ¡ËùÓеÄ/distributed_lockϵÄËùÓÐ×ӽڵ㣬²¢ÅÅÐò

4.ÅжÁ×Ô¼º´´½¨µÄ½ÚµãÊÇ·ñ×îСֵ£¨µÚһ룩

5.Èç¹ûÊÇ£¬Ôò»ñÈ¡µÃµ½Ëø£¬Ö´ÐÐ×Ô¼ºµÄÒµÎñÂß¼­£¬×îºóɾ³ýÕâ¸öÁÙʱ½Úµã¡£

6.Èç¹û²»ÊÇ×îСֵ£¬ÔòÐèÒª¼àÌý×Ô¼º´´½¨½Úµãǰһλ½ÚµãµÄÊý¾Ý±ä»¯£¬²¢×èÈû¡£

7.µ±Ç°Ò»Î»½Úµã±»É¾³ýʱ£¬ÎÒÃÇÐèҪͨ¹ýµÝ¹éÀ´ÅжÏ×Ô¼º´´½¨µÄ½ÚµãÊÇ·ñÔÚÊÇ×îСµÄ£¬Èç¹ûÊÇÔòÖ´ÐÐ5£©£»Èç¹û²»ÊÇÔòÖ´ÐÐ6£©£¨¾ÍÊǵݹéÑ­»·µÄÅжϣ©

ÏÂÃæÊǾßÌåµÄÁ÷³Ìͼ£º

2.1.3.ÊÂÀý

public class DistributedLock {

// ³£ÁÁ
static class Constant {
private static final int SESSION_TIMEOUT = 10000;
private static final String CONNECTION_STRING = "127.0.0.1:2181";
private static final String LOCK_NODE = "/distributed_lock";
private static final String CHILDREN_NODE = "/task_";
}

private ZkClient zkClient;

public DistributedLock() {
// Á¬½Óµ½Zookeeper
zkClient = new ZkClient(new ZkConnection(Constant.CONNECTION_STRING));
if(!zkClient.exists(Constant.LOCK_NODE)) {
zkClient.create(Constant.LOCK_NODE, "·Ö²¼Ê½Ëø½Úµã", CreateMode.PERSISTENT);
}
}

public String getLock() {
try {
// 1¡£ÔÚZookeeperÖ¸¶¨½ÚµãÏ´´½¨ÁÙʱ˳Ðò½Úµã
String lockName = zkClient.createEphemeralSequential(Constant.LOCK_NODE + Constant.CHILDREN_NODE, "");
// ³¢ÊÔ»ñÈ¡Ëø
acquireLock(lockName);
return lockName;
} catch(Exception e) {
e.printStackTrace();
}

return null;
}

/**
* »ñÈ¡Ëø
* @throws InterruptedException
*/
public Boolean acquireLock(String lockName) throws InterruptedException {
// 2.»ñÈ¡lock½ÚµãϵÄËùÓÐ×Ó½Úµã
List<String> childrenList = zkClient.getChildren(Constant.LOCK_NODE);
// 3.¶Ô×Ó½Úµã½øÐÐÅÅÐò£¬»ñÈ¡×îСֵ
Collections.sort(childrenList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.parseInt(o1.split("_")[1]) - Integer.parseInt(o2.split("_")[1]);
}

});
// 4.Åжϵ±Ç°´´½¨µÄ½ÚµãÊÇ·ñÔÚµÚһλ
int lockPostion = childrenList.indexOf(lockName.split("/")[lockName.split("/").length - 1]);
if(lockPostion < 0) {
// ²»´æÔڸýڵã
throw new ZkNodeExistsException("²»´æÔڵĽڵ㣺" + lockName);
} else if (lockPostion == 0) {
// »ñÈ¡µ½Ëø
System.out.println("»ñÈ¡µ½Ëø£º" + lockName);
return true;
} else if (lockPostion > 0) {
// δ»ñÈ¡µ½Ëø£¬×èÈû
System.out.println("...... δ»ñÈ¡µ½Ëø£¬×èÈûµÈ´ý ¡£¡£¡£¡£¡£¡£");
// 5.Èç¹ûδ»ñÈ¡µÃµ½Ëø£¬¼àÌýµ±Ç°´´½¨µÄ½ÚµãǰһλµÄ½Úµã
final CountDownLatch latch = new CountDownLatch(1);
IZkDataListener listener = new IZkDataListener() {

@Override
public void handleDataDeleted(String dataPath) throws Exception {
// 6.ǰһ¸ö½Úµã±»É¾³ý,µ±²»±£Ö¤ÂÖµ½×Ô¼º
System.out.println("¡£¡£¡£¡£¡£¡£Ç°Ò»¸ö½Úµã±»É¾³ý ¡£¡£¡£¡£¡£¡£");
acquireLock(lockName);
latch.countDown();
}

@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
// ²»ÓÃÀí»á
}
};
try {
zkClient.subscribeDataChanges(Constant.LOCK_NODE + "/" + childrenList.get(lockPostion - 1), listener);
latch.await();
} finally {
zkClient.unsubscribeDataChanges(Constant.LOCK_NODE + "/" + childrenList.get(lockPostion - 1), listener);
}
}
return false;
}

/**
* ÊÍ·ÅËø£¨É¾³ý½Úµã£©
*
* @param lockName
*/
public void releaseLock(String lockName) {
zkClient.delete(lockName);
}

public void closeZkClient() {
zkClient.close();
}
}

@SpringBootApplication
public class ZookeeperDemoApplication {

public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ZookeeperDemoApplication.class, args);

DistributedLock lock = new DistributedLock();
String lockName = lock.getLock();
/**
* Ö´ÐÐÎÒÃǵÄÒµÎñÂß¼­
*/
if(lockName != null) {
lock.releaseLock(lockName);
}

lock.closeZkClient();
}
}

2.3.·Ö²¼Ê½¶ÓÁÐ

ÔÚÈÕ³£Ê¹ÓÃÖУ¬ÌرðÊÇÏñÉú²úÕßÏû·ÑÕßģʽÖУ¬¾­³£»áʹÓÃBlockingQueueÀ´³äµ±»º³åÇøµÄ½ÇÉ«¡£µ«ÊÇÔÚ·Ö²¼Ê½ÏµÍ³ÖÐÕâÖÖ·½Ê½¾Í²»ÄÜʹÓÃBlockingQueueÀ´ÊµÏÖÁË£¬µ«ÊÇZookeeper¿ÉÒÔʵÏÖ¡£

2.1.1.˼·

Ê×ÏÈÀûÓÃZookeeperÖÐÁÙʱ˳Ðò½ÚµãµÄÌØµã

µ±Éú²úÕß´´½¨½ÚµãÉú²úʱ£¬ÐèÒªÅжϸ¸½ÚµãÏÂÁÙʱ˳Ðò×Ó½ÚµãµÄ¸öÊý£¬Èç¹û´ïµ½ÁËÉÏÏÞ£¬Ôò×èÈûµÈ´ý£»Èç¹ûûÓдﵽ£¬¾Í´´½¨½Úµã¡£

µ±Ïû·ÑÕß»ñÈ¡½Úµãʱ£¬Èç¹û¸¸½ÚµãÖв»´æÔÚÁÙʱ˳Ðò×ӽڵ㣬Ôò×èÈûµÈ´ý£»Èç¹ûÓÐ×ӽڵ㣬Ôò»ñȡִÐÐ×Ô¼ºµÄÒµÎñ£¬Ö´ÐÐÍê±Ïºóɾ³ý¸Ã½Úµã¼´¿É¡£

»ñȡʱ»ñÈ¡×îСֵ£¬±£Ö¤FIFOÌØÐÔ¡£

2.1.2.ÊÂÀý

Õâ¸öÊÇÒ»¸öÏû·ÑÕß¶ÔÒ»¸öÉú²úÕߣ¬Èç¹ûÊǶà¸öÏû·ÑÕß¶Ô¶à¸öÉú²úÕߣ¬¶Ô´úÂëÐèÒªµ÷Õû¡£

public interface AppConstant {
static String ZK_CONNECT_STR = "127.0.0.1:2181";
static String NODE_PATH = "/mailbox";
static String CHILD_NODE_PATH = "/mail_";
static int MAILBOX_SIZE = 10;
}

public class MailConsumer implements Runnable, AppConstant{

private ZkClient zkClient;
private Lock lock;
private Condition condition;

public MailConsumer() {
lock = new ReentrantLock();
condition = lock.newCondition();
zkClient = new ZkClient(new ZkConnection(ZK_CONNECT_STR));
System.out.println("sucess connected to zookeeper server!");
// ²»´æÔھʹ´½¨mailbox½Úµã
if(!zkClient.exists(NODE_PATH)) {
zkClient.create(NODE_PATH, "this is mailbox", CreateMode.PERSISTENT);
}
}

@Override
public void run() {
IZkChildListener listener = new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println("Znode["+parentPath + "] size:" + currentChilds.size());
// »¹ÊÇÒªÅжÏÓÊÏäÊÇ·ñΪ¿Õ
if(currentChilds.size() > 0) {
// »½ÐѵȴýµÄÏß³Ì
try {
lock.lock();
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
};
// ¼àÊÓ×Ó½ÚµãµÄ¸Ä±ä£¬²»Ó÷ÅÓÃwhileÑ­»·ÖУ¬¼àÌýÒ»´Î¾ÍÐÐÁË£¬²»ÐèÒªÖØ¸´°ó¶¨
zkClient.subscribeChildChanges(NODE_PATH, listener);
try {
//Ñ­»·Ëæ»ú·¢ËÍÓʼþÄ£ÄâÕæÊÇÇé¿ö
while(true) {
// ÅжÏÊÇ·ñ¿ÉÒÔ·¢ËÍÓʼþ
checkMailReceive();
// ½ÓÊÜÓʼþ
List<String> mailList = zkClient.getChildren(NODE_PATH);
// Èç¹ûmailsize==0,ҲûÓйØÏµ£»¿ÉÒÔÖ±½ÓÑ­»·»ñÈ¡¾ÍÐÐÁË
if(mailList.size() > 0) {
Collections.sort(mailList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.parseInt(o1.split("_")[1]) - Integer.parseInt(o2.split("_")[1]);
}
});
// Ä£ÄâÓʼþ´¦Àí(0-1S)
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));
zkClient.delete(NODE_PATH + "/" + mailList.get(0));
System.out.println("mail has been received:" + NODE_PATH + "/" + mailList.get(0));
}
}
}catch (Exception e) {
e.printStackTrace();
} finally {
zkClient.unsubscribeChildChanges(NODE_PATH, listener);
}
}

private void checkMailReceive() {
try {
lock.lock();
// ÅжÏÓÊÏäÊÇΪ¿Õ
List<String> mailList = zkClient.getChildren(NODE_PATH);
System.out.println("mailbox size: " + mailList.size());
if(mailList.size() == 0) {
// ÓÊÏäΪ¿Õ£¬×èÈûÏû·ÑÕߣ¬Ö±µ½ÓÊÏäÓÐÓʼþ
System.out.println("mailbox is empty, please wait ¡£¡£¡£");
condition.await();
// checkMailReceive();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

public class MailProducer implements Runnable, AppConstant{

private ZkClient zkClient;
private Lock lock;
private Condition condition;

/**
* ³õʼ»¯×´Ì¬
*/
public MailProducer() {
lock = new ReentrantLock();
condition = lock.newCondition();
zkClient = new ZkClient(new ZkConnection(ZK_CONNECT_STR));
System.out.println("sucess connected to zookeeper server!");
// ²»´æÔھʹ´½¨mailbox½Úµã
if(!zkClient.exists(NODE_PATH)) {
zkClient.create(NODE_PATH, "this is mailbox", CreateMode.PERSISTENT);
}
}

@Override
public void run() {
IZkChildListener listener = new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println("Znode["+parentPath + "] size:" + currentChilds.size());
// »¹ÊÇÒªÅжÏÓÊÏäÊÇ·ñÒÑÂú
if(currentChilds.size() < MAILBOX_SIZE) {
// »½ÐѵȴýµÄÏß³Ì
try {
lock.lock();
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
};
// ¼àÊÓ×Ó½ÚµãµÄ¸Ä±ä£¬²»Ó÷ÅÓÃwhileÑ­»·ÖУ¬¼àÌýÒ»´Î¾ÍÐÐÁË£¬²»ÐèÒªÖØ¸´°ó¶¨
zkClient.subscribeChildChanges(NODE_PATH, listener);
try {
//Ñ­»·Ëæ»ú·¢ËÍÓʼþÄ£ÄâÕæÊÇÇé¿ö
while(true) {
// ÅжÏÊÇ·ñ¿ÉÒÔ·¢ËÍÓʼþ
checkMailSend();
// ·¢ËÍÓʼþ
String cretePath = zkClient.createEphemeralSequential(NODE_PATH + CHILD_NODE_PATH, "your mail");
System.out.println("your mail has been send:" + cretePath);
// Ä£ÄâËæ»ú¼ä¸ôµÄ·¢ËÍÓʼþ(0-10S)
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(1000));
}
}catch (Exception e) {
e.printStackTrace();
} finally {
zkClient.unsubscribeChildChanges(NODE_PATH, listener);
}
}

private void checkMailSend() {
try {
lock.lock();
// ÅжÏÓÊÏäÊÇ·ñÒÑÂú
List<String> mailList = zkClient.getChildren(NODE_PATH);
System.out.println("mailbox size: " + mailList.size());
if(mailList.size() >= MAILBOX_SIZE) {
// ÓÊÏäÒÑÂú£¬×èÈûÉú²úÕߣ¬Ö±µ½ÓÊÏäÓпռä
System.out.println("mailbox is full, please wait ¡£¡£¡£");
condition.await();
checkMailSend();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}

2.4.¾ùºâ¸ºÔØ

Ê×ÏÈÎÒÃÇÐèÒª¼òµ¥µÄÀí½â·Ö²¼Ê½ºÍ¼¯Èº£¬Í¨Ë×µã˵£º·Ö²¼Ê½¾ÍÊǽ«Ò»¸öϵͳ²ð·Öµ½¶à¸ö¶ÀÁ¢ÔËÐеÄÓ¦ÓÃÖУ¨ÓпÉÄÜÔÚͬһ̨Ö÷»úÒ²ÓпÉÄÜÔÚ²»Í¬µÄÖ÷»úÉÏ£©£¬¼¯Èº¾ÍÊǽ«µ¥¸ö¶ÀÁ¢µÄÓ¦Óø´Öƶà·Ö·ÅÔÚ²»Í¬µÄÖ÷»úÉÏÀ´¼õÇá·þÎñÆ÷µÄѹÁ¦¡£¶øZookeeper²»½ö½ö¿ÉÒÔ×÷Ϊ·Ö²¼Ê½¼¯ÈºµÄ·þÎñ×¢²áµ÷¶ÈÖÐÐÄ£¨ÀýÈçdubbo£©£¬Ò²¿ÉÒÔʵÏÖ¼¯ÈºµÄ¸ºÔؾùºâ¡£

2.4.1.˼·Ê×ÏÈÎÒÃÇÒªÀí½â£¬Èç¹ûÊÇÒ»¸ö¼¯Èº£¬ÄÇôËû¾Í»áÓжą̀Ö÷»ú¡£ËùÒÔ£¬ËûÔÚZookeeperÖÐÐÅÏ¢µÄ´æÔÚÓ¦¸ÃÊÇÈçÏÂËùʾ£º

ÈçÉϵĽṹ£¬µ±·þÎñµ÷Ó÷½µ÷Ó÷þÎñʱ£¬¾Í¿ÉÒÔ¸ù¾ÝÌØ¶¨µÄ¾ùºâ¸ºÔØËã·¨À´ÊµÏÖ¶Ô·þÎñµÄµ÷Ó㨵÷ÓÃǰÐèÒª¼àÌý/service/serviceXXX½Úµã£¬ÒÔ¸üÐÂÁбíÊý¾Ý£©

2.4.2.ÊÂÀý

/**
* ·þÎñÌṩÕß
*
* @author Administrator
*
*/
public class ServiceProvider {
// ¾²Ì¬³£Á¿
static String ZK_CONNECT_STR = "127.0.0.1:2181";
static String NODE_PATH = "/service";
static String SERIVCE_NAME = "/myService";

private ZkClient zkClient;

public ServiceProvider() {
zkClient = new ZkClient(new ZkConnection(ZK_CONNECT_STR));
System.out.println("sucess connected to zookeeper server!");
// ²»´æÔھʹ´½¨NODE_PATH½Úµã
if(!zkClient.exists(NODE_PATH)) {
zkClient.create(NODE_PATH, "this is mailbox", CreateMode.PERSISTENT);
}
}

public void registryService(String localIp, Object obj) {
if(!zkClient.exists(NODE_PATH + SERIVCE_NAME)) {
zkClient.create(NODE_PATH + SERIVCE_NAME, "provider services list", CreateMode.PERSISTENT);
}
// ¶Ô×Ô¼ºµÄ·þÎñ½øÐÐ×¢²á
zkClient.createEphemeral(NODE_PATH + SERIVCE_NAME + "/" + localIp, obj);
System.out.println("×¢²á³É¹¦£¡[" + localIp + "]");
}
}

/**
* Ïû·ÑÕߣ¬Í¨¹ýijÖÖ¾ùºâ¸ºÔØË㷨ѡÔñijһ¸öÌṩÕß
*
* @author Administrator
*
*/
public class ServiceConsumer {
// ¾²Ì¬³£Á¿
static String ZK_CONNECT_STR = "127.0.0.1:2181";
static String NODE_PATH = "/service";
static String SERIVCE_NAME = "/myService";

private List<String> serviceList = new ArrayList<String>();

private ZkClient zkClient;

public ServiceConsumer() {
zkClient = new ZkClient(new ZkConnection(ZK_CONNECT_STR));
System.out.println("sucess connected to zookeeper server!");
// ²»´æÔھʹ´½¨NODE_PATH½Úµã
if(!zkClient.exists(NODE_PATH)) {
zkClient.create(NODE_PATH, "this is mailbox", CreateMode.PERSISTENT);
}
}

/**
* ¶©ÔÄ·þÎñ
*/
public void subscribeSerivce() {
serviceList = zkClient.getChildren(NODE_PATH + SERIVCE_NAME);
zkClient.subscribeChildChanges(NODE_PATH + SERIVCE_NAME, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
serviceList = currentChilds;
}
});
}

/**
* Ä£Äâµ÷Ó÷þÎñ
*/
public void consume() {
//¸ºÔؾùºâËã·¨»ñȡij̨»úÆ÷µ÷Ó÷þÎñ
int index = new Random().nextInt(serviceList.size());
System.out.println("µ÷ÓÃ[" + NODE_PATH + SERIVCE_NAME + "]·þÎñ£º" + serviceList.get(index));
}
}

3.×ܽá

ZookeeperÊÇÒ»¸ö¹¦Äܷdz£Ç¿´óµÄÓ¦Ó㬳ýÁËÉÏÃæ¼¸ÖÖÓ¦ÓÃÍ⣬»¹ÓÐÃüÃû·þÎñ¡¢·Ö²¼Ê½Ð­µ÷֪ͨµÈÒ²Êdz£Óõij¡¾°¡£

 

   
1949 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-28[±±¾©]
OCSMPÈÏÖ¤£ºOCSMP-MBF 8-29[±±¾©]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 9-9[±±¾©]
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸Àýʵ¼ù 9-24[±±¾©]
ÐèÇó·ÖÎöʦÄÜÁ¦ÅàÑø 10-30[±±¾©]
MBSEÌåϵÓëʵ¼ù 8-26[±±¾©]
 
×îÐÂÎÄÕÂ
¼Ü¹¹Éè¼Æ-̸̸¼Ü¹¹
ʵÏÖSaaS£¨Èí¼þ¼°·þÎñ£©¼Ü¹¹Èý´ó¼¼ÊõÌôÕ½
µ½µ×ʲôÊÇÊý¾ÝÖÐ̨£¿
ÏìӦʽ¼Ü¹¹¼ò½é
ÒµÎñ¼Ü¹¹¡¢Ó¦Óüܹ¹ÓëÔÆ»ù´¡¼Ü¹¹
×îпγÌ
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
´Ó´óÐ͵çÉ̼ܹ¹Ñݽø¿´»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼Æ
´óÐÍ»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼ÆÊµ¼ù
ÆóÒµ¼Ü¹¹Ê¦ (TOGAF¹Ù·½ÈÏÖ¤)
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
³É¹¦°¸Àý
ijÐÂÄÜÔ´µçÁ¦ÆóÒµ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ÐÐÒµ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
±±¾© º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Èí¼þ²âÊԼܹ¹Ê¦
±±¾©Ä³ÁìÏÈÊý×ÖµØÍ¼ ¼Ü¹¹Ê¦£¨Éè¼Æ°¸Àý£©