1.configrators變更 服務提供者會重新export。但是隻是dubboProtocol重新暴露,沒有往zk註冊新的url
實驗過了,就是沒註冊新的providerUrl,這樣怎麼說呢,如果providerUrl是永久節點不改的話,可以理解成保留providerUrl的原始參數。但是providerUrl是臨時節點,每次啓動會重新刷新的,我覺得還是得保證他這次回話中參數的變化得實時反應….
2.dubbo本地緩存運用邏輯
首先AbstractRegistry啓動時時會加載文件(沒有就創建)。當zk有變化時會異步(這個代碼裏"save.file"看是可以配置的,但是從dubbo給的api中沒找到可以設置的地方)保存到文件中。
當我們訂閱時如果訂閱失敗,就會使用本地文件保存的先通知
com.alibaba.dubbo.registry.support.FailbackRegistry#subscribe
try {
// Sending a subscription request to the server side
doSubscribe(url, listener);
} catch (Exception e) {
Throwable t = e;
// ....
List<URL> urls = getCacheUrls(url);
// ....
notify(url, listener, urls);
addFailedSubscribed(url, listener);
}
|
細節:
假如zk斷開連接,老的引用不動,新的引用走緩存。zk重新鏈接時怎麼處理?因爲提供者數據可能修改了,在ZookeeperRegistry中註冊了狀態監聽器,監聽重連狀態,如果zk狀態變爲 RECONNECTED = 2 已重連,就將之前註冊的監聽器全部設置成失效,走FailbackRegistry重新監聽FailbackRegistry的失敗定時監聽重新註冊時間 “retry.period" 間隔是 DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;
ZookeeperRegistry.java
// 添加 StateListener 對象。該監聽器,在重連時,調用恢復方法。
zkClient.addStateListener(new StateListener() {
public void stateChanged(int state) {
// 只除裏重連狀態
if (state == RECONNECTED) {
try {
recover();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
});
|
3.消費者監聽時,zk是把監聽全部節點推送嗎?
dubbo用的節點名做的。全量
4.版本號問題
這個根據經驗知道 * 全匹配。 不寫算一種版本("0.0.0") 、寫算一種版本。
讓我產生疑惑的地方:
之前講過配置參數。configrators>consumer>provider 會存在一個覆蓋關係。那消費端不配置版本,服務端配置版本。那樣不就默認使用服務端版本號了?雖然這樣聽起來很合理的樣子哈哈哈哈。
這個覆蓋關係不包括version,具體代碼見,即 在通知我們 到 處理之前就被過濾掉了
com.alibaba.dubbo.registry.support.AbstractRegistry#notify(URL, NotifyListener, java.util.List<URL>)
if (UrlUtils.isMatch(url, u)) //這行代碼
5 還有個問題不知道是不是dubbo默認允許的,感覺怪怪得
我們知道配置存在一個configrators>consumer>provider 會存在一個覆蓋關係,哪假如多個provider配置不一樣呢?你怎麼覆蓋,dubbo代碼裏循環走下面代碼,也就是按最後一個來,(和有多個註冊中心走最後一個負載均衡邏輯一樣…)
硬要理解就按一個註冊中心中服務者代碼是一樣的服務者配置自然是一樣的去理解。
假如搞事情單獨去改zk排在最後一個提供者,我認爲就是隻改最後一個提供者就會在下一次通知把其他提供者配置覆蓋,不是最後一個,就只會影響當前providerUrl
有時間試驗下,或有有大佬可以直接給我解答
com.alibaba.dubbo.registry.integration.RegistryDirectory#toInvokers 循環{
com.alibaba.dubbo.registry.integration.RegistryDirectory#mergeUrl{
//這裏有多個提供者參數不一致overrideDirectoryUrl不就有問題?只能記錄最後一一個參數
this.overrideDirectoryUrl = this.overrideDirectoryUrl.addParametersIfAbsent(providerUrl.getParameters());
}
}