-
三个类:
ServiceAProvider
ServiceBProvider
ServiceConsumer
其中
ServiceAProvider提供的服务名service-A,指向IP为192.168.58.130
ServiceBProvider提供的服务名service-A,指向IP为192.168.58.131
当有消费者请求时,随机地选取service-A列表的服务器提供服务
ServiceConsumer 为消费者类
依赖:
01.<dependency>02.<groupId>org.apache.zookeeper</groupId>03.<artifactId>zookeeper</artifactId>04.<version>3.4.5-cdh5.1.0</version>05.</dependency>06.<dependency>07.<groupId>org.apache.helix</groupId>08.<artifactId>helix-core</artifactId>09.<version>0.6.4</version>10.</dependency>
github源码下载地址:
https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/zookeeper
详见下面的代码:
服务提供者ServiceAProvider类的源码为:
01.packagecom.jamesfen.zookeeper;02.importjava.net.InetAddress;03.importorg.I0Itec.zkclient.ZkClient;04.publicclassServiceAProvider {05.06.privateString serviceName ="service-A";07.08.//向zookeeper注册服务09.publicvoidinit()throwsException{10.String serverList ="192.168.58.11:2181";11.String PATH ="/configcenter";//根节点路径12.ZkClient zkClient =newZkClient(serverList);13.booleanrootExists = zkClient.exists(PATH);14.if(!rootExists){15.zkClient.createPersistent(PATH);16.}17.//判断是否存在,不存在则创建服务节点18.booleanserviceExists = zkClient.exists(PATH +"/"+ serviceName);19.if(!serviceExists){20.zkClient.createPersistent(PATH +"/"+ serviceName);21.}22.23.//註冊當前服務24.InetAddress addr =InetAddress.getLocalHost();25.//String ip= addr.getHostAddress().toString();26.String ip ="192.168.58.130";27.28.//創建當前服務器節點29.zkClient.createEphemeral(PATH +"/"+ serviceName +"/"+ ip);30.31.System.out.println("提供的服务节点名称为:"+PATH +"/"+ serviceName +"/"+ ip);32.}33.//提供服务34.publicvoidprovide(){35.36.}37.publicstaticvoidmain(String[]args)throwsException {38.ServiceAProvider service =newServiceAProvider();39.service.init();40.41.Thread.sleep(1000*60*60*24);42.}43.44.}
服务提供者ServiceBProvider类源码为
01.packagecom.jamesfen.zookeeper;02.importjava.net.InetAddress;03.importorg.I0Itec.zkclient.ZkClient;04.publicclassServiceBProvider {05.//服务名仍然为 A,这样是为了,一个服务名有两个台机器在服务,才能做负载均衡.06.privateString serviceName ="service-A";07.08.//向zookeeper注册服务09.publicvoidinit()throwsException{10.String serverList ="192.168.58.11:2181";11.String PATH ="/configcenter";//根节点路径12.ZkClient zkClient =newZkClient(serverList);13.booleanrootExists = zkClient.exists(PATH);14.if(!rootExists){15.zkClient.createPersistent(PATH);16.}17.18.booleanserviceExists = zkClient.exists(PATH +"/"+ serviceName);19.if(!serviceExists){20.zkClient.createPersistent(PATH +"/"+ serviceName);//創建服務節點21.}22.23.//註冊當前服務24.InetAddress addr =InetAddress.getLocalHost();25.//String ip= addr.getHostAddress().toString();26.String ip ="192.168.58.131";27.28.//創建當前服務器節點29.zkClient.createEphemeral(PATH +"/"+ serviceName +"/"+ ip);30.31.System.out.println("提供的服务节点名称为:"+PATH +"/"+ serviceName +"/"+ ip);32.}33.//提供服务34.publicvoidprovide(){35.36.}37.publicstaticvoidmain(String[]args)throwsException {38.ServiceBProvider service =newServiceBProvider();39.service.init();40.41.Thread.sleep(1000*60*60*24);42.}43.44.}
消费者类源码为:01.packagecom.jamesfen.zookeeper;02.importjava.util.ArrayList;03.importjava.util.List;04.importjava.util.Random;05.importorg.I0Itec.zkclient.IZkChildListener;06.importorg.I0Itec.zkclient.ZkClient;07.publicclassServiceConsumer {08.09.privateList<String> serverList =newArrayList<String>();10.11.privateString serviceName ="service-A";12.13.//初始化服务地址信息14.publicvoidinit(){15.String zkServerList ="192.168.58.11:2181";16.String SERVICE_PATH="/configcenter/"+serviceName;//服务节点路径17.ZkClient zkClient =newZkClient(zkServerList);18.19.booleanserviceExists =zkClient.exists(SERVICE_PATH);20.if(serviceExists){21.serverList =zkClient.getChildren(SERVICE_PATH);22.}else{23.thrownewRuntimeException("service not exist!");24.}25.26.//注册事件监听27.zkClient.subscribeChildChanges(SERVICE_PATH,newIZkChildListener(){28.//@Override29.publicvoidhandleChildChange(String parentPath, List<String> currentChilds)throwsException{30.serverList = currentChilds;31.}32.});33.}34.35.36.//消费服务37.publicvoidconsume(){38.//通过负责均衡算法,得到一台服务器进行调用39.intindex = getRandomNum(0,1);40.System.out.println("调用"+ serverList.get(index)+"提供的服务:"+ serviceName);41.}42.43.publicintgetRandomNum(intmin,intmax){44.Random rdm =newRandom();45.returnrdm.nextInt(max-min+1)+min;46.}47.48.publicstaticvoidmain(String[] args)throwsException {49.ServiceConsumer consumer =newServiceConsumer();50.51.consumer.init();52.consumer.consume();53.54.Thread.sleep(1000*60*60*24);55.}56.57.}
使用zookeeper实现服务路由和负载均衡
最新推荐文章于 2023-04-26 18:09:17 发布
377

被折叠的 条评论
为什么被折叠?



