使用zookeeper實現服務路由和負載均衡
來自: http://www.it165.net/admin/html/201501/4737.html
三個類:
ServiceAProvider
ServiceBProvider
ServiceConsumer
其中
ServiceAProvider提供的服務名service-A,指向IP為192.168.58.130
ServiceBProvider提供的服務名service-A,指向IP為192.168.58.131
當有消費者請求時,隨機地選取service-A列表的服務器提供服務
ServiceConsumer 為消費者類
依賴:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5-cdh5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.helix</groupId>
<artifactId>helix-core</artifactId>
<version>0.6.4</version>
</dependency> 服務提供者ServiceAProvider類的源碼為:
package com.jamesfen.zookeeper;
import java.net.InetAddress;
import org.I0Itec.zkclient.ZkClient;
public class ServiceAProvider {
private String serviceName = "service-A";
//向zookeeper注冊服務
public void init() throws Exception{
String serverList = "192.168.58.11:2181";
String PATH ="/configcenter";//根節點路徑
ZkClient zkClient = new ZkClient(serverList);
boolean rootExists = zkClient.exists(PATH);
if(!rootExists){
zkClient.createPersistent(PATH);
}
//判斷是否存在,不存在則創建服務節點
boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
if(!serviceExists){
zkClient.createPersistent(PATH + "/" + serviceName);
}
//註冊當前服務
InetAddress addr =InetAddress.getLocalHost();
//String ip= addr.getHostAddress().toString();
String ip = "192.168.58.130";
//創建當前服務器節點
zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip);
System.out.println("提供的服務節點名稱為:"+PATH + "/" + serviceName + "/" + ip);
}
//提供服務
public void provide(){
}
public static void main(String[]args) throws Exception {
ServiceAProvider service = new ServiceAProvider();
service.init();
Thread.sleep(1000*60*60*24);
}
} 服務提供者ServiceBProvider類源碼為
package com.jamesfen.zookeeper;
import java.net.InetAddress;
import org.I0Itec.zkclient.ZkClient;
public class ServiceBProvider {
//服務名仍然為 A,這樣是為了,一個服務名有兩個臺機器在服務,才能做負載均衡.
private String serviceName = "service-A";
//向zookeeper注冊服務
public void init() throws Exception{
String serverList = "192.168.58.11:2181";
String PATH ="/configcenter";//根節點路徑
ZkClient zkClient = new ZkClient(serverList);
boolean rootExists = zkClient.exists(PATH);
if(!rootExists){
zkClient.createPersistent(PATH);
}
boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
if(!serviceExists){
zkClient.createPersistent(PATH + "/" + serviceName);//創建服務節點
}
//註冊當前服務
InetAddress addr =InetAddress.getLocalHost();
//String ip= addr.getHostAddress().toString();
String ip = "192.168.58.131";
//創建當前服務器節點
zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip);
System.out.println("提供的服務節點名稱為:"+PATH + "/" + serviceName + "/" + ip);
}
//提供服務
public void provide(){
}
public static void main(String[]args) throws Exception {
ServiceBProvider service = new ServiceBProvider();
service.init();
Thread.sleep(1000*60*60*24);
}
} 消費者類源碼為:
package com.jamesfen.zookeeper;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
public class ServiceConsumer {
private List<String> serverList = new ArrayList<String>();
private String serviceName ="service-A";
//初始化服務地址信息
public void init(){
String zkServerList ="192.168.58.11:2181";
String SERVICE_PATH="/configcenter/"+serviceName;//服務節點路徑
ZkClient zkClient = new ZkClient(zkServerList);
boolean serviceExists =zkClient.exists(SERVICE_PATH);
if(serviceExists){
serverList =zkClient.getChildren(SERVICE_PATH);
}else{
throw new RuntimeException("service not exist!");
}
//注冊事件監聽
zkClient.subscribeChildChanges(SERVICE_PATH,new IZkChildListener(){
//@Override
public void handleChildChange(String parentPath, List<String> currentChilds)throws Exception{
serverList = currentChilds;
}
});
}
//消費服務
public void consume(){
//通過負責均衡算法,得到一臺服務器進行調用
int index = getRandomNum(0,1);
System.out.println("調用" + serverList.get(index)+"提供的服務:" + serviceName);
}
public int getRandomNum(int min,int max){
Random rdm = new Random();
return rdm.nextInt(max-min+1)+min;
}
public static void main(String[] args)throws Exception {
ServiceConsumer consumer = new ServiceConsumer();
consumer.init();
consumer.consume();
Thread.sleep(1000*60*60*24);
}
}
本文由用戶 CheWardill 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!