基于Dubbo的分布式系統(tǒng)實(shí)現(xiàn)

體系架構(gòu)

Dubbo是一個(gè)非常輕量級(jí)的分布式RPC框架脉课,它使用Spring進(jìn)行配置综看,而非注入式的編程方式,深受大家的喜愛苦银。粗淺的研究了一下其應(yīng)用,并使用Web容器(Jetty)實(shí)現(xiàn)了一個(gè)基于Dubbo的分布式系統(tǒng)杂彭,提供多種服務(wù)墓毒,并可以在多個(gè)服務(wù)源中進(jìn)行切換。這個(gè)Demo系統(tǒng)的參與者包括

  • 服務(wù)的消費(fèi)者(Consumer)可以是多種形式亲怠,這里采用war包的方式放到Jetty服務(wù)器中所计。后臺(tái)由Spring容器進(jìn)行管理,以獲得服務(wù)的句柄团秽;前臺(tái)為了簡便主胧,使用最基本的Servlet來展現(xiàn)獲取的服務(wù)內(nèi)容叭首;
  • 服務(wù)的提供者(Provider)同樣可以采用多種形式,這里也同樣采用war包方式放到Jetty服務(wù)器中踪栋,并由Spring容器進(jìn)行管理焙格。系統(tǒng)可以有多個(gè)Provider,這就需要多個(gè)Jetty環(huán)境夷都,并在注冊(cè)中心注冊(cè)眷唉;
  • 服務(wù)注冊(cè)中心(Registry)用于管理所有的服務(wù),Consumer和Provider都需要在配置中指明注冊(cè)中心地址囤官。Registry可以使用Redis和Zookeeper實(shí)現(xiàn)冬阳,本Demo使用后者。
  • Dubbo實(shí)現(xiàn)的監(jiān)控中心(Monitor)和服務(wù)治理程序(Admin)用于監(jiān)控系統(tǒng)的使用情況和性能党饮,同時(shí)在多個(gè)提供者的情況下肝陪,提供服務(wù)治理功能,例如權(quán)重刑顺,生效/失效設(shè)置等氯窍。

下圖描述了整個(gè)體系架構(gòu)。

繪圖1.jpg

API的定義

API是Java接口定義的約定Consumer和Provider都可以使用的函數(shù)列表蹲堂。Consumer通過API了解Service能夠提供的服務(wù)狼讨;Provider提供服務(wù)的實(shí)現(xiàn)。其中

  • Service.java只是一個(gè)空接口贯城,所有的服務(wù)都繼承自這個(gè)接口熊楼。
    public interface Service { }
  • DateService.java提供一個(gè)關(guān)于日期的服務(wù),調(diào)用后返回一個(gè)當(dāng)前的日期能犯。
    public interface DateService extends Service { public DateServiceResult getCurrentDate(); }
  • MathService.java提供一個(gè)關(guān)于數(shù)字的服務(wù),調(diào)用后返回一個(gè)排序的數(shù)組(相對(duì)于參數(shù))犬耻。
    public interface MathService extends Service { public NumberServiceResult sort(int[] numbers); }
  • StringService.java提供一個(gè)關(guān)于字符串的服務(wù)踩晶,調(diào)用后返回一個(gè)翻轉(zhuǎn)的字符串(相對(duì)于參數(shù))。
    public interface StringService extends Service { public StringServiceResult reverse(String str); }

API作為一個(gè)獨(dú)立的枕磁,純的Java的jar包發(fā)布給Consumer使用渡蜻。

服務(wù)的消費(fèi)者

為了簡單起見,這里只將服務(wù)的Consumer作為基本的Servlet來處理计济。如果Servlet可以走通茸苇,應(yīng)用到JSP,或是JSF環(huán)境中都水到渠成沦寂。Consumer中最重要的是獲取服務(wù)的句柄学密,因?yàn)橛捎谟蠥PI的存在,在靜態(tài)編程中传藏,是很簡單的腻暮,且沒有技術(shù)難度彤守。獲取句柄的代碼在init方法中,如下所示

@Override public void init() throws ServletException { super.init(); ServletContext servletContext = this.getServletContext(); WebApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(servletContext); dateService = (DateService) ctx.getBean("dateService"); }

顯而易見哭靖,我們通過Spring容器獲得真實(shí)的對(duì)象(由Provider實(shí)現(xiàn))具垫,并從對(duì)象的調(diào)用結(jié)果中獲取我們需要的內(nèi)容。

服務(wù)的提供者

服務(wù)的Provider是比較簡單的试幽,只需要實(shí)現(xiàn)API所定義的方法即可筝蚕,這里就不列舉了。但為了將這個(gè)實(shí)現(xiàn)加載到Dubbo的系統(tǒng)中铺坞,也需要Spring容器饰及,并打成War包發(fā)布到Jetty中。

Spring容器的配置

web.xml

web.xml的配置對(duì)于Consumer和Provider都是一樣的康震,即定義Spring容器燎含,如下所示
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param>

作為Consumer,還要定義Servlet的映射腿短,不再贅述屏箍。

Consumer

<dubbo:application name="dubbo-evaluation-consumer" /> <dubbo:registry address="zookeeper://10.16.2.46:2181" /> <dubbo:monitor protocol="registry" /> <dubbo:reference id="stringService" interface="com.synnex.dubboevaluation.service.StringService" /> <dubbo:reference id="mathService" interface="com.synnex.dubboevaluation.service.MathService" /> <dubbo:reference id="dateService" interface="com.synnex.dubboevaluation.service.DateService" />
對(duì)于Consumer,比較重要的是

  • 使用 dubbo:registry 聲明注冊(cè)中心橘忱;
  • 使用 dubbo:reference 聲明接口赴魁。
Provider

<dubbo:application name="dubbo-evaluation-provider" /> <dubbo:registry address="zookeeper://10.16.2.46:2181" /> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:monitor protocol="registry"/> <dubbo:service interface="com.synnex.dubboevaluation.service.StringService" ref="stringService" /> <bean id="stringService" class="com.synnex.dubboevaluation.service.StringServiceImpl" /> <dubbo:service interface="com.synnex.dubboevaluation.service.MathService" ref="mathService" /> <bean id="mathService" class="com.synnex.dubboevaluation.service.MathServiceImpl" /> <dubbo:service interface="com.synnex.dubboevaluation.service.DateService" ref="dateService" /> <bean id="dateService" class="com.synnex.dubboevaluation.service.DateServiceImpl" />
對(duì)于Provider,比較重要的是

  • 使用 dubbo:registry 聲明注冊(cè)中心钝诚;
  • 使用 dubbo:service 聲明服務(wù)颖御;
  • 使用 bean id="xxxService" 聲明服務(wù)的實(shí)現(xiàn)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凝颇,一起剝皮案震驚了整個(gè)濱河市潘拱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拧略,老刑警劉巖芦岂,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垫蛆,居然都是意外死亡禽最,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門袱饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川无,“玉大人,你說我怎么就攤上這事虑乖∨城鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵决左,是天一觀的道長愕够。 經(jīng)常有香客問我走贪,道長,這世上最難降的妖魔是什么惑芭? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任坠狡,我火速辦了婚禮,結(jié)果婚禮上遂跟,老公的妹妹穿的比我還像新娘逃沿。我一直安慰自己,他們只是感情好幻锁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布凯亮。 她就那樣靜靜地躺著,像睡著了一般哄尔。 火紅的嫁衣襯著肌膚如雪假消。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天岭接,我揣著相機(jī)與錄音富拗,去河邊找鬼。 笑死鸣戴,一個(gè)胖子當(dāng)著我的面吹牛啃沪,可吹牛的內(nèi)容都是我干的悠汽。 我是一名探鬼主播奏属,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼皆串!你這毒婦竟也來了入偷?” 一聲冷哼從身側(cè)響起追驴,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盯串,沒想到半個(gè)月后氯檐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡体捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糯崎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几缭。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沃呢,靈堂內(nèi)的尸體忽然破棺而出年栓,到底是詐尸還是另有隱情,我是刑警寧澤薄霜,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布某抓,位于F島的核電站纸兔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏否副。R本人自食惡果不足惜汉矿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望备禀。 院中可真熱鬧洲拇,春花似錦、人聲如沸曲尸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽另患。三九已至纽乱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昆箕,已是汗流浹背鸦列。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留为严,地道東北人敛熬。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像第股,于是被迫代替她去往敵國和親应民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理夕吻,服務(wù)發(fā)現(xiàn)诲锹,斷路器,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • Dubbo是什么 Dubbo是Alibaba開源的分布式服務(wù)框架涉馅,它最大的特點(diǎn)是按照分層的方式來架構(gòu)归园,使用這種方式...
    Coselding閱讀 17,218評(píng)論 3 196
  • 0 準(zhǔn)備 安裝注冊(cè)中心:Zookeeper、Dubbox自帶的dubbo-registry-simple稚矿;安裝Du...
    七寸知架構(gòu)閱讀 13,991評(píng)論 0 88
  • 我把日子過成了單調(diào)的循環(huán) 連走路也成了千篇一律的模仿 聽過幾個(gè)領(lǐng)導(dǎo)的發(fā)言 各種各樣的音色吐出同樣干癟的文字 連稀稀...
    何畢ne閱讀 261評(píng)論 0 0
  • iOS中什么是國際化庸诱? 根據(jù)系統(tǒng)不同的語言環(huán)境顯示相應(yīng)的語言內(nèi)容。 iOS中如何為工程添加國際化功能 comman...
    RogerHXJ閱讀 278評(píng)論 0 0