一、簡述
HSF(High-speed Service Framework),是在阿里巴巴內(nèi)部廣泛使用的分布式 RPC 服務(wù)框架。
HSF 連通不同的業(yè)務(wù)系統(tǒng)厌衔,解耦系統(tǒng)間的實(shí)現(xiàn)依賴蜡歹。HSF 從分布式應(yīng)用的層面,統(tǒng)一了服務(wù)的發(fā)布與調(diào)用方式紧索,從而幫助用戶更加方便、快速地開發(fā)分布式應(yīng)用菜谣,以及提供或使用公共功能模塊珠漂。HSF 為用戶屏蔽了分布式領(lǐng)域中的各種復(fù)雜技術(shù)細(xì)節(jié),如遠(yuǎn)程通訊尾膊、序列化實(shí)現(xiàn)媳危、性能損耗、同步與異步調(diào)用方式的實(shí)現(xiàn)等冈敛。
二待笑、架構(gòu)設(shè)計(jì)
HSF 作為一個純客戶端架構(gòu)的 RPC 框架,沒有服務(wù)端集群莺债,所有 HSF 服務(wù)調(diào)用均是通過服務(wù)消費(fèi)方(Consumer)與服務(wù)提供方(Provider)點(diǎn)對點(diǎn)進(jìn)行滋觉。為了實(shí)現(xiàn)整套分布式服務(wù)體系签夭,HSF 還需要依賴以下外部系統(tǒng):
1??Provider——服務(wù)提供者
通常是某個業(yè)務(wù)系統(tǒng),提供相關(guān)的業(yè)務(wù)服務(wù)椎侠,一般都是個服務(wù)集群第租。業(yè)務(wù)系統(tǒng)初期使用 HSF,通過引入 SDK 的方式我纪。后期阿里定制化改造了容器(tomcat/docker)慎宾,通過配置完成 HSF 的接入使用,作為架構(gòu)中的服務(wù)提供方浅悉。對業(yè)務(wù)系統(tǒng)本身(war/jar)不造成侵入性趟据。綁定了12200端口,用于接受請求并提供服務(wù)术健,同時將地址信息發(fā)布到地址注冊中心汹碱。
2??Consumer——服務(wù)消費(fèi)者
通常也是某個業(yè)務(wù)系統(tǒng)集群,跟服務(wù)提供者非常類似荞估,只是服務(wù)咳促、消費(fèi)角度區(qū)別。通過地址注冊中心訂閱服務(wù)勘伺,根據(jù)訂閱到的地址信息發(fā)起調(diào)用跪腹,地址注冊中心不參與調(diào)用。
3??ConfigServer——配置服務(wù)器
HSF 依賴注冊中心進(jìn)行服務(wù)發(fā)現(xiàn)飞醉,如果沒有注冊中心冲茸,HSF 只能完成簡單的點(diǎn)對點(diǎn)調(diào)用。因?yàn)樽鳛榉?wù)提供端缅帘,沒有辦法將自己的服務(wù)信息對外發(fā)布轴术,讓外界知曉;作為服務(wù)消費(fèi)端钦无,可能已經(jīng)知道需要調(diào)用的服務(wù)膳音,但是無法獲取能夠提供這些服務(wù)的機(jī)器硝皂。而 ConfigServer 就是服務(wù)信息的中介余掖,提供服務(wù)發(fā)現(xiàn)的能力烦味。
-
注冊與訂閱
服務(wù)注冊——在服務(wù)提供方啟動時,完成該服務(wù)的注冊——上報(bào)當(dāng)前服務(wù)的 ip/port趣席、服務(wù)類名方法名、版本號醇蝴、分組等信息宣肚。
服務(wù)訂閱——在服務(wù)消費(fèi)方啟動時,完成某些服務(wù)的訂閱——通過訂閱的服務(wù)標(biāo)識(類名+方法名+版本號等)悠栓,在內(nèi)存中查找相關(guān)服務(wù)霉涨,一旦找到則將服務(wù)提供者的 IP 端口等信息推送給當(dāng)前服務(wù)消費(fèi)方按价,以便消費(fèi)。
-
長連接與內(nèi)存級
服務(wù)提供方與服務(wù)消費(fèi)方均與配置服務(wù)器保持長連接笙瑟,一旦服務(wù)提供方發(fā)生變化楼镐,會立即被通知,更新內(nèi)存中的列表數(shù)據(jù)往枷,并同步給訂閱該服務(wù)的服務(wù)消費(fèi)方框产。
4??Diamond——EDAS 持久化配置中心
用于存儲 HSF 服務(wù)的各種治理規(guī)則,HSF 客戶端在啟動的過程中會向持久化配置中心訂閱各種服務(wù)治理規(guī)則错洁,如白名單秉宿、權(quán)限、路由規(guī)則屯碴、歸組規(guī)則描睦、權(quán)重規(guī)則等,從而根據(jù)規(guī)則對調(diào)用過程的選址邏輯進(jìn)行干預(yù)导而。持久化配置中心的角色是由 Diamond 組件承擔(dān)的忱叭。
當(dāng)需要時,用戶通過在界面上設(shè)計(jì)規(guī)則嗡载,Diamond 會快速的將新的規(guī)則推送給相關(guān)的服務(wù)提供方窑多。
5??addressServer——地址服務(wù)器
地址服務(wù)器的職責(zé)是保存上文的 ConfigServer 與 Diamond 服務(wù)器的地址列表。在 consumer洼滚、provider 啟動時埂息,會首先以域名訪問的方式訪問地址服務(wù)器,從地址服務(wù)器獲取到 ConfigServer 與 Diamond 服務(wù)器的地址列表信息遥巴,以便訪問千康。
6??EDAS 元數(shù)據(jù)存儲中心
元數(shù)據(jù)是指 HSF 服務(wù)對應(yīng)的方法列表以及參數(shù)結(jié)構(gòu)等信息,元數(shù)據(jù)不會對 HSF 的調(diào)用過程產(chǎn)生影響铲掐,因此元數(shù)據(jù)存儲中心也并不是必須的拾弃。但考慮到服務(wù)運(yùn)維的便捷性,HSF 客戶端在啟動時會將元數(shù)據(jù)上報(bào)到元數(shù)據(jù)存儲中心摆霉,以便提供給服務(wù)運(yùn)維使用豪椿。元數(shù)據(jù)存儲中心的角色是由 Redis 承擔(dān)的。
7??EDAS 控制臺
EDAS 控制臺打通了服務(wù)地址注冊中心携栋、持久化配置中心搭盾、元數(shù)據(jù)存儲中心等,為用戶提供了服務(wù)運(yùn)維功能婉支,包括服務(wù)查詢鸯隅、服務(wù)治理規(guī)則管理等,提高 HSF 服務(wù)研發(fā)的效率向挖、運(yùn)維的便捷性蝌以。
完成初始化后炕舵,服務(wù)調(diào)用者內(nèi)保存了相關(guān)的服務(wù)信息,通過內(nèi)部設(shè)置的調(diào)用方式(如隨機(jī)訪問一臺跟畅,權(quán)重等)可以進(jìn)行點(diǎn)對點(diǎn)的調(diào)用咽筋。
其內(nèi)部通過 NIO 多路復(fù)用(Netty)+Hessian 序列化實(shí)現(xiàn) RPC 調(diào)用,使用 Hessian 主要是壓測表現(xiàn)出穩(wěn)定性以及高效的綜合特性碍彭。
三晤硕、功能
HSF 作為分布式 RPC 服務(wù)框架,支持多種服務(wù)的調(diào)用方式庇忌。
1??同步調(diào)用
HSF 客戶端默認(rèn)以同步調(diào)用的方式消費(fèi)服務(wù)舞箍,客戶端代碼需要同步等待返回結(jié)果。
2??異步調(diào)用
對于服務(wù)調(diào)用的客戶端皆疹,并非所有 HSF 服務(wù)都需要同步等待返回結(jié)果疏橄。HSF 提供異步調(diào)用,幫助客戶端無需同步阻塞在 HSF 調(diào)用上略就。HSF 的異步調(diào)用捎迫,有 Future 調(diào)用和 Callback 調(diào)用兩種:
①Future 調(diào)用
客戶端在需要獲取調(diào)用的返回結(jié)果時,通過 HSFResponseFuture.getResponse(int timeout)主動獲取結(jié)果表牢。
②Callback 調(diào)用
Callback 調(diào)用利用 HSF 內(nèi)部提供的回調(diào)機(jī)制窄绒,在指定 HSF 服務(wù)消費(fèi)完畢拿到返回結(jié)果時,HSF 會回調(diào)用戶實(shí)現(xiàn)的 HSFResponseCallback 接口崔兴,客戶端通過回調(diào)通知的方式獲取結(jié)果彰导。
3??泛化調(diào)用
對于一般的 HSF 調(diào)用來說,HSF 客戶端需要依賴服務(wù)的二方包敲茄,通過依賴二方包中的 API 進(jìn)行編程調(diào)用位谋,獲取返回結(jié)果。但是泛化調(diào)用不需要依賴服務(wù)的二方包堰燎,可以發(fā)起 HSF 調(diào)用掏父、獲取返回結(jié)果。在平臺型的產(chǎn)品中秆剪,泛化調(diào)用的方式可以有效減少平臺型產(chǎn)品的二方包依賴赊淑,實(shí)現(xiàn)系統(tǒng)的輕量級運(yùn)行。
4??調(diào)用鏈路 Filter 擴(kuò)展
HSF 內(nèi)部設(shè)計(jì)了調(diào)用過濾器仅讽,能夠主動發(fā)現(xiàn)用戶的調(diào)用過濾器擴(kuò)展點(diǎn)膏燃,將其集成到 HSF 調(diào)用鏈路中,便于擴(kuò)展方對 HSF 的請求進(jìn)行擴(kuò)展處理何什。
四、應(yīng)用開發(fā)方式
使用 HSF 開發(fā)應(yīng)用有 Ali-Tomcat 和 Pandora Boot 兩種方式等龙。
Ali-Tomcat:依賴 Ali-Tomcat 和 Pandora处渣,提供了完整的 HSF 功能伶贰,包括服務(wù)注冊與發(fā)現(xiàn)、隱式傳參罐栈、異步調(diào)用黍衙、泛化調(diào)用和調(diào)用鏈路 Filter 擴(kuò)展。應(yīng)用程序須以 WAR 包方式部署荠诬。
Pandora Boot:依賴 Pandora琅翻,提供了比較完整的 HSF 功能,包括服務(wù)注冊與發(fā)現(xiàn)柑贞、異步調(diào)用方椎。應(yīng)用程序編譯為可運(yùn)行的 JAR 包并部署即可。