dubbo原始碼分析9 心跳機制

2021-10-09 04:54:10 字數 1397 閱讀 9104

啟動心跳檢測

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...