Dubbo|注解/API/XML三種使用方式

使用Springboot+Zookeeper演示Dubbo的三種使用方式锭汛,官網(wǎng)有簡單的介紹和示例做裙,這里實戰(zhàn)一番加深理解。

1.準(zhǔn)備工作

1.1安裝Zookeeper

Zookeeper(3.5.6版本)以單機形式在linux上安裝聋迎,并通過命令開啟服務(wù)嫌褪。
開啟zk服務(wù):zkServer.sh start

開啟zk服務(wù)

查看zk服務(wù):zkServer.sh status
查看zk服務(wù)

備注:Zookeeper在Linux上的安裝可自行百度,這里不做過多介紹祈搜。不過注意较店,若啟動過程發(fā)生“org.apache.zookeeper.server.quorum.QuorumPeerMain”異常且zk版本為3.5.5以上,請下載帶有“-bin”的安裝包容燕,因為普通的tar.gz包只有源碼而沒有編譯梁呈。

1.2生成Springboot項目

利用IDEA自帶的“Spring Initializr”生成Springboot項目,填寫Group和Artifact信息蘸秘,點擊next直到finish官卡。【提前配置JDK和Maven】


idea生成springboot

此時會自動生成一個Springboot項目醋虏。找到項目自動生成的類xxxxApplication和Main方法寻咒,能啟動則表明基礎(chǔ)Springboot項目構(gòu)建完成。
下面基于該項目分別展示Dubbo的三種用法颈嚼。

2 基于XML使用Dubbo

2.1服務(wù)提供者

第一步:在工程“test-xml-provider”的pom.xml文件中引入dubbo和zkClient的jar包毛秘。

<!-- 整合dubbo -->
<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
</dependency>

<!-- zookeeper客戶端 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.7</version>
</dependency>

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

注意maven-plugin插件需要配置configuration屬性,springboot工程在maven打包時就不會生成boot-inf文件阻课。

第二步:服務(wù)提供者需要提供服務(wù)接口和實現(xiàn)熔脂。
服務(wù)接口:

package com.starry.testxmlprovider.service;

public interface TestDubbo {
    String getStr();
}

服務(wù)接口實現(xiàn):

package com.starry.testxmlprovider.service.impl;

import com.starry.testxmlprovider.service.TestDubbo;

public class TestDubboImpl implements TestDubbo {

    @Override
    public String getStr() {
        return "hello world...test xml provider";
    }
}

第三步:通過XML文件暴露并注冊服務(wù)。
新建provider.xml文件柑肴;并增加如下內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--定義了提供方應(yīng)用信息,用于計算依賴關(guān)系旬薯;在 dubbo-admin 或 dubbo-monitor 會顯示這個名字晰骑,方便辨識-->
    <dubbo:application name="test-xml-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注冊中心暴露服務(wù),注意要先開啟 zookeeper-->
    <dubbo:registry address="zookeeper://10.19.50.225:2181"/>
    <!-- 用dubbo協(xié)議在20890端口暴露服務(wù) -->
    <dubbo:protocol name="dubbo" port="20890" />
    <!--使用 dubbo 協(xié)議實現(xiàn)定義好的 api.TestDubbo 接口-->
    <dubbo:service interface="com.starry.testxmlprovider.service.TestDubbo" ref="dubboService" protocol="dubbo" />
    <!--具體實現(xiàn)該接口的 bean-->
    <bean id="dubboService" class="com.starry.testxmlprovider.service.impl.TestDubboImpl"/>
</beans>

該配置文件的目的就是暴露服務(wù)并注冊服務(wù)到zk上绊序。此處簡單演示使用硕舆,至于原理后續(xù)再詳細(xì)解說。

注意:配置文件的頭部http://code.alibabatech.com/schema/dubbo地址已經(jīng)不可用骤公,需要手動維護抚官。先下載dubbo.xsd,然后通過下圖指定映射關(guān)系阶捆。

指定映射關(guān)系

此時項目的整體目錄結(jié)構(gòu)為:


目錄結(jié)構(gòu)

在啟動類TestXmlProviderApplication中初始化provider.xml配置文件:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start();

第四步:查看服務(wù)是否注冊成功凌节。
登錄服務(wù)器進(jìn)入zk钦听,通過命令查看zookeeper上是否注冊服務(wù)。
命令直接到zk的bin目錄倍奢,利用命令./zkCli.sh –server ip:port連接客戶端朴上,然后通過命令ls /dubbo查看zk上注冊的服務(wù):

zk服務(wù)

圖上表明服務(wù)已經(jīng)注冊到zk上。

2.2服務(wù)調(diào)用者

第一步:根據(jù)1.2節(jié)生成工程“test-xml-consumer”卒煞,并在pom.xml文件新增依賴包痪宰。

<!-- 整合dubbo -->
<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
</dependency>

<!-- zookeeper客戶端 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.7</version>
</dependency>

<!-- test-xml-provider -->
<dependency>
    <groupId>test-xml</groupId>
    <artifactId>test-xml-provider</artifactId>
    <version>0.0.1</version>
</dependency>

相比服務(wù)提供者,除了dubbo和zkClient包外畔裕,還需要依賴provider的jar包衣撬。(jar包須手動上傳至本地倉庫

第二步:新增consumer.xml配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="test-xml-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 訂閱 provider 的地址扮饶,由 zookeeper 定時推送-->
    <dubbo:registry address="zookeeper://10.19.50.225:2181"/>
    <!--使用 dubbo 協(xié)議調(diào)用定義好的 api.PermissionService 接口-->
    <dubbo:reference id="dubboService" interface="com.starry.testxmlprovider.service.TestDubbo"/>
</beans>

用于連接zk具练,并且生成服務(wù)對象。

第三步:啟動類TestXmlConsumerApplication內(nèi)加載consumer.xml文件贴届,獲取服務(wù)對象并調(diào)用其方法靠粪。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
TestDubbo test = context.getBean(TestDubbo.class);
System.out.println(test.getStr());

啟動springboot項目,可以看到打印出方法返回的內(nèi)容毫蚓。(注意占键,在啟動過程中很可能會報8080端口被占用;這是因為服務(wù)提供者和服務(wù)消費者在一臺機器上啟動元潘,所需只需要在application.properties文件中配置端口為其他即可)

3基于API使用Dubbo

3.1 服務(wù)提供者

第一步:利用1.2節(jié)生成工程“test-api-provider”畔乙,在pom.xml文件內(nèi)增加dubbo和zkClient的依賴,并且新建服務(wù)接口和服務(wù)實現(xiàn)翩概。(同上)

第二步:通過API的方式暴露并注冊服務(wù)牲距,因此通過編碼的方式代替provider.xml文件的配置。
新增加類MyConfig.class:

@Configuration
public class MyConifg {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("test-api-provider");
        System.out.println("application init...");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("10.19.50.225");
        registryConfig.setPort(2181);
        registryConfig.setProtocol("zookeeper");
        registryConfig.setCheck(false);
        return registryConfig;
    }

    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20890);
        return protocolConfig;
    }

    @Bean
    public ServiceConfig<TestDubbo> serviceConfig() {
        ServiceConfig<TestDubbo> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(TestDubbo.class);
        serviceConfig.setRef(new TestDubboImpl());
        serviceConfig.setApplication(applicationConfig());
        serviceConfig.setProtocol(protocolConfig());
        serviceConfig.setRegistry(registryConfig());
    
        // 方法屬性
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getStr");
        methodConfig.setTimeout(3000);
        methodConfig.setRetries(3);
    
        List<MethodConfig> list = new ArrayList<>();
        list.add(methodConfig);
    
        serviceConfig.setMethods(list);
        serviceConfig.export();  // 服務(wù)暴露
        return serviceConfig;
    }

}

注意在MyConifg類上添加注解@Configuration钥庇,把類當(dāng)做一個容器牍鞠;@Bean修飾的方法返回的對象注入容器。

第三步:登錄服務(wù)器评姨,查看服務(wù)是否注冊成功难述。

查看服務(wù)注冊

3.2 服務(wù)消費者

第一步:根據(jù)1.2節(jié)生成工程“test-api-consumer”,在pom.xml文件增加dubbo和zkClient的依賴吐句,同時添加“test-api-provider”架包的依賴胁后。(架包提前通過maven命令上傳至本地倉庫)。

第二步:通過api的方式代替xml文件的形式調(diào)用服務(wù)嗦枢。
增加MyConfig.class

@Configuration
public class MyConfig {

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("test-api-consumer");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("10.19.50.225:2181");
        registryConfig.setProtocol("zookeeper");
        return registryConfig;
    }

    @Bean
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(10000);
        consumerConfig.setCheck(false);
        return consumerConfig;
    }

    @Bean
    public ReferenceConfig<TestDubbo> referenceConfig() {
        ReferenceConfig<TestDubbo> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(TestDubbo.class);
        referenceConfig.setApplication(applicationConfig());
        referenceConfig.setRegistry(registryConfig());
        TestDubbo testDubbo = referenceConfig.get();  // 調(diào)用服務(wù)
        System.out.println(testDubbo.getStr());
        return referenceConfig;
    }
}

控制臺打印方法返回的內(nèi)容即表明遠(yuǎn)程調(diào)用成功攀芯。

API方式實現(xiàn)Dubbo的使用比較易懂,直接以對象的形式注冊服務(wù)和調(diào)用服務(wù)文虏,也是XML和注解的底層實現(xiàn)形式侣诺。

4基于注解和YML使用Dubbo

4.1 服務(wù)生產(chǎn)者

第一步:根據(jù)1.2小節(jié)生成工程“test-yml-provider”殖演,在pom.xml文件內(nèi)增加dubbo和zkClient架包的依賴。

第二步:在服務(wù)提供端新增服務(wù)接口和服務(wù)實現(xiàn)類紧武,接口同上剃氧,注意下面的服務(wù)實現(xiàn)類:

import com.alibaba.dubbo.config.annotation.Service;
import com.starry.testymlprovider.service.TestDubbo;

@Service(version = "1.0.0", timeout = 3000, retries = 3)
public class TestDubboImpl implements TestDubbo {
    @Override
    public String getStr() {
        return "hello world... test yml provider";
    }
}

服務(wù)實現(xiàn)類增加注解@Service以及注解相關(guān)元素,該注解為dubbo包中提供的注解阻星,與Spring框架的@Service有很大區(qū)別朋鞍。它的主要作用是作為一個服務(wù)注冊到zk上,具體注冊過程后續(xù)分析妥箕。

第三步:通過.properties或者.yml格式的配置文件代替xml文件或者api方式連接ZK滥酥,下面分別是.yml格式的配置文件和.properties格式的配置文件。

server:
  port: 8080
spring:
  dubbo:
    application:
      name: test-yml-provider
    registry:
      address: zookeeper://10.19.50.225
      port: 2181
    protocol:
      name: dubbo
      port: 20890
    scan: com.starry.testymlprovider.service.impl

注意:yml格式的文件對空格要求比較嚴(yán)格畦幢,注意縮進(jìn)空格坎吻。

server.port=8080
spring.dubbo.application.name= test-yml-provider
spring.dubbo.registry.address= zookeeper://10.19.50.225
spring.dubbo.registry.port= 2181
spring.dubbo.protocol.name= dubbo
spring.dubbo.protocol.port= 20890
spring.dubbo.scan=com.starry.testymlprovider.service.impl

第四步:登錄服務(wù)器查看服務(wù)是否注冊成功。

查看服務(wù)

4.2 服務(wù)消費者

第一步:根據(jù)1.2小節(jié)生成工程“test-yml-consumer”宇葱,在pom.xml文件增加dubbo和zkClient的依賴瘦真,并添加“test-yml-provider”工程的架包(提前通過maven命令上傳至本地倉庫)。

<dependency>
    <groupId>test-yml</groupId>
    <artifactId>test-yml-provider</artifactId>
    <version>0.0.1</version>
</dependency>

第二步:通過.yml格式的配置文件連接zk黍瞧。

server:
  port: 8081
spring:
  dubbo:
    application:
      name: test-yml-consumer
    registry:
      address: zookeeper://10.19.50.225
      port: 2181
    scan: com.starry.testymlconsumer

scan指向使用服務(wù)的package.

第三步:新建Client類诸尽,通過web驗證調(diào)用成功。

@RestController
public class Client {

    @Reference(version = "1.0.0", timeout = 3000, retries = 3)
    private TestDubbo testDubbo;

    @RequestMapping("/hello")
    public String doThing(){
        return testDubbo.getStr();
    }
}

@Reference注解是dubbo架包提供訪問服務(wù)的方式印颤。具體原理后續(xù)再詳細(xì)分析您机。

5.總結(jié)

Dubbo提供三種使用方式,方便我們根據(jù)不同場景選擇合適的方式年局。Dubbo使用的關(guān)鍵在于服務(wù)如何注冊到Zookeeper际看,以及服務(wù)如何調(diào)用;三種不同的方式表明Dubbo團隊在底層實現(xiàn)了三種邏輯矢否,具體注冊原理和調(diào)用原理下一篇接著分析仲闽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僵朗,隨后出現(xiàn)的幾起案子赖欣,更是在濱河造成了極大的恐慌,老刑警劉巖衣迷,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酱酬,居然都是意外死亡壶谒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門膳沽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汗菜,“玉大人让禀,你說我怎么就攤上這事≡山纾” “怎么了巡揍?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菌瘪。 經(jīng)常有香客問我腮敌,道長,這世上最難降的妖魔是什么俏扩? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任糜工,我火速辦了婚禮,結(jié)果婚禮上录淡,老公的妹妹穿的比我還像新娘捌木。我一直安慰自己,他們只是感情好嫉戚,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布刨裆。 她就那樣靜靜地躺著,像睡著了一般彬檀。 火紅的嫁衣襯著肌膚如雪帆啃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天凤覆,我揣著相機與錄音链瓦,去河邊找鬼。 笑死盯桦,一個胖子當(dāng)著我的面吹牛慈俯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拥峦,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贴膘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了略号?” 一聲冷哼從身側(cè)響起刑峡,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玄柠,沒想到半個月后突梦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡羽利,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年宫患,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片这弧。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡娃闲,死狀恐怖虚汛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情皇帮,我是刑警寧澤卷哩,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站属拾,受9級特大地震影響将谊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捌年,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一瓢娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧礼预,春花似錦眠砾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至励堡,卻和暖如春谷丸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背应结。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工刨疼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹅龄。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓揩慕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扮休。 傳聞我的和親對象是個殘疾皇子迎卤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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