前言
Dubbo是一個(gè)被國(guó)內(nèi)很多互聯(lián)網(wǎng)公司廣泛使用的開(kāi)源分布式服務(wù)治理框架嬉探,是一個(gè)非常全面的SOA基礎(chǔ)框架颠放,當(dāng)當(dāng)網(wǎng)在Dubbo基礎(chǔ)上新增了一些功能,并將其命名為Dubbox(Dubbo eXtensions)运准。
為什么需要Dubbo娶靡?
以前所有的業(yè)務(wù)處理,都在一個(gè)系統(tǒng)當(dāng)中奈应;
接著痒留,這個(gè)大系統(tǒng)按照業(yè)務(wù)領(lǐng)域劃分為N個(gè)業(yè)務(wù)系統(tǒng);
各個(gè)業(yè)務(wù)系統(tǒng)之間不可避免需要交互听哭,采用什么呢慢洋?HTTP的方式塘雳?WebService?...
我們將面臨很多URL的管理普筹,服務(wù)之間的調(diào)用鏈败明,依賴關(guān)系,服務(wù)的負(fù)載均衡太防、監(jiān)控等等
Dubbo是什么妻顶?
Dubbo本質(zhì)上就是一個(gè)分布式服務(wù)調(diào)用的東西,高性能透明化的RPC調(diào)用方案 + SOA服務(wù)治理方案蜒车。
Dubbo的架構(gòu):
第一讳嘱,Dubbo有一個(gè)注冊(cè)中心Registry的概念,服務(wù)的提供者Provider將服務(wù)注冊(cè)到Registry酿愧,消費(fèi)者Consumer需要從Registry中發(fā)現(xiàn)沥潭、監(jiān)聽(tīng)到服務(wù)的變動(dòng);
第二嬉挡,Provider需要運(yùn)行在Container容器中钝鸽,另外Dubbo提供Monitor來(lái)對(duì)服務(wù)的調(diào)用次數(shù)以及調(diào)用時(shí)間進(jìn)行監(jiān)控。
第三庞钢,常用的Registry有Zookeeper拔恰,Redis等;博主將采用Zookeeper作為注冊(cè)中心基括。(可以參考:《分布式利器Zookeeper(一)》)
OK颜懊,說(shuō)了一些理論,咱們快速開(kāi)始吧阱穗!
QuickStart?
這里我將為大家演示一個(gè)訂單服務(wù)調(diào)用商品服務(wù)的Demo饭冬。
商品服務(wù):ProductService
我們先來(lái)看看商品服務(wù)的工程結(jié)構(gòu):
ProductService工程,下面分為2個(gè)Module:一個(gè)是product-api揪阶,一個(gè)是product-service昌抠。要知道,所謂的發(fā)布服務(wù)鲁僚,就是將接口對(duì)外暴露炊苫,生產(chǎn)者和消費(fèi)者都是需要引用接口的,所以在這里接口將在product-api中提供冰沙。
在product-service模塊中依賴product-api并實(shí)現(xiàn)接口:
注意Product需要實(shí)現(xiàn)序列化Serializable接口侨艾。
從XML中你可以發(fā)現(xiàn),我們需要在product-service模塊中依賴dubbo拓挥、Zookeeper唠梨、Curator。(我這里就不貼XML呢)
每一個(gè)服務(wù)都有一個(gè)Name侥啤,其實(shí)也可以指定Owner当叭。
注冊(cè)中心采用Zookeeper茬故,客戶端采用Curator框架。
Dubbo其實(shí)是支持很多協(xié)議蚁鳖,上述指明了是采用Dubbo協(xié)議磺芭,對(duì)外的服務(wù)端口是20880。
我們需要發(fā)布服務(wù)醉箕,就是向Zookeeper注冊(cè)钾腺,告訴我們對(duì)外提供的接口是什么,以及該接口對(duì)應(yīng)的服務(wù)實(shí)現(xiàn)是什么讥裤。
啟動(dòng)商品服務(wù):
這種啟動(dòng)方式到底做了些什么放棒?從哪里讀取的配置文件?啟動(dòng)又是怎么回事呢坞琴?
我們稍微來(lái)看一看源碼:
看SpringContainer如何啟動(dòng):
OK剧辐,到這里,商品服務(wù)已經(jīng)就緒了邮府!
訂單服務(wù):OrderService
先看依賴:
注意訂單服務(wù)需要依賴product-api荧关。
看dubbo配置:
消費(fèi)者啟動(dòng):
消費(fèi)者運(yùn)行結(jié)果:
看Zookeeper:
在Zookeeper中看得很清楚,接口將以目錄節(jié)點(diǎn)的形式創(chuàng)建仙辟,providers下面就是接口協(xié)議同波,分機(jī)器,分協(xié)議叠国,從而可以實(shí)現(xiàn)負(fù)載均衡未檩!
dubbo-admin管控臺(tái)
如同rocketmq一樣,dubbo也提供給了dubbo-admin.war粟焊,直接部署到Tomcat下冤狡,并修改下dubbo.properties指定好注冊(cè)中心地址即可。
小結(jié)
透明化的遠(yuǎn)程調(diào)用项棠,如同調(diào)用本地方法一樣悲雳,只需要簡(jiǎn)單配置,沒(méi)有任何API侵入香追!
我們可以平滑的增加合瓢、減少機(jī)器,消費(fèi)者能夠動(dòng)態(tài)的查找到服務(wù)提供方透典,使得我們的服務(wù)避免了單點(diǎn)問(wèn)題晴楔,強(qiáng)大的容錯(cuò)機(jī)制以及軟負(fù)載能力(要知道硬件負(fù)載器F5是很貴的)顿苇。
dubbo和Spring結(jié)合緊密,透明化的接入應(yīng)用滥崩!
一些思考
本篇博客不可能將Dubbo全部的特性岖圈、配置都講解完,因此這里提出一些問(wèn)題钙皮,來(lái)和大家一起思考學(xué)習(xí):
1.A服務(wù)依賴B服務(wù)蜂科,如果B服務(wù)沒(méi)有啟動(dòng)或者禁用,A服務(wù)是否能夠啟動(dòng)短条?Dubbo是否會(huì)替我們做服務(wù)依賴調(diào)用檢查呢导匣?
2.我們是否可以繞開(kāi)注冊(cè)中心,直接調(diào)用呢茸时?
3.考慮這樣一種情況贡定,如果A調(diào)用B,出現(xiàn)了網(wǎng)絡(luò)抖動(dòng)可都,調(diào)用異常缓待,這個(gè)時(shí)候dubbo是否會(huì)替我們重試調(diào)用?如果dubbo有重試機(jī)制渠牲,那么是否意味著存在重復(fù)調(diào)用旋炒?如果我們的服務(wù)是一個(gè)對(duì)數(shù)據(jù)庫(kù)的操作,那么這種重試機(jī)制是否會(huì)造成影響或是問(wèn)題签杈?我們應(yīng)該如何處理瘫镇?(好像想起了RocketMQ的一些事情....哈哈)
4.dubbo提供了哪些負(fù)載均衡的機(jī)制?可以具體到每一個(gè)方法么答姥?
5.服務(wù)的調(diào)用铣除,到了Server端,最后肯定是要走線程池進(jìn)行調(diào)用的鹦付,那么我們根據(jù)不同場(chǎng)景可以對(duì)線程池進(jìn)行定制么尚粘?
端午快樂(lè)~~~