java分布式服務(wù)框架Dubbo的介紹與使用

1. Dubbo是什么赤炒?

Dubbo是一個(gè)分布式服務(wù)框架蟹略,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案缓淹,以及SOA服務(wù)治理方案哈打。簡(jiǎn)單的說,dubbo就是個(gè)服務(wù)框架讯壶,如果沒有分布式的需求料仗,其實(shí)是不需要用的,只有在分布式的時(shí)候伏蚊,才有dubbo這樣的分布式服務(wù)框架的需求立轧,并且本質(zhì)上是個(gè)服務(wù)調(diào)用的東東,說白了就是個(gè)遠(yuǎn)程服務(wù)調(diào)用的分布式框架(告別Web Service模式中的WSdl躏吊,以服務(wù)者與消費(fèi)者的方式在dubbo上注冊(cè))
其核心部分包含:
1. 遠(yuǎn)程通訊: 提供對(duì)多種基于長連接的NIO框架抽象封裝氛改,包括多種線程模型,序列化比伏,以及“請(qǐng)求-響應(yīng)”模式的信息交換方式胜卤。
2. 集群容錯(cuò): 提供基于接口方法的透明遠(yuǎn)程過程調(diào)用,包括多協(xié)議支持赁项,以及軟負(fù)載均衡葛躏,失敗容錯(cuò),地址路由肤舞,動(dòng)態(tài)配置等集群支持紫新。
3. 自動(dòng)發(fā)現(xiàn): 基于注冊(cè)中心目錄服務(wù),使服務(wù)消費(fèi)方能動(dòng)態(tài)的查找服務(wù)提供方李剖,使地址透明,使服務(wù)提供方可以平滑增加或減少機(jī)器囤耳。

2. Dubbo能做什么篙顺?

1.透明化的遠(yuǎn)程方法調(diào)用偶芍,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,只需簡(jiǎn)單配置德玫,沒有任何API侵入匪蟀。
2.軟負(fù)載均衡及容錯(cuò)機(jī)制,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器宰僧,降低成本材彪,減少單點(diǎn)。
3. 服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn)琴儿,不再需要寫死服務(wù)提供方地址段化,注冊(cè)中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者造成。

Dubbo采用全Spring配置方式显熏,透明化接入應(yīng)用,對(duì)應(yīng)用沒有任何API侵入晒屎,只需用Spring加載Dubbo的配置即可喘蟆,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載。

3. dubbo的架構(gòu)

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

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

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

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

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

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

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

這點(diǎn)我覺得非常好,角色分明绵跷,可以根據(jù)每個(gè)節(jié)點(diǎn)角色的狀態(tài)來確定該服務(wù)是否正常膘螟。

調(diào)用關(guān)系說明:

0 服務(wù)容器負(fù)責(zé)啟動(dòng),加載碾局,運(yùn)行服務(wù)提供者荆残。

1. 服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)净当。

2. 服務(wù)消費(fèi)者在啟動(dòng)時(shí)内斯,向注冊(cè)中心訂閱自己所需的服務(wù)。

3. 注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者像啼,如果有變更俘闯,注冊(cè)中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。

4. 服務(wù)消費(fèi)者忽冻,從提供者地址列表中真朗,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用僧诚,如果調(diào)用失敗遮婶,再選另一臺(tái)調(diào)用蝗碎。

5. 服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間旗扑,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心蹦骑。

dubbo的容錯(cuò)性顯而易見,性能方面還沒有還得及測(cè)臀防,我們系統(tǒng)某頁面需要掉5次接口眠菇,本來想建議做個(gè)緩存,但業(yè)務(wù)關(guān)系不能采納袱衷,還需要研究下dubbo的性能調(diào)優(yōu)問題...

4. dubbo使用方法捎废。

Dubbo采用全Spring配置方式,透明化接入應(yīng)用祟昭,對(duì)應(yīng)用沒有任何API侵入缕坎,只需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴(kuò)展進(jìn)行加載篡悟。如果不想使用Spring配置谜叹,而希望通過API的方式進(jìn)行調(diào)用(不推薦)

下面我們就來看看spring配置方式的寫法:

服務(wù)提供者:

  1. 下載zookeeper注冊(cè)中心,下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下載后解壓即可搬葬,進(jìn)入D:\apach-zookeeper-3.4.5\bin荷腊,

雙擊zkServer.cmd啟動(dòng)注冊(cè)中心服務(wù)。

2. 定義服務(wù)接口: (該接口需單獨(dú)打包急凰,在服務(wù)提供方和消費(fèi)方共享)

下面這個(gè)例子不錯(cuò)女仰,寫的很詳細(xì)可以做個(gè)model.

1.  package com.unj.dubbotest.provider;  

3.  import java.util.List;  

5.  public interface DemoService {  

7.  String sayHello(String name);  

9.  public List getUsers();  

11.  }  

在服務(wù)提供方實(shí)現(xiàn)接口:(對(duì)服務(wù)消費(fèi)方隱藏實(shí)現(xiàn))

1.  package com.unj.dubbotest.provider;  

3.  import java.util.ArrayList;  
4.  import java.util.LinkedList;  
5.  import java.util.List;  

8.  public class DemoServiceImpl implements DemoService{  

10.  public String sayHello(String name) {  
11.  return "Hello " + name;  
12.  }  
13.  public List getUsers() {  
14.  List list = new ArrayList();  
15.  User u1 = new User();  
16.  u1.setName("jack");  
17.  u1.setAge(20);  
18.  u1.setSex("男");  

20.  User u2 = new User();  
21.  u2.setName("tom");  
22.  u2.setAge(21);  
23.  u2.setSex("女");  

25.  User u3 = new User();  
26.  u3.setName("rose");  
27.  u3.setAge(19);  
28.  u3.setSex("女");  

30.  list.add(u1);  
31.  list.add(u2);  
32.  list.add(u3);  
33.  return list;  
34.  }  
35.  }  

用Spring配置聲明暴露服務(wù):

1.  <?xml version="1.0" encoding="UTF-8"?>  
2.  <beans xmlns="http://www.springframework.org/schema/beans"  
3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
4.  xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
5.  xsi:schemaLocation="http://www.springframework.org/schema/beans  
6.  http://www.springframework.org/schema/beans/spring-beans.xsd  
7.  http://code.alibabatech.com/schema/dubbo  
8.  http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
9.  ">  

11.  <!-- 具體的實(shí)現(xiàn)bean -->  
12.  <bean id="demoService" class="com.unj.dubbotest.provider.DemoServiceImpl" />  

14.  <!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 -->  
15.  <dubbo:application name="xixi_provider"  />  

17.  <!-- 使用multicast廣播注冊(cè)中心暴露服務(wù)地址   
18.  <dubbo:registry address="multicast://224.5.6.7:1234" />-->  

20.  <!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址 -->  
21.  <dubbo:registry address="zookeeper://127.0.0.1:2181" />   

23.  <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->  
24.  <dubbo:protocol name="dubbo" port="20880" />  

26.  <!-- 聲明需要暴露的服務(wù)接口 -->  
27.  <dubbo:service interface="com.unj.dubbotest.provider.DemoService" ref="demoService" />  

29.  </beans>  

加載Spring配置抡锈,啟動(dòng)服務(wù):

1.  package com.unj.dubbotest.provider;  

3.  import org.springframework.context.support.ClassPathXmlApplicationContext;  

5.  public class Provider {  

7.  public static void main(String[] args) throws Exception {  
8.  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});  
9.  context.start();  

11.  System.in.read(); // 為保證服務(wù)一直開著疾忍,利用輸入流的阻塞來模擬  
12.  }  

14.  }  

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

** applicationContext-dubbo.xml 中注冊(cè)自己需要調(diào)用的接口,我剛開始測(cè)試的時(shí)候需要的接口很多床三,所以把這個(gè)文件寫的滿滿的一罩,后來熟悉了把接口按業(yè)務(wù)類型分開,寫了N多個(gè)** applicationContext-dubbo-***.xml 簡(jiǎn)練多了 》撇簿。 ****

1.通過Spring配置引用遠(yuǎn)程服務(wù):

1.  <?xml version="1.0" encoding="UTF-8"?>  
2.  <beans xmlns="http://www.springframework.org/schema/beans"  
3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
4.  xsi:schemaLocation="http://www.springframework.org/schema/beans  
5.  http://www.springframework.org/schema/beans/spring-beans.xsd  
6.  http://code.alibabatech.com/schema/dubbo  
7.  http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
8.  ">  

10.  <!-- 消費(fèi)方應(yīng)用名聂渊,用于計(jì)算依賴關(guān)系,不是匹配條件四瘫,不要與提供方一樣 -->  
11.  <dubbo:application name="hehe_consumer" />  

13.  <!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址 -->  
14.  <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
15.  <dubbo:registry address="zookeeper://127.0.0.1:2181" />  

17.  <!-- 生成遠(yuǎn)程服務(wù)代理汉嗽,可以像使用本地bean一樣使用demoService -->  
18.  <dubbo:reference id="demoService"  
19.  interface="com.unj.dubbotest.provider.DemoService" />  

21.  </beans>  

2.加載Spring配置,并調(diào)用遠(yuǎn)程服務(wù):

1.  package com.alibaba.dubbo.demo.pp;  

3.  import java.util.List;  

5.  import org.springframework.context.support.ClassPathXmlApplicationContext;  

7.  import com.unj.dubbotest.provider.DemoService;  

9.  public class Consumer {  

11.  public static void main(String[] args) throws Exception {  
12.  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
13.  new String[] { "applicationContext.xml" });  
14.  context.start();  

16.  DemoService demoService = (DemoService) context.getBean("demoService"); //  
17.  String hello = demoService.sayHello("tom"); // ?  
18.  System.out.println(hello); //   

20.  //   
21.  List list = demoService.getUsers();  
22.  if (list != null && list.size() > 0) {  
23.  for (int i = 0; i < list.size(); i++) {  
24.  System.out.println(list.get(i));  
25.  }  
26.  }  
27.  // System.out.println(demoService.hehe());  
28.  System.in.read();  
29.  }  

31.  }  

調(diào)用結(jié)果為:

dubbo管理頁面:

這個(gè)管理頁面還需要部署一個(gè)環(huán)境的找蜜,一開始我還以為是dubbo自帶的饼暑,找了半天沒有找到....

應(yīng)用頁面:

提供者頁面:

消費(fèi)者頁面:

服務(wù)頁面:

測(cè)試是否成功,我覺得只要看看狀態(tài)是否正常,就ok了 ....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撵孤,一起剝皮案震驚了整個(gè)濱河市迈着,隨后出現(xiàn)的幾起案子竭望,更是在濱河造成了極大的恐慌邪码,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咬清,死亡現(xiàn)場(chǎng)離奇詭異闭专,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旧烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門影钉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掘剪,你說我怎么就攤上這事平委。” “怎么了夺谁?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵廉赔,是天一觀的道長。 經(jīng)常有香客問我匾鸥,道長蜡塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任勿负,我火速辦了婚禮馏艾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奴愉。我一直安慰自己琅摩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布锭硼。 她就那樣靜靜地躺著房资,像睡著了一般。 火紅的嫁衣襯著肌膚如雪账忘。 梳的紋絲不亂的頭發(fā)上志膀,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音鳖擒,去河邊找鬼溉浙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒋荚,可吹牛的內(nèi)容都是我干的戳稽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惊奇!你這毒婦竟也來了互躬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤颂郎,失蹤者是張志新(化名)和其女友劉穎吼渡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乓序,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寺酪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了替劈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寄雀。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陨献,靈堂內(nèi)的尸體忽然破棺而出盒犹,到底是詐尸還是另有隱情,我是刑警寧澤眨业,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布急膀,位于F島的核電站,受9級(jí)特大地震影響坛猪,放射性物質(zhì)發(fā)生泄漏脖阵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一墅茉、第九天 我趴在偏房一處隱蔽的房頂上張望命黔。 院中可真熱鬧,春花似錦就斤、人聲如沸悍募。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坠宴。三九已至,卻和暖如春绷旗,著一層夾襖步出監(jiān)牢的瞬間喜鼓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工衔肢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庄岖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓角骤,卻偏偏與公主長得像隅忿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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