使用模板模式,對註冊中心進行設計,可以方便後續新增註冊中心
模板抽象類,提供註冊中心必要的方法。
public abstract class serviceregistry建立乙個本地的註冊中心,使用集合來儲存註冊的資料,實現模板的方法
public class localserviceregistry extends serviceregistry使用zk作為註冊中心。@override
public void stop()
@override
public boolean registry(setkeys, string value)
for (string key : keys)
values.add(value);//每次通過不同的位址傳來相同服務key,就將位址存到values中。
//這樣保證了註冊中心的服務key對應了來自不同位址的伺服器。
}return true;
}@override
public boolean remove(setkeys, string value)
for (string key : keys)
//移除每乙個key值下的位址
}return true;
}@override
public map> discovery(setkeys)
map> registrydatatmp = new hashmap>();
for (string key : keys)
//將每個key值下的位址都取出來,一般不用,只取乙個
}return registrydatatmp;
}@override
public treesetdiscovery(string key)
}
為什麼要選用註冊中心
假設沒有註冊中心,採用直連的方式,如果服務提供者發生變化,那麼消費者也要立即更新,耦合度太高
zk作為服務註冊的乙個框架,消費者只需要向註冊中心獲取服務提供者的位址,無需自己做更新。達到了解耦合的作用,而且還能實現服務的自動發現。
xxl-rpc中每個服務在zookeeper中對應乙個節點,如圖"iface name"節點,該服務的每乙個provider機器對應"iface name"節點下的乙個子節點,如圖中"192.168.0.1:9999"、"192.168.0.2:9999"和"192.168.0.3:9999",子節點型別為zookeeper的ephmeral(臨時節點)型別,該型別節點有個特點,當機器和zookeeper集群斷掉連線後節點將會被移除。consumer底層可以從zookeeper獲取到可提供服務的provider集群位址列表,從而可以向其中乙個機器發起rpc呼叫。
public class zkserviceregistry extends serviceregistryzk的註冊中心類提供了一系列的方法,並通過定義的zkclient類來操作zk,建立和更新節點,這樣就可以完成註冊的功能//從路徑到key值
public string pathtokey(string nodepath)
return nodepath.substring(zkenvpath.length()+1, nodepath.length());
}//開啟註冊
@override
public void start(mapparam)
if (env == null || env.trim().length() == 0)
//初始化環境位址
zkenvpath = zkbasepath.concat("/").concat(env);
//配置客戶端
//需要完善zk的客戶端
xxlzkclient = new xxlzkclient(zkaddress, zkenvpath, zkdigest, new watcher()
//得到key值
string path = watchedevent.getpath();
string key = pathtokey(path);
if (key != null) else if (watchedevent.getstate() == event.keeperstate.syncconnected)
}} catch (exception e)
}});
//初始化客戶端
xxlzkclient.getclient();
//重新整理的執行緒啟動
refreshthread=new thread(new runnable() catch (exception e) }}
}});
refreshthread.setname("xxl-rpc, zkserviceregistry refresh thread.");
refreshthread.setdaemon(true);//設定為守護執行緒
refreshthread.start();
}//註冊停止
@override
public void stop()
if (refreshthread != null)
}private void refreshdiscoverydata(string key) else
}if (keys.size() > 0)
if (childpathdata.size() > 0) }}
}//重新整理註冊資料
private void refreshregistrydata()}}
}@override
public boolean registry(setkeys, string value)
values.add(value);
// make path, child path
string path = keytopath(key);
xxlzkclient.setchildpathdata(path, value, "");
}return true;
}@override
public boolean remove(setkeys, string value)
string path = keytopath(key);
xxlzkclient.deletechildpath(path, value);
}return true;
}@override
public map> discovery(setkeys)
map> registrydatatmp = new hashmap>();
for (string key : keys)
}return registrydatatmp;
}@override
public treesetdiscovery(string key)
return values;}}
微服務中的註冊中心 Eureka
1 角色 1 eureka server 服務註冊中心 可以是乙個集群 對外暴露自己的位址給每個微服務使用 2 服務提供者 啟動後向 eurekaserver註冊自己資訊 位址 服務名 3 服務消費者 向 eurekaserver訂閱服務,eureka會將對應服務的所有提供者位址列表傳送給消費者,並...
RPC服務註冊與發現
rpc遠端過程呼叫中,存在2個角色,乙個服務提供者 另乙個服務消費者。那如何讓呼叫者知道,存在哪些服務可以呼叫呢?即如何讓別人使用我們的服務呢?有同學說很簡單嘛,告訴使用者服務的ip以及埠就可以了啊。確實是這樣,這裡問題的關鍵在於是自動告知還是人肉告知。人肉告知的方式 如果你發現你的服務一台機器不夠...
Eureka 註冊中心
角色 1 服務提供者 2 服務消費者 3 服務註冊中心 a.高ha 支援資料持久化和服務集群 b.資料一致性問題,集群中的所有客戶應該看到同乙份資料不能出現讀寫資料不一致 c.資料變更主動推送,當註冊中心的資料發生變更時要及時通知客戶端 關鍵性功能設計 1 服務提供者在啟動時,向註冊中心註冊自己提供...