啟動心跳檢測
public headerexchangeserver(server server)
this.server = server;
this.heartbeat = server.geturl().getparameter(constants.heartbeat_key, 0);//心跳週期間隔時間 預設60000,
this.heartbeattimeout = server.geturl().getparameter(constants.heartbeat_timeout_key, heartbeat * 3);//心跳超時時間, 預設是heartbeat 的3倍
if (heartbeattimeout < heartbeat * 2)
startheartbeattimer();//啟動心跳檢測線程
}headerexchangeserver構造方法,它獲取了心跳相關引數,啟動心跳執行緒,這個心跳任務 每隔一段時間向當前server的所有channel(就是所有客戶端)傳送心跳。
private void startheartbeattimer()
}, heartbeat, heartbeattimeout),// 時間間隔,超時時間傳參
heartbeat, heartbeat, timeunit.milliseconds);// 設定延遲時間,時間間隔都為heartbeat,單位為毫秒}}
channelprovider的匿名類 實現了getchannels方法 用於獲取當前server所有channel.
heartbeattask(channelprovider provider, int heartbeat, int heartbeattimeout)
@override
public void run()
try
}if (lastread != null && now - lastread > heartbeattimeout) catch (exception e)
} else
}} catch (throwable t)
}} catch (throwable t)
}inte***ce channelprovider
獲取到需要心跳檢測的channel後,對每乙個channel進行如下判斷:
如果在heartbeat內沒有進行讀操作或者寫操作,則傳送心跳請求
如果正常訊息和心跳在heartbeattimeout都沒接收到,consumer端會進行重連,provider端會關閉channel
lastread 每次收到訊息包後都會寫入。
conusmer端的 心跳機制在headerexchangeclient中實現,與server端邏輯大體相同,不再詳細分析
Dubbo原始碼分析
dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...
Dubbo原始碼分析之擴充套件機制(3)
獲取到自適應型別後進行例項化並且進行屬性注入,這裡會判斷物件工廠是否為空,當型別type為extensionfactory時會為空,也就是不會注入屬性,它的自適應型別為adaptiveextensionfactory,所以其他型別的objectfactory就是adaptiveextensionfa...
Dubbo原始碼分析 多版本
在開發的時候,可能多個專案會修改同乙個服務,那麼不能直接暴露出來,否則會被其他人給呼叫到,導致資料不正常,那麼這種情況下可以使用dubbo的多版本來解決這個問題,配置如下 穩定環境下的provider和consumer com.foo.barservice version 1.0.0 barserv...