rpc中的註冊中心

2022-06-29 23:45:14 字數 3580 閱讀 8080

使用模板模式,對註冊中心進行設計,可以方便後續新增註冊中心

模板抽象類,提供註冊中心必要的方法。

public abstract class serviceregistry
建立乙個本地的註冊中心,使用集合來儲存註冊的資料,實現模板的方法

public class localserviceregistry extends serviceregistry 

@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作為註冊中心。

為什麼要選用註冊中心

假設沒有註冊中心,採用直連的方式,如果服務提供者發生變化,那麼消費者也要立即更新,耦合度太高

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 serviceregistry 

//從路徑到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;}}

zk的註冊中心類提供了一系列的方法,並通過定義的zkclient類來操作zk,建立和更新節點,這樣就可以完成註冊的功能

微服務中的註冊中心 Eureka

1 角色 1 eureka server 服務註冊中心 可以是乙個集群 對外暴露自己的位址給每個微服務使用 2 服務提供者 啟動後向 eurekaserver註冊自己資訊 位址 服務名 3 服務消費者 向 eurekaserver訂閱服務,eureka會將對應服務的所有提供者位址列表傳送給消費者,並...

RPC服務註冊與發現

rpc遠端過程呼叫中,存在2個角色,乙個服務提供者 另乙個服務消費者。那如何讓呼叫者知道,存在哪些服務可以呼叫呢?即如何讓別人使用我們的服務呢?有同學說很簡單嘛,告訴使用者服務的ip以及埠就可以了啊。確實是這樣,這裡問題的關鍵在於是自動告知還是人肉告知。人肉告知的方式 如果你發現你的服務一台機器不夠...

Eureka 註冊中心

角色 1 服務提供者 2 服務消費者 3 服務註冊中心 a.高ha 支援資料持久化和服務集群 b.資料一致性問題,集群中的所有客戶應該看到同乙份資料不能出現讀寫資料不一致 c.資料變更主動推送,當註冊中心的資料發生變更時要及時通知客戶端 關鍵性功能設計 1 服務提供者在啟動時,向註冊中心註冊自己提供...