Dubbo

1、系統(tǒng)間通信

無論是soa(面向服務架構)還是分布式架構,每個獨立的業(yè)務之間都需要系統(tǒng)間通信。比如實現(xiàn)商品列表查詢需要兩個系統(tǒng)之間通信。系統(tǒng)之間的遠程通信有幾種方式呢?
1.1、Webservice:效率不高,基于soap協(xié)議。不推薦使用。
1.2、restful:基于http+json。很多項目中使用,但是如果服務太多的話,服務間調用混亂,需要治療。
1.3、dubbo:使用rpc協(xié)議進行遠程調用,直接使用socket通信。傳輸效率高,并且可以統(tǒng)計系統(tǒng)之間的調用關系、調用次數(shù)。

2、什么是dubbo

文檔 http://dubbo.io/User+Guide-zh.htm
dubbo就是資源調度和治理中心的管理工具。
dubbo采用全spring配置方式,透明化接入應用,對應用沒有任何api侵入,只需要spring加載dubbo的配置即可,dubbo基于spring的schema進行擴展。
dubbo擴展了spring schema定義,兩條定義如下:

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

dubbo schema定義了如下對象:

  • ApplicationConfig
  • ModuleConfig
  • RegistryConfig
  • MonitorConfig
  • ProviderConfig
  • ConsumerConfig
  • ProtocolConfig
  • ServiceBean
  • ReferenceBean
  • AnnotationBean

在spring xml文件中按照下面的方式注入dubbo schema中定義的對象:

<dubbo:application name="hello-world-app"  />
<dubbo:registry address="multicast://224.5.6.7:1234" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />
<dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />
<dubbo:annotation package="com.alibaba.dubbo.config.spring.annotation.consumer" />

3、dubbo的架構

  • Provider: 暴露服務的服務提供方
  • Consumer: 調用遠程服務的服務消費方
  • Registry: 服務注冊與發(fā)現(xiàn)的注冊中心(zookeeper)
  • Monitor: 統(tǒng)計服務的調用次數(shù)和調用時間
  • Container: 服務運行容器

4、dubbo的使用

4.1、安裝注冊中心zookeeper
注冊中心負責服務地址的注冊和查找,相當于目錄服務,服務提供者與消費者只在注冊中心啟動與注冊中心交互,注冊中心不轉發(fā)請求。zookeeper是Apache Hadoop的一個子項目,是一個樹形的目錄服務,支持變更推送,所以推薦使用。安裝步驟如下:
1、安裝jdk
2、解壓縮zookeeper包
3、將conf文件夾下zoo_sample.cfg復制一份改名為zoo.cfg
4、修改dataDir屬性,指定一個真實路徑
5、啟動zookeeper:bin/zkServer.sh start
關閉zookeeper:bin/zkServer.sh stop
查看zookeeper狀態(tài):bin/zkServer.sh status

4.2、spring配置及服務發(fā)布與引用

  • 定義服務接口: (該接口需單獨打包,在服務提供方和消費方共享)
  • 在服務提供方實現(xiàn)接口:(對服務消費方隱藏實現(xiàn))
  • 用Spring配置聲明暴露服務
  • 加載提供方Spring配置
  • 通過Spring配置引用遠程服務
  • 加載消費方Spring配置,并調用遠程服務(也可以使用IoC注入)

服務提供方暴露服務:
放在service工程中,例如:taotao-manager-service,taotao-content-service

  • 需要注冊地址。
  • 需要暴露服務端口。端口決定不同的服務,即每個服務的端口是不一樣的。
  • 需要聲明服務接口,關鍵字是dubbo:service ,“interface”是interface工程中定義的服務接口,“ref”是service工程中服務提供方實現(xiàn)的接口。
<!-- 發(fā)布dubbo服務 -->
    <!-- 提供方應用信息,用于計算依賴關系 -->
    <dubbo:application name="taotao-manager" />
    <!-- 注冊中心的地址 -->
    <dubbo:registry protocol="zookeeper" address="192.168.25.167:2181" />
    <!-- 用dubbo協(xié)議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000"/>
    <dubbo:service interface="com.taotao.service.ItemCatService" ref="itemCatServiceImpl" timeout="300000"/>

加載提供方spring配置

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});

context.start();

服務消費方引用服務:
放在web工程中,例如taotao-manager-web,taotao-item-web

  • 需要注冊地址。
  • 需要引用服務接口,關鍵字是dubbo:reference,“interface”是interface工程中定義的服務接口,“id”一般為首字母小寫的對應接口類名稱。
<!-- 引用dubbo服務 -->
    <dubbo:application name="taotao-manager-web"/>
    <dubbo:registry protocol="zookeeper" address="192.168.25.167:2181"/>    
    <dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
    <dubbo:reference interface="com.taotao.service.ItemCatService" id="itemCatService" />
    <dubbo:reference interface="com.taotao.content.service.ContentCategoryService" id="contentCategoryService" />
    <dubbo:reference interface="com.taotao.content.service.ContentService" id="contentService" />
    <dubbo:reference interface="com.taotao.search.service.SearchItemService" id="searchItemService" />

加載消費方spring配置

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "http://10.20.160.198/wiki/display/dubbo/consumer.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // 獲取遠程服務代理
String hello = demoService.sayHello("world"); // 執(zhí)行遠程方法
System.out.println(hello); // 顯示調用結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容