|
一.HSF的基本概念 HSF全稱為High-Speed Service Framework,旨在為淘系的應(yīng)用提供一個(gè)分布式的服務(wù)框架,HSF從分布式應(yīng)用層面以及統(tǒng)一的發(fā)布/調(diào)用方式層面為大家提供支持,從而可以很容易的開(kāi)發(fā)分布式的應(yīng)用以及提供或使用公用功能模塊,而不用考慮分布式領(lǐng)域中的各種細(xì)節(jié)技術(shù),例如遠(yuǎn)程通訊、性能損耗、調(diào)用的透明化、同步/異步調(diào)用方式的實(shí)現(xiàn)等等問(wèn)題。
二.知識(shí)準(zhǔn)備 通過(guò)以上的說(shuō)明,大致了解了一下RPC與HSF的總體架構(gòu),但是總體架構(gòu)離具體實(shí)現(xiàn)還想差很多,有些知識(shí)準(zhǔn)備還是很有必要的。 1.對(duì)象的序列化 對(duì)象的序列化過(guò)程在RPC過(guò)程中是很重要的一個(gè)環(huán)節(jié),序列化對(duì)于遠(yuǎn)程調(diào)用的響應(yīng)速度、吞吐量、網(wǎng)絡(luò)帶寬消耗等同樣也起著至關(guān)重要的作用。 2.動(dòng)態(tài)代理 對(duì)于消費(fèi)方來(lái)說(shuō),所存在的只有一個(gè)接口,雖然底層的實(shí)現(xiàn)原理我們知道,但是為了在使用時(shí)的高度透明,在JAVA語(yǔ)言層面上的表現(xiàn)形式則是通過(guò)動(dòng)態(tài)代理的方式實(shí)現(xiàn)的,很多的邏輯都在InvocationHandler 中處理的。關(guān)于如何實(shí)現(xiàn)動(dòng)態(tài)代理,還動(dòng)態(tài)代理的一些使用的細(xì)節(jié)也可以稍作了解。 3.網(wǎng)絡(luò)通信NIO 如果在網(wǎng)絡(luò)傳輸過(guò)程中,采取普通的BIO,會(huì)有很多的問(wèn)題存在,例如如果調(diào)用端有多個(gè)請(qǐng)求過(guò)來(lái),那么就得需要多個(gè)線程去處理,每個(gè)線程都使用獨(dú)立的連接,在遠(yuǎn)端的提供者端有對(duì)應(yīng)的多個(gè)線程來(lái)執(zhí)行相應(yīng)的服務(wù)。這種方式會(huì)使得調(diào)用者和提供者之間建立大量的連接,而且是阻塞的方式,連接并不能得到充分的利用(摘自《大型網(wǎng)站系統(tǒng)與JAVA中間件》)。采用NIO則就可以避免這樣的損耗,但是HSF在使用時(shí)并不是采用直接的NIO編程,而是通過(guò)第三方的框架Netty。
二.HSF 實(shí)現(xiàn)原理 1.提供服務(wù)的大致流程如下: 從以上幾個(gè)問(wèn)題出發(fā),看下HSF的實(shí)現(xiàn)方式。 2.HSF的整體實(shí)現(xiàn)方式: 從圖中可以看出,HSF的實(shí)現(xiàn)方式可以理解為是C/S的架構(gòu),但是和傳統(tǒng)的C/S架構(gòu)相比還是有很大的不同,HSF沒(méi)有真正的服務(wù)器,每個(gè)應(yīng)用都可以成為服務(wù)的調(diào)用方和提供方。具體工作方式如下: ConfigServer:遠(yuǎn)程調(diào)用對(duì)端的地址就是由ConfigServer 來(lái)推送的,這樣用戶只需要配置自己的服務(wù)端或者消費(fèi)端,不需要對(duì)自己的地址進(jìn)行管理。 Diamond:持久化的配置中心,用于配置服務(wù)調(diào)用的規(guī)則。 服務(wù):服務(wù)是調(diào)用方和提供方交流的依憑,一般是一個(gè)接口,表示一個(gè)業(yè)務(wù)行為以及相關(guān)的數(shù)據(jù)含義。通過(guò)使用HSFApiProviderBean能夠暴露一個(gè)服務(wù),將機(jī)器的地址注冊(cè)到configserver,并且能夠通過(guò)12200端口進(jìn)行服務(wù)提供,通過(guò)HSFApiConsumerBean能夠包裝出一個(gè)客戶端,它是服務(wù)接口的一個(gè)代理,并且它從configserver上訂閱了服務(wù)的地址列表,能夠在這個(gè)列表上完成隨機(jī)調(diào)用,做到負(fù)載均衡與HA((High Available,高可用性群集)。 網(wǎng)絡(luò)通信:HSF的底層網(wǎng)絡(luò)通信是使用netty框架實(shí)現(xiàn)的,是基于epoll的NIO的網(wǎng)絡(luò)通訊框架,HSF在此使用的是長(zhǎng)連接,通過(guò)合理的服務(wù)部署及負(fù)債均衡,基本不存在I/O方面的限制。
三.HSF設(shè)計(jì)架構(gòu)
Client是HSF的重點(diǎn),下面是各模塊的功能介紹: HSF調(diào)用流程
四.HSF處理請(qǐng)求流程 1.HSF提供端初始化 2.HSF消費(fèi)端初始化 3.消費(fèi)方請(qǐng)求到提供方,響應(yīng)一次調(diào)用 4.實(shí)現(xiàn)細(xì)節(jié) 心跳檢測(cè): 1、客戶端主動(dòng)關(guān)閉連接:客戶端第一次與服務(wù)端建立鏈接后,就會(huì)周期性(27s)發(fā)送心跳包的callback調(diào)用,如果連續(xù)三次收不到服務(wù)端的心跳包回應(yīng),客戶端主動(dòng)關(guān)閉鏈接 2、服務(wù)端主動(dòng)關(guān)閉連接:當(dāng)連接59s沒(méi)有調(diào)用(對(duì)方網(wǎng)絡(luò)不可用,或者full gc太久),相當(dāng)于兩次(2*27s)收不到心跳包的時(shí)間 從上圖可以看出RPC要解決以下幾個(gè)問(wèn)題: 如何解決網(wǎng)絡(luò)通信問(wèn)題,主要是通過(guò)在客戶端和服務(wù)器之間建立TCP連接,遠(yuǎn)程過(guò)程調(diào)用的所有交換的數(shù)據(jù)都在這個(gè)連接里傳輸。連接可以是按需連接,調(diào)用結(jié)束后就斷掉,也可以是長(zhǎng)連接,多個(gè)遠(yuǎn)程過(guò)程調(diào)用共享同一個(gè)連接。 如何解決尋址問(wèn)題,客戶端如何找到制定的服務(wù)端,也就是保證準(zhǔn)確有效的完成一次服務(wù)調(diào)用的前提。 參數(shù)的傳遞及服務(wù)端在收到客戶端請(qǐng)求后如何實(shí)現(xiàn)其具體功能并返回,由于網(wǎng)絡(luò)傳輸協(xié)議是二進(jìn)制的,內(nèi)存中的參數(shù)值必須要解決序列化,反序列化,以及對(duì)半包,粘包的處理。
五.HSF的優(yōu)點(diǎn): 1.服務(wù)的自動(dòng)注冊(cè)、發(fā)現(xiàn) 通過(guò)注冊(cè)中心,實(shí)現(xiàn)服務(wù)的注冊(cè)/注銷與服務(wù)的發(fā)現(xiàn)。當(dāng)服務(wù)啟動(dòng)后,會(huì)調(diào)用publish來(lái)將服務(wù)發(fā)布到中心,而服務(wù)的消費(fèi)者,通過(guò)調(diào)用訂閱接口傳入的監(jiān)聽(tīng)器來(lái)更新服務(wù)提供者列表。HSF提供了三種注冊(cè)中心實(shí)現(xiàn),分別是ConfigServer,Zookeper,和配置文件模式。 這里僅對(duì)Zookeper進(jìn)行分析,ZookeeperMetadataAddressService 實(shí)現(xiàn)了上述接口,在初始化中實(shí)例化了一個(gè)ZookeeperRegistry來(lái)進(jìn)行管理,其使用了一個(gè)封裝了zookeperclient的實(shí)例-ZkclientZookeeperClient,在注冊(cè)服務(wù)的時(shí)候根據(jù)url參數(shù)中的Constants.DYNAMIC_KEY來(lái)確定創(chuàng)建Persistent節(jié)點(diǎn)還是Ephemeral節(jié)點(diǎn),Ephemeral節(jié)點(diǎn)生命周期與本機(jī)連接綁定,這樣就可以實(shí)現(xiàn)本機(jī)離線后的服務(wù)自動(dòng)注銷的功能。 2) 服務(wù)提供者與消費(fèi)者之間長(zhǎng)連接。 HSF采用長(zhǎng)連接方式進(jìn)行通信,相比短連接,長(zhǎng)連接更具性能優(yōu)勢(shì),避免連接重復(fù)創(chuàng)建與銷毀帶來(lái)的緩沖區(qū)申請(qǐng)與釋放。HSF抽象了連接AbstractClient(Client),并采用了netty框架作為底層實(shí)現(xiàn)。netty是一個(gè)性能非常優(yōu)秀的通信框架,基于反應(yīng)器模式,內(nèi)部采用了管線模式來(lái)解耦不同層次的邏輯之間的耦合問(wèn)題。HSF為了強(qiáng)化TCP連接的可用性,增加HeartBeat功能,使用了一個(gè)Netty提供的 HashedWheelTimer 的定時(shí)任務(wù)調(diào)度器來(lái)執(zhí)行心跳包的發(fā)送(補(bǔ)充:此HashedWheelTimer原理采用輪片式的桶結(jié)構(gòu),避免每次操作對(duì)全部任務(wù)的迭代操作,只對(duì)將要到期的桶進(jìn)行操作,此原理也可用于緩存系統(tǒng)設(shè)計(jì),在需要進(jìn)行垃圾回收的情況下只需要按照桶為單位進(jìn)行內(nèi)存回收)。 3) 非侵入性 HSF最大優(yōu)點(diǎn)是非侵入性,它使用了JAVA的Proxy機(jī)制來(lái)實(shí)現(xiàn)這一特點(diǎn),在通過(guò)xml配置文件配置Consumer的時(shí)候,實(shí)際上是調(diào)用了 HSFApiConsumerBean ,在它的初始化方法中,讀取了配置的實(shí)現(xiàn)接口,并在ProcessComponent中用一個(gè)封裝了Proxy注冊(cè)功能,并實(shí)現(xiàn)了InvocationHandler接口的類HSFServiceProxy去管理。使用者在自己的代碼中無(wú)需做任何特殊處理,就像使用本地方法一樣去調(diào)用其方法。 4) 版本管理 這一特性可以很靈活的幫助上線運(yùn)營(yíng)的服務(wù)在升級(jí)過(guò)程中避免服務(wù)不可用的情況。 5) 服務(wù)治理 可以通過(guò)網(wǎng)頁(yè)可視化查看、管理、測(cè)試服務(wù)的可用。 6) 擴(kuò)展靈活 可以接入自動(dòng)服務(wù)降級(jí)功能(熔斷) - 根據(jù)配置或服務(wù)的執(zhí)行結(jié)果,在調(diào)用級(jí)控制服務(wù)是否調(diào)用執(zhí)行,避免服務(wù)整體癱瘓,提升服務(wù)的可用性。
|
|
|