SOA框架——Dubbo

1.背景

想象下這么個場景:

有個做生活服務(wù)的APP,主要提供一些生活化的咨詢信息,比如天氣、新聞、個人三金賬單、政府辦事事項(xiàng)等等,那么把這些功能全部放入一個應(yīng)用肯定是不現(xiàn)實(shí)的。

按照分布式服務(wù)的設(shè)計(jì)理念,可能最終的結(jié)果是用戶登錄、注冊相關(guān)的作為一個user應(yīng)用,天氣相關(guān)的一個weather應(yīng)用,新聞資訊相關(guān)的一個news應(yīng)用,賬單相關(guān)的一個bill應(yīng)用,政府辦事相關(guān)的一個life應(yīng)用,這樣就被拆分成了若干個功能相對穩(wěn)定的應(yīng)用,同時應(yīng)用之間通過RPC調(diào)用,共同構(gòu)成了一個分布式服務(wù)框架。

這種分布式服務(wù)架構(gòu)在流量、服務(wù)數(shù)量相對小的時候足夠滿足實(shí)際需要,但是在服務(wù)數(shù)量越來越大、流量增大或者間斷性流量出現(xiàn)峰值、服務(wù)間調(diào)用越來越復(fù)雜的情況下,這種架構(gòu)就就很難再滿足需要了。比如上述的APP這周搞推廣注冊送禮的活動,突然間登錄、注冊的操作暴增,此時負(fù)責(zé)處理相關(guān)業(yè)務(wù)的user應(yīng)用負(fù)荷增加,出現(xiàn)響應(yīng)慢、超時、宕機(jī)的情況,怎么辦?按分布式服務(wù)框架,最簡單直接的辦法是增加user應(yīng)用的實(shí)例、帶寬等硬件資源,再在調(diào)用方或者Nginx端改改user應(yīng)用相關(guān)的負(fù)載列表,重啟over。等推廣結(jié)束之后再改改負(fù)載列表,停掉增加的資源,重啟over.......

如此一來,反復(fù)地增加、刪除、停止、啟動,只要中間某一步做錯,就會造成難以想象的錯誤。那么如何彈性、動態(tài)地計(jì)算所需資源,又如何動態(tài)地增加、刪除資源,最大程度不影響業(yè)務(wù)流轉(zhuǎn),減少犯錯誤的幾率,是一個新的課題。由此流動式的架構(gòu)理念運(yùn)用而生,而dubbo框架正是流動式計(jì)算架構(gòu)的一種。

2.Dubbo是什么

Dubbo是阿里旗下的一個彈性的分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。

3.Dubbo能做什么

3.1.透明化的遠(yuǎn)程方法調(diào)用

沒有API侵入,就能像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法。

在實(shí)際項(xiàng)目中,通常會對Provider和Consumer使用的公共部分,抽象為一個通用的一個jar包,內(nèi)部定義需要的Service、DTO、POJO、工具類等。此時,Provider端實(shí)現(xiàn)Service服務(wù),Consumer引入jar包,申明服務(wù)。通過此種方法,實(shí)現(xiàn)無API侵入,Service對Consumer透明,但最終實(shí)現(xiàn)了Consumer對Provider的調(diào)用。

3.2.服務(wù)自動注冊與發(fā)現(xiàn)

服務(wù)的注冊、發(fā)現(xiàn)、更新都是基于注冊中心Registry來實(shí)現(xiàn)的。

Registry與Provider、Registry與Consumer之間實(shí)現(xiàn)了基于Socket長連接的實(shí)時心跳檢測,每隔幾秒鐘檢測一次,收集Provider、Consumer的服務(wù)信息,整理更新服務(wù)列表。通過這樣的實(shí)現(xiàn),Provider和Consumer均不再需要寫死服務(wù)提供方地址,只需要配置注冊中心地址即可,實(shí)現(xiàn)動態(tài)化。

3.3.軟負(fù)載均衡及容錯機(jī)制

Dubbo提供了一系列的軟負(fù)載均衡算法供使用,可替代F5等硬件負(fù)載均衡器,降低硬件成本,減少單點(diǎn)。

Consumer通過訂閱服務(wù),在本地緩存可調(diào)用的服務(wù)列表,在實(shí)際調(diào)用某服務(wù)時,基于負(fù)載均衡算法,選取某一節(jié)點(diǎn)調(diào)用。當(dāng)某服務(wù)節(jié)點(diǎn)宕機(jī)、或網(wǎng)絡(luò)不可用時,Registry基于心跳檢測實(shí)時更新可調(diào)用者列表,并將更新信息推送到Consumer,由Consumer更新本地緩存,實(shí)現(xiàn)容錯,實(shí)現(xiàn)高可用。

4.Dubbo服務(wù)架構(gòu)及調(diào)用流程

Dubbo架構(gòu)圖如下所示:

節(jié)點(diǎn)角色說明:

Provider: 暴露服務(wù)的服務(wù)提供方。

Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。

Registry: 服務(wù)注冊與發(fā)現(xiàn)的注冊中心,可選。

Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心,可選。

Container: 服務(wù)運(yùn)行容器。

調(diào)用流程:

0. 服務(wù)容器負(fù)責(zé)啟動、加載,運(yùn)行Provider。

1. Provider在啟動時,向Registry注冊自己提供的服務(wù),Registry緩存服務(wù)列表,并建立長連接心跳檢測。

2. Consumer在啟動時,向Registry訂閱自己所需的服務(wù),并建立長連接心跳檢測。

3. Registry返回服務(wù)提供者地址列表給Consumer并緩存,如果服務(wù)有變更,Registry將基于長連接推送變更數(shù)據(jù)給Consumer并更新。

4. Consumer在使用服務(wù)時,基于軟負(fù)載均衡算法,從提供者地址列表中,選一臺Provider進(jìn)行調(diào)用,如果調(diào)用失敗,則切換到另一臺調(diào)用。

5. Consumer和Provider,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到Monitor。

5.Dubbo應(yīng)用搭建

Dubbo采用全Spring配置方式,透明化接入應(yīng)用,只需用Spring加載Dubbo的配置即可。

代碼結(jié)構(gòu)

代碼project結(jié)構(gòu)非常簡單,如圖:

其中,

dubbo-api是公共的基礎(chǔ)包,主要聲明provider和consumer共用的服務(wù)接口、工具類、實(shí)體等,以jar包形式提供;

dubbo-provider是服務(wù)提供者,聲明provider需要提供的哪些服務(wù),以war包形式提供;

dubbo-customer是服務(wù)消費(fèi)者,聲明需要使用的服務(wù),以war包形式提供;

dubbo-service是dubbo-api中服務(wù)的實(shí)現(xiàn)者,此包可直接包含在dubbo-provider中,以jar包形式體現(xiàn)。

Dubbo-api

在公共jar包中,定義服務(wù)接口,如下:

dubbo-service

在實(shí)現(xiàn)jar包中,實(shí)現(xiàn)dubbo-api中定義的接口(此實(shí)現(xiàn)對消費(fèi)方式透明的),如下:

dubbo-provider

使用Spring配置聲明對外暴露服務(wù),主要包含:

dubbo-application服務(wù)提供者的名字:標(biāo)記唯一提供者;

dubbo-registry注冊中心地址及其端口:啟動時,向注冊中心注冊服務(wù),此處使用zookeeper;

dubbo-protocol通信協(xié)議及端口:各個終端之間通訊的協(xié)議,使用dubbo協(xié)議;

dubbo-service暴露服務(wù)聲明:需要暴露哪些服務(wù),就聲明哪些dubbo:service的Bean。

dubbo-customer

使用Spring配置,引用遠(yuǎn)程暴露的服務(wù),主要包含:

dubbo-application服務(wù)消費(fèi)者名字:標(biāo)記唯一消費(fèi)者;

dubbo-registry注冊中心地址及其端口:啟動時,向注冊中心訂閱服務(wù),并在本地緩存;

dubbo-reference服務(wù)引用:聲明需要使用的服務(wù)接口名稱,和原生spring聲明bean的方式類似。

配置如下圖:

服務(wù)使用時,像spring式注入JavaBean,類似本地化調(diào)用Service一樣使用,如圖:

dubbo工程搭建總結(jié)

通過上述代碼示例,不難看出dubbo使用其實(shí)非常簡單,通過Spring配置全部搞定。對于消費(fèi)者來說,只需要知道服務(wù)在哪里、服務(wù)名叫什么、有什么方法、入?yún)⑹悄男┘纯桑恍枰纼?nèi)部的實(shí)現(xiàn)細(xì)節(jié)。這種特性完全無API侵入,實(shí)現(xiàn)各部分之間松散耦合,減少依賴。

6.Dubbo的高級特性

除了上述基本功能之外,dubbo具有諸多高級特性,組成了dubbo整套架構(gòu)體系。

多元化注冊中心

注冊中心可以使用zookeeper、redis等作為注冊中心,也可以去中心使用廣播形式。

zookeeper作為注冊中心,內(nèi)部存儲使用了目錄式結(jié)構(gòu),此為推薦;

Redis這樣的K/V式數(shù)據(jù)存儲,內(nèi)部則使用了服務(wù)名作為Key,URL地址作為Value,比如:

另廣播Multicast形式,啟動時廣播自身的地址,無注冊中心,此為測試使用。

集群容錯

上述示例中,只使用了單個zk實(shí)例、單provider、單consumer,實(shí)際生產(chǎn)中還可以配置多個實(shí)例即注冊中心集群、provider集群、consumer集群,相同集群之間是等價的,最終為負(fù)載均衡提供條件。

軟負(fù)載均衡

當(dāng)注冊中心其他實(shí)例宕機(jī),只要有一個可提供服務(wù)則可保證整個應(yīng)用群可正常發(fā)布、訂閱服務(wù);即使全部宕機(jī)只要之前的服務(wù)提供者可正常提供服務(wù),雖不能發(fā)布和訂閱,但是消費(fèi)者任然可以調(diào)用,因?yàn)橄M(fèi)者本地緩存了可調(diào)用列表。

Provider集群各實(shí)例提供了相同的服務(wù),只要有實(shí)例新增或者宕機(jī),基于長連接通訊,每個消費(fèi)者均能感知到并及時更新自身緩存列表。實(shí)時調(diào)整路由群。

Consumer消費(fèi)者對服務(wù)進(jìn)行invoke調(diào)用時,會根據(jù)負(fù)載均衡算法,分發(fā)請求到某個provider實(shí)例,降低各個實(shí)例的負(fù)載。成熟的負(fù)載均衡算法有隨機(jī)、按公約權(quán)重輪詢、最少活躍調(diào)用數(shù)、一致性Hash,使用者可以根據(jù)機(jī)器、網(wǎng)絡(luò)等情況實(shí)時分配和調(diào)整策略,靈活方便。

統(tǒng)一化管理平臺admin

dubbo提供了可視化的管理平臺dubbo-admin,使用者只要下載運(yùn)行應(yīng)用即可。

此平臺提供了豐富的管理功能:

服務(wù)管理:有哪些服務(wù),哪些在使用哪些已停止,對應(yīng)的主機(jī)、端口、權(quán)重是多少,實(shí)時調(diào)整;

應(yīng)用管理:當(dāng)前有哪些應(yīng)用,各自是什么角色,相互調(diào)用關(guān)系是什么,使用的負(fù)載均衡算法是什么等等。

運(yùn)營監(jiān)控中心

此為可選組件,對應(yīng)項(xiàng)目為dubbo-monitor,監(jiān)控SQL執(zhí)行、服務(wù)調(diào)用等統(tǒng)計(jì)信息。和provider、Consumer一樣,通過spring配置的形式,聲明dubbo:monitor角色。在provider和consumer端,聲明monitor地址,并定義AOP切面,收集監(jiān)控信息,并定時向監(jiān)控中心發(fā)送。

7.Dubbo的缺點(diǎn)

上面敘述了種種dubbo的優(yōu)勢,下面說說它的缺點(diǎn)。

體系結(jié)構(gòu)方面

Dubbo要求將功能服務(wù)化,抽象成若干個通用的小的服務(wù),形成分布式結(jié)構(gòu)。因此往往會在最后形成大量的服務(wù),體系會非常龐大,管理起來比較困難。但這跟它帶來的種種有點(diǎn)相比,還是微不足道的。

安全性方面

Dubbo在使用場景方面主要針對內(nèi)部的服務(wù),由內(nèi)部人員進(jìn)行管理,一般很少對外部系統(tǒng)開放。而通常對外的服務(wù),一般建立WebService、Rest等形式的接口,并輔助OAuth等安全協(xié)議來來處理安全。這就造成了,Dubbo在安全方面實(shí)現(xiàn)的功能較少,主要原則是基本上只防君子不防小人。

目前安全性層面,Dubbo通過Token令牌防止用戶繞過注冊中心直連,然后在注冊中心上管理授權(quán)。Dubbo還提供服務(wù)黑白名單,來控制服務(wù)所允許的調(diào)用方。

本文作者:蘭偉敏(點(diǎn)融黑幫),主要從事Java后端開發(fā),愛好電影、旅行、DOTA,目前主要負(fù)責(zé)貸款端LOANAPP系統(tǒng)研發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點(diǎn)是按照分層的方式來架構(gòu),使用這種方式...
    Coselding閱讀 17,459評論 3 196
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • 我說:“我可以稱呼您為致遠(yuǎn)嗎”致遠(yuǎn)說:“當(dāng)然可以!那我就稱呼你為小輝了,現(xiàn)在我們就是兄弟了!”我說:“好,現(xiàn)在...
    dc83c086af76閱讀 242評論 0 0
  • 最近不知怎的,迷上了分享做食物,就如同我喜歡待在廚房是享受做飯的過程一樣,即便沒有知音,依舊改變不了我的初...
    米思辰閱讀 380評論 0 0
  • 努力,會讓你自由,更自由的做一些事情,也讓你更自由的拒絕做一些事情。 努力,會給你資本,讓你有資本去贏的愛,也有資...
    馨之芬芳閱讀 431評論 1 2

友情鏈接更多精彩內(nèi)容