tars framework 源碼解讀(一) 代碼簡述


tarsframework 的源碼大體分3部分

1、framework  框架的實現,里面內容是框架各個基礎服務具體做的事;

2、servant 實現的內容是 單個服務基礎lib的封裝,包括網絡IO,協程,邏輯管理等封裝;

3、Util里一些高性能 數據結構的實現。

 

framework  和 servant 是這個框架,實現高可用設計,Util則是騰訊大神擼碼功底的體現。

暫時源碼解讀筆記只寫 framework  和 servant 部分。

對於Util部分,我有空時再做點一些關鍵類的筆記。

還有帶着疑問解讀tars源碼章節。這塊等后續補齊。

可以厚着臉皮的說,看我系列文章絕對有價值。我不只是簡單的描述調用流程,還把framework 代碼中涉及的所有配置細節參數,包括默認值,配置位置。盡可能的都記錄上來了

 

另外,如果有時間,最好去讀讀tarsframework 源碼,不管你是哪種語言的使用者,讀這源碼對理解所用的語言的調用模式是有好處的,光看某個語言實現的Servant,其實很多內容是理解不到位的。

 

下面是官方文檔中關於這些部分的描述

 

framework基礎服務代碼功能簡介:

 

 

整體架構的拓撲圖主要分為2個部分:服務節點與公共框架節點。

服務節點:

服務節點可以認為是服務所實際運行的一個具體的操作系統實例,可以是物理主機或者虛擬主機、雲主機。隨着服務的種類擴展和規模擴大,服務節點可能成千上萬甚至數以十萬計。 每台服務節點上均有一個Node服務節點和N(N>=0)個業務服務節點,Node服務節點會對業務服務節點進行統一管理,提供啟停、發布、監控等功能,同時接收業務服務節點上報過來的心跳。

公共框架節點:

除了服務節點以外的服務,其他服務節點均歸為一類。

公共框架節點,數量不定,為了自身的容錯容災,一般也要求在在多個機房的多個服務器上進行部署,具體的節點數量,與服務節點的規模有關,比如,如果某些服務需要打較多的日志,就需要部署更多的日志服務節點。

又可細分為如下幾個部分:

Web管理系統:在Web上可以看到服務運行的各種實時數據情況,以及對服務進行發布、啟停、部署等操作;

Registry(路由+管理服務):提供服務節點的地址查詢、發布、啟停、管理等操作,以及對服務上報心跳的管理,通過它實現服務的注冊與發現;

Patch(發布管理):提供服務的發布功能;

Config(配置中心):提供服務配置文件的統一管理功能;

Log(遠程日志):提供服務打日志到遠程的功能;

Stat(調用統計):統計業務服務上報的各種調用信息,比如總流量、平均耗時、超時率等,以便對服務出現異常時進行告警;

Property(業務屬性):統計業務自定義上報的屬性信息,比如內存使用大小、隊列大小、cache命中率等,以便對服務出現異常時進行告警;

Notify(異常信息):統計業務上報的各種異常信息,比如服務狀態變更信息、訪問db失敗信息等,以便對服務出現異常時進行告警;

原則上要求全部的節點之間網絡互通,至少每台機器的node能夠與公共框架節點之間都是可以連通的。

 

 

 

框架服務在整個系統中運行時,服務之間的交互分:業務服務之間的交互、業務服務與框架基礎服務之間的交互。

服務發布流程:在Web系統上傳server的發布包到patch,上傳成功后,在web上提交發布server請求,由registry服務傳達到node,然后node拉取server的發布包到本地,拉起server服務。

管理命令流程:Web系統上的可以提交管理server服務命令請求,由registry服務傳達到node服務,然后由node向server發送管理命令。

心跳上報流程:server服務運行后,會定期上報心跳到node,node然后把服務心跳信息上報到registry服務,由registry進行統一管理。

信息上報流程:server服務運行后,會定期上報統計信息到stat,打印遠程日志到log,定期上報屬性信息到property、上報異常信息到notify、從config拉取服務配置信息。

Client訪問Server流程:client可以通過server的對象名Obj間接訪問server,Client會從registry上拉取server的路由信息(如ip、port信息),然后根據具體的業務特性(同步或者異步,tcp或者udp方式)訪問server(當然client也可以通過ip/port直接訪問server)。

 

下面這部分是 

libservant部分源碼的簡介

還是直接用官方原圖解說

 

 服務端:可以理解成對外公開的接口 被調用時候響應流程 的底層封裝 (響應端)

NetThread: 收發包,連接管理,多線程(可配置),采用epoll ET觸發實現,支持tcp/udp;

BindAdapter: 綁定端口類,用於管理Servant對應的綁定端口的信息操作;

ServantHandle:業務線程類,根據對象名分派Servant的對象和接口調用;

AdminServant: 管理端口的對象;

ServantImp: 繼承Servant的業務處理基類(Servant:服務端接口對象的基類);

客戶端:可以理解成 管理其他服務的連接器的 底層封裝 (調用發起端)

NetThread: 收發包,連接管理,多線程(可配置),采用epoll ET觸發實現,支持tcp/udp;

AdapterProxy: 具體服務器某個節點的本地代理,管理到服務器的連接,以及請求超時處理;

ObjectProxy: 遠程對象代理,負責路由分發、負載均衡、容錯,支持輪詢/hash/權重;

ServantProxy: 遠程對象調用的本地代理,支持同步/異步/單向,Tars協議和非Tars協議;

AsyncThread: 異步請求的回應包處理線程;

Callback: 具體業務Callback的處理基類對象;

大體就是上面那樣子。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM