小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

HSF的原理分析

 hmtomyang 2018-08-06

一.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)重要的作用。
HSF1.0時(shí)只支持兩種序列化方式:java 和 hessian,在HSF2.0之后就支持了五種序列化方式:java、hessian、hessian2、json、kyro。
但是目前版本中常用的序列化方式還是java 和 hessian兩種。如果想細(xì)致的了解也可以多做了解。

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ù)的大致流程如下:
· server啟動(dòng)時(shí)候向configserver注冊(cè)
· client啟動(dòng)時(shí)候向configserver請(qǐng)求list
· client緩存list,發(fā)現(xiàn)不可用的server,從緩存中remove
· configserver通過(guò)心跳包維護(hù)可用server的list
· list有更新的時(shí)候,configserver通過(guò)帶version的報(bào)文通知client更新

 

從以上幾個(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)


關(guān)于HSF的架構(gòu)基本可以理解為C/S結(jié)構(gòu)設(shè)計(jì)方式。(雖然HSF沒(méi)有自己的服務(wù)器)
Server端除了configServer外還有一個(gè)diamond用來(lái)保存一些持久化的配置信息,這里不進(jìn)行過(guò)多的介紹。

Client是HSF的重點(diǎn),下面是各模塊的功能介紹:
Proxy:這一層主要負(fù)責(zé)接口的代理?;旧纤械腞PC框架都會(huì)用到代理模式,相信大家不陌生。需要注意的是HSF的代理層還進(jìn)行了軟負(fù)載和單元化的處理。
Remoting:這一層是HSF的應(yīng)用層協(xié)議,定義了報(bào)文格式,各個(gè)字段的含義等信息,內(nèi)容比較多,之后單獨(dú)寫(xiě)一篇文章來(lái)介紹。
Processer:這一層主要是處理HSF自身的業(yè)務(wù)邏輯,包括埋點(diǎn)、限流、鑒權(quán)等。
Netty:上面三層會(huì)將一次服務(wù)調(diào)用或者服務(wù)返回包裝成一個(gè)報(bào)文,然后通過(guò)這層傳輸。

HSF調(diào)用流程


上圖是HSF整個(gè)的調(diào)用過(guò)程,從左向右看:
第一條線路相當(dāng)于consumer進(jìn)行服務(wù)調(diào)用的過(guò)程,首先經(jīng)過(guò)proxy層,將請(qǐng)求經(jīng)過(guò)代理類包裝出去;然后是Remoting層進(jìn)行協(xié)議的包裝,最后io層發(fā)送出去。
第二條線路相當(dāng)于provider將結(jié)果返回后解析的過(guò)程,與上一流程剛好相反。
右邊的provider兩條調(diào)用流程相信大家都能按照上面的過(guò)程理解,就不一一講解了。

 

四.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ù)的可用性。

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多