日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZooKeeper編程01--RMI服務的多服務器管理

發布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZooKeeper編程01--RMI服務的多服務器管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


服務器端與客戶端都要用到:

public interface ZkInfo {String ZK_CONNECTION_STRING = "192.168.1.201:2181,192.168.1.202:2181,192.168.1.203:2181";int ZK_SESSION_TIMEOUT = 5000;String ZK_REGISTRY_PATH = "/registry";String ZK_PROVIDER_PATH = ZK_REGISTRY_PATH + "/provider"; } import java.rmi.Remote; import java.rmi.RemoteException;public interface MyService extends Remote {String showInfo(String name) throws RemoteException; }


服務器端

import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.Calendar;public class MyServiceImpl extends UnicastRemoteObject implements MyService{/*** */private static final long serialVersionUID = 8329425460319055273L;protected MyServiceImpl() throws RemoteException {}public String showInfo(String name) throws RemoteException {String h = "";try {InetAddress host = Inet4Address.getLocalHost();h = host.getHostAddress();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}Calendar c = Calendar.getInstance();return h + " " + c.getTime().toString() + name;}}

import java.io.IOException; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; 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.ZooDefs; import org.apache.zookeeper.ZooKeeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class ServiceProvider {private static final Logger LOGGER = LoggerFactory.getLogger(ServiceProvider.class);//用於等待SyncConnected事件觸發後繼續執行當前進程private CountDownLatch latch = new CountDownLatch(1);//發佈RMI服務並註冊RMI地址到ZooKeeper中public void publish(Remote remote, String host, int port){String url = publishService(remote, host, port);//發佈RMI服務並返回RMI地址if (url != null){ZooKeeper zk = connectServer();//連接ZooKeeper服務器並獲取ZooKeeper對象if (zk != null){createNode(zk, url); //創建ZNode並將RMI地址放入ZNode上}}}//發佈RMI服務private String publishService(Remote remote, String host, int port){String url = null;try{url = String.format("rmi://%s:%d/%s", host, port, remote.getClass().getName());LocateRegistry.createRegistry(port);Naming.rebind(url, remote);LOGGER.debug("publish rmi service(url: {})", url);} catch(RemoteException | MalformedURLException e) {LOGGER.error("", e);}return url;}//連接ZooKeeper服務器private ZooKeeper connectServer(){ZooKeeper zk = null;try{zk = new ZooKeeper(ZkInfo.ZK_CONNECTION_STRING, ZkInfo.ZK_SESSION_TIMEOUT, new Watcher(){@Overridepublic void process(WatchedEvent event){if (event.getState() == Event.KeeperState.SyncConnected){latch.countDown();//喚醒當前正在執行的線程}}});if (zk.exists(ZkInfo.ZK_REGISTRY_PATH, false) == null)zk.create(ZkInfo.ZK_REGISTRY_PATH, " ".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);latch.await(); //使當前進程處於等待狀態} catch (IOException | InterruptedException | KeeperException e){LOGGER.error("", e);}return zk;}//創建ZNodeprivate void createNode(ZooKeeper zk, String url){try{byte[] data = url.getBytes();//創建一個臨時性且有序的ZNodeString path = zk.create(ZkInfo.ZK_PROVIDER_PATH, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);LOGGER.debug("create zookeeper node ({} => {})", path, url);} catch (KeeperException | InterruptedException e){LOGGER.error("", e);}} }

//ZooKeeper版本 public class Server {public static void main(String[] args) throws Exception{if (args.length != 2){System.err.println("please using command: java Server <rmi_host> <rmi_port>");System.exit(-1);}String host = args[0];int port = Integer.parseInt(args[1]);ServiceProvider provider = new ServiceProvider();MyServiceImpl myService = new MyServiceImpl();provider.publish(myService, host, port);Thread.sleep(Long.MAX_VALUE);} }
import java.rmi.Naming; import java.rmi.registry.LocateRegistry;//無ZooKeeper版本 public class RmiServer {public static void main(String[] args) throws Exception{int port = 1099;String url = "rmi://localhost:1099/MyServiceImpl";LocateRegistry.createRegistry(port);Naming.rebind(url, new MyServiceImpl());} }
客戶端

import java.io.IOException; import java.net.MalformedURLException; import java.rmi.ConnectException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom;import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class ServiceConsumer {private static final Logger LOGGER = LoggerFactory.getLogger(ServiceConsumer.class);//用於等待SyncConnected事件觸發後繼續執行當前進程private CountDownLatch latch = new CountDownLatch(1);// 定義一個 volatile 成員變量,用于保存最新的 RMI 地址(考慮到該變量或許會被其它線程所修改,一旦修改后,該變量的值會影響到所有線程)// volatile讓變量每次在使用的時候,都從主存中取。而不是從各個線程的“工作內存”。// volatile具有synchronized關鍵字的“可見性”,但是沒有synchronized關鍵字的“并發正確性”,也就是說不保證線程執行的有序性。// 也就是說,volatile變量對于每次使用,線程都能得到當前volatile變量的最新值。但是volatile變量并不保證并發的正確性。private volatile List<String> urlList = new ArrayList<>();//連接ZooKeeper服務器private ZooKeeper connectServer(){ZooKeeper zk = null;try {zk = new ZooKeeper(ZkInfo.ZK_CONNECTION_STRING, ZkInfo.ZK_SESSION_TIMEOUT, new Watcher(){@Overridepublic void process(WatchedEvent event){if (event.getState() == Event.KeeperState.SyncConnected){latch.countDown();//喚醒當前正在執行的線程}}});latch.await();//使當前線程處於等待狀態} catch (IOException | InterruptedException e){LOGGER.error("", e);}return zk;}//觀察/registry節點下所有子節點是否有變化private void watchNode(final ZooKeeper zk){try{List<String> nodeList = zk.getChildren(ZkInfo.ZK_REGISTRY_PATH, new Watcher(){@Overridepublic void process(WatchedEvent event){if (event.getType() == Event.EventType.NodeChildrenChanged){watchNode(zk);//若子節點有變化,則重新調用該方法(爲了獲取最新子節點中的數據)}}});List<String> dataList = new ArrayList<>();//用於存放/registry所有子節點中的 數據for (String node : nodeList){byte[] data = zk.getData(ZkInfo.ZK_REGISTRY_PATH + "/" + node, false, null); //獲取/registry的子節點中的數據dataList.add(new String(data));}LOGGER.debug("node data: {}", dataList);urlList = dataList; // 更新最新的 RMI 地址} catch (KeeperException | InterruptedException e){LOGGER.error("", e);}}//構造器public ServiceConsumer(){ZooKeeper zk = connectServer();//連接ZooKeeper服務器並獲取ZooKeeper對象if (zk != null){watchNode(zk);//觀察/registry節點的所有子節點並更新urlList成員變量}}//在JNDI中查找RMI遠程服務對象@SuppressWarnings("unchecked")private <T> T lookupService(String url){T remote = null;try{remote = (T) Naming.lookup(url);} catch (NotBoundException | MalformedURLException | RemoteException e){if ( e instanceof ConnectException){//若連接中斷,則使用urlList中第一個RMI地址來查找(這是一種簡單的重試方式,確保不會拋出異常)LOGGER.error("ConnectException -> url: {}", url);if (urlList.size() != 0){url = urlList.get(0);return lookupService(url);}}LOGGER.error("", e);}return remote;}//查找RMI服務public <T extends Remote> T lookup(){T service = null;int size = urlList.size();if (size > 0){String url;if (size == 1){url = urlList.get(0); //若urlList中只有一個元素,則直接獲取該元素LOGGER.debug("using only url: {}", url);} else {url = urlList.get(ThreadLocalRandom.current().nextInt(size));//若urlList中存在多個元素,則隨機獲取一個元素LOGGER.debug("using random url: {}", url);System.out.println(url);}service = lookupService(url);}return service;} }
//含ZooKeeper版本 public class Client {public static void main(String[] args) throws Exception{ServiceConsumer consumer = new ServiceConsumer();//zookeeper測試while (true){MyService myService = consumer.lookup();String result = myService.showInfo("test");System.out.println(result);Thread.sleep(3000);}} }
import java.rmi.Naming;//無ZooKeeper版本 public class RmiClient {public static void main(String[] args) throws Exception{String url = "rmi://localhost:1099/MyServiceImpl";MyService myService = (MyService)Naming.lookup(url);String result = myService.showInfo("jinzhao");System.out.println(result);} }

log4j.properties

# Define some default values that can be overridden by system properties zookeeper.root.logger=INFO, CONSOLE zookeeper.console.threshold=INFO zookeeper.log.dir=. zookeeper.log.file=zookeeper.log zookeeper.log.threshold=DEBUG zookeeper.tracelog.dir=. zookeeper.tracelog.file=zookeeper_trace.log# # ZooKeeper Logging Configuration ## Format is "<default threshold> (, <appender>)+# DEFAULT: console appender only log4j.rootLogger=${zookeeper.root.logger}# Example with rolling log file #log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE# Example with rolling log file and tracing #log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE# # Log INFO level and above messages to the console # log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold} log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n# # Add ROLLINGFILE to rootLogger to get log file output # Log DEBUG level and above messages to a log file log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold} log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}# Max log file size of 10MB log4j.appender.ROLLINGFILE.MaxFileSize=10MB # uncomment the next line to limit number of backup files #log4j.appender.ROLLINGFILE.MaxBackupIndex=10log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n# # Add TRACEFILE to rootLogger to get log file output # Log DEBUG level and above messages to a log file log4j.appender.TRACEFILE=org.apache.log4j.FileAppender log4j.appender.TRACEFILE.Threshold=TRACE log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout ### Notice we are including log4j's NDC here (%x) log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的ZooKeeper編程01--RMI服務的多服務器管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 97国产| 国产乱淫av一区二区三区 | 国产伦精品一区二区三区视频痴汉 | 久久精品夜| 国产欧美一区二区三区鸳鸯浴 | 日本国产在线观看 | 大尺度做爰无遮挡露器官 | 熟女少妇一区二区三区 | 亚洲涩色| 国产日韩片 | 国产资源在线视频 | 国产jk精品白丝av在线观看 | 国产成人二区 | 国产卡一卡二卡三无线乱码新区 | youjizz自拍| 女性裸体视频网站 | 91精品综合久久久久久 | 一区二区国产精品 | 麻豆网站在线免费观看 | 天堂在线国产 | 天天碰免费视频 | 青春草国产视频 | a天堂中文在线观看 | 东方成人av在线 | 伊在线久久丫 | 久久av一区二区 | 精品人妻无码一区 | 欧美大片在线免费观看 | 日韩色图在线观看 | 97日日夜夜| 日韩在线视频看看 | av女人的天堂 | 长篇高h乱肉辣文 | 亚洲久草视频 | 中国a一片一级一片 | 婷婷导航 | 91国偷自产一区二区三区女王 | 亚洲欧美日韩国产成人精品影院 | 国偷自产av一区二区三区麻豆 | 99精品福利视频 | 在线看黄色的网站 | 色欲久久久天天天综合网精品 | 四虎精品欧美一区二区免费 | 秋霞影院午夜伦 | 九九热在线视频 | 网站色 | 老牛影视少妇在线观看 | 亚洲精品视频在线免费 | 欧美黄色免费大片 | 亚洲天堂免费av | 久久99久久99精品中文字幕 | 制服丝袜在线播放 | 日韩美女激情视频 | 中文字幕精品久久 | 国产高潮又爽又无遮挡又免费 | 亚洲一区免费在线 | 国产精品观看 | 男性影院 | 午夜国产| 情趣五月天 | 夜色视频网站 | 在线免费看污片 | 国产污污在线观看 | 天天久久综合网 | 9999精品 | 亚洲成人免费视频 | 欧美日本综合 | 看av网址 | av合集 | 超碰超碰超碰超碰超碰 | 91香蕉视频官网 | 免费看成人啪啪 | 色鬼综合| 欧美精品系列 | 日韩性大片| 日韩一区中文 | 久久h视频 | 两个小y头稚嫩紧窄h文 | 91色影院| 国产女人视频 | 色臀av | av在线资源网站 | 国产成人精品视频 | 国产欧美中文字幕 | 成人区人妻精品一区二 | 爱爱综合 | 日韩欧美国产网站 | 天堂…中文在线最新版在线 | 少妇被按摩师摸高潮了 | 成人在线观看免费视频 | 欧美久久一级 | 国产福利免费在线观看 | 欧美丰满老妇性猛交 | 强行无套内谢大学生初次 | 一级黄色片看看 | 中文字幕乱码中文乱码777 | 亚洲国产tv | 国产精品怡红院 | 中出白浆|