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

使用Springboot+Zookeeper演示Dubbo的三種使用方式,官網有簡單的介紹和示例,這裏實戰一番加深理解。

1.準備工作

1.1安裝Zookeeper

Zookeeper(3.5.6版本)以單機形式在linux上安裝,並通過命令開啓服務。
開啓zk服務:zkServer.sh start
開啓zk服務
查看zk服務:zkServer.sh status
查看zk服務
備註:Zookeeper在Linux上的安裝可自行百度,這裏不做過多介紹。不過注意,若啓動過程發生“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方法,能啓動則表明基礎Springboot項目構建完成。
下面基於該項目分別展示Dubbo的三種用法。

2 基於XML使用Dubbo

2.1服務提供者

第一步:在工程“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文件。

第二步:服務提供者需要提供服務接口和實現。
服務接口:

package com.starry.testxmlprovider.service;

public interface TestDubbo {
    String getStr();
}

服務接口實現:

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文件暴露並註冊服務。
新建provider.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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識-->
    <dubbo:application name="test-xml-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 註冊中心暴露服務,注意要先開啓 zookeeper-->
    <dubbo:registry address="zookeeper://10.19.50.225:2181"/>
    <!-- 用dubbo協議在20890端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20890" />
    <!--使用 dubbo 協議實現定義好的 api.TestDubbo 接口-->
    <dubbo:service interface="com.starry.testxmlprovider.service.TestDubbo" ref="dubboService" protocol="dubbo" />
    <!--具體實現該接口的 bean-->
    <bean id="dubboService" class="com.starry.testxmlprovider.service.impl.TestDubboImpl"/>
</beans>

該配置文件的目的就是暴露服務並註冊服務到zk上。此處簡單演示使用,至於原理後續再詳細解說。

注意:配置文件的頭部http://code.alibabatech.com/schema/dubbo地址已經不可用,需要手動維護。先下載dubbo.xsd,然後通過下圖指定映射關係。
指定映射關係

此時項目的整體目錄結構爲:
目錄結構

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

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

第四步:查看服務是否註冊成功。
登錄服務器進入zk,通過命令查看zookeeper上是否註冊服務。
命令直接到zk的bin目錄,利用命令./zkCli.sh –server ip:port連接客戶端,然後通過命令ls /dubbo查看zk上註冊的服務:
zk服務
圖上表明服務已經註冊到zk上。

2.2服務調用者

第一步:根據1.2節生成工程“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>

相比服務提供者,除了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 協議調用定義好的 api.PermissionService 接口-->
    <dubbo:reference id="dubboService" interface="com.starry.testxmlprovider.service.TestDubbo"/>
</beans>

用於連接zk,並且生成服務對象。

第三步:啓動類TestXmlConsumerApplication內加載consumer.xml文件,獲取服務對象並調用其方法。

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

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

3基於API使用Dubbo

3.1 服務提供者

第一步:利用1.2節生成工程“test-api-provider”,在pom.xml文件內增加dubbo和zkClient的依賴,並且新建服務接口和服務實現。(同上)

第二步:通過API的方式暴露並註冊服務,因此通過編碼的方式代替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();  // 服務暴露
	    return serviceConfig;
	}

}

注意在MyConifg類上添加註解@Configuration,把類當做一個容器;@Bean修飾的方法返回的對象注入容器。

第三步:登錄服務器,查看服務是否註冊成功。
查看服務註冊

3.2 服務消費者

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

第二步:通過api的方式代替xml文件的形式調用服務。
增加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();  // 調用服務
        System.out.println(testDubbo.getStr());
        return referenceConfig;
    }
}

控制檯打印方法返回的內容即表明遠程調用成功。

API方式實現Dubbo的使用比較易懂,直接以對象的形式註冊服務和調用服務,也是XML和註解的底層實現形式。

4基於註解和YML使用Dubbo

4.1 服務生產者

第一步:根據1.2小節生成工程“test-yml-provider”,在pom.xml文件內增加dubbo和zkClient架包的依賴。

第二步:在服務提供端新增服務接口和服務實現類,接口同上,注意下面的服務實現類:

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";
    }
}

服務實現類增加註解@Service以及註解相關元素,該註解爲dubbo包中提供的註解,與Spring框架的@Service有很大區別。它的主要作用是作爲一個服務註冊到zk上,具體註冊過程後續分析。

第三步:通過.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格式的文件對空格要求比較嚴格,注意縮進空格。

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

第四步:登錄服務器查看服務是否註冊成功。
查看服務

4.2 服務消費者

第一步:根據1.2小節生成工程“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指向使用服務的package.

第三步:新建Client類,通過web驗證調用成功。

@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架包提供訪問服務的方式。具體原理後續再詳細分析。

5.總結

Dubbo提供三種使用方式,方便我們根據不同場景選擇合適的方式。Dubbo使用的關鍵在於服務如何註冊到Zookeeper,以及服務如何調用;三種不同的方式表明Dubbo團隊在底層實現了三種邏輯,具體註冊原理和調用原理下一篇接着分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章