Dubbo配置方式詳解


為了更好的閱讀體驗,請點擊這里跳轉到最新的文章:《Dubbo配置方式詳解》

 

Dubbo 是一個分布式服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案,是阿里巴巴 SOA 服務化治理方案的核心框架,每天為 2,000+ 個服務提供 3,000,000,000+ 次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。

Dubbo 采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。

根據 DUBBO 官方文檔,配置 DUBBO 有 4 種方式,分別是:

    • 1. XML 配置文件方式
    • 2. properties 配置文件方式
    • 3. annotation 配置方式
    • 4. API 配置方式
    • 這里我們只介紹前兩種方式的配置。

1、XML 配置文件方式

創建 DubboDemo 項目,並創建 interface 模塊、provider 模塊、consumer 模塊,它們都是 DubboDemo 的子模塊。其中 interface 模塊存放所有的接口、provider 模塊提供服務、consumer 消費服務。創建完成后的項目結構如下:

在 DubboDemo 模塊 pom.xml 加入如下依賴,為所有模塊提供 JUnit 和 LOG4J 依賴。

<!-- **************************** Properties 配置 **************************** -->
    <properties>
        <junit.version>3.8.1</junit.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

  <dependencies>
      <!-- **************************** JUnit 依賴 **************************** -->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
          <scope>test</scope>
      </dependency>
      <!-- **************************** /JUnit 依賴 **************************** -->

      <!-- **************************** 日志 依賴 **************************** -->
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.6</version>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.6</version>
      </dependency>
      <!-- **************************** /日志 依賴 **************************** -->
  </dependencies>

同時在 provider 模塊和 consumer 模塊的 resources 目錄里加入 log4j.properties 配置文件:

#Console Log
log4j.rootLogger=info, console, file

# Write to Console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n

#Write to File
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=${catalina.home}log/provider.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%5p %d{MM-dd HH:mm:ss}(%F:%L): %m%n
log4j.properties

在 interface 模塊中創建接口 com.chanshuyi.service.IUserService:

package com.chanshuyi.service;

/**
 * Created by chanshuyi on 2016/1/19.
 */
public interface IUserService {

    /**
     * 登錄方法
     * @return 是否登錄成功
     */
    public boolean login(String username, String password);
}
IUserService.java

interface 模塊配置完畢。

在 provider 模塊中引入 Spring、Dubbo、interface 模塊依賴:

<!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 添加Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--添加spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commonsLogging.version}</version>
        </dependency>
        <!--添加aspectjweaver包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- **************************** /Spring 依賴 **************************** -->

        <!-- **************************** Dubbo 依賴 **************************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- **************************** /Dubbo 依賴 **************************** -->

        <!-- **************************** interface 依賴 **************************** -->
        <dependency>
            <groupId>com.chanshuyi.DubboDemo</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- **************************** /interface 依賴 **************************** -->
    </dependencies>
pom.xml

創建 com.chanshuyi.service.impl.UserServiceImpl 類,實現 IUserService 接口:

package com.chanshuyi.service.impl;

import com.chanshuyi.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * Created by chanshuyi on 2016/1/19.
 */
@Service("userService")
public class UserServiceImpl implements IUserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Override
    public boolean login(String username, String password) {
        logger.info("用戶登錄:[username:{}, password:{}]", username, password);
        if (username != null && password != null && username.equals(password)) {
            logger.info("用戶校驗通過。[username:{}]", username);
            return true;
        }
        logger.info("用戶校驗失敗![username:{}]", username);
        return false;
    }
}

創建 Spring 配置文件,配置注解掃描 com.chanshuyi.service.impl 包,並引入 spring-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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- **************************** 注解掃描 **************************** -->
<context:component-scan base-package="com.chanshuyi.service.impl"/>
<!-- **************************** /注解掃描 **************************** -->

<!-- **************************** 導入其他XML文件 **************************** -->
<import resource="spring-provider.xml"/>
<!-- **************************** /導入其他XML文件 **************************** -->
</beans>

注意!這里不要寫成 com.chanshuyi.service.impl.*  否則無法成功掃描!

創建 spring-provider.xml 文件,它是 dubbo 的主要配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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="dubbodemo-provider"/>
    <!-- 連接到哪個本地注冊中心 -->
    <dubbo:registry id="dubbodemo" address="zookeeper://localhost:2181"/>
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="28080"/>
    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service registry="dubbodemo" timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/>
</beans>

可以看到這里有幾個關鍵參數:application、registry、protocol、service。

    • application 指當前應用名稱,主要用來給 zookeeper 注冊中心計算應用間依賴關系。
    • registry 用來聲明一個注冊中心,這里聲明了一個id 為 registry 的注冊中心,地址是本地服務器的 2181 端口(這里要與 zookeeper 配置文件的 clientPort 屬性值一致)。
    • protocol 指該應用用 dubbo 協議在 28080 端口暴露服務,其他應用可以通過這個接口調用服務。
    • service 用來聲明需要暴露的服務接口,這里暴露了IUserService 接口,並將接口注冊到 id 為 dubbodemo 的注冊中心,它引用了 Spring 中名為 userService 的類,超時時間為 3 秒。

到這里 provider 提供者的配置基本上完成,但我們還需要寫一個啟動類將 provider 啟動起來提供服務。

創建 com.chanshuyi.util.BeanFactoryUtil.java,是加載 Spring 的工具類:

package com.chanshuyi.util;

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

public class BeanFactoryUtil {
    private static ApplicationContext ctx_producer = null;

    public final static String ApplicationContextRoot = "";
    public final static String ApplicationContextPath = ApplicationContextRoot + "applicationContext.xml";

    public static void init() {
        if (ctx_producer == null) {
            synchronized (BeanFactoryUtil.class) {
                if(ctx_producer == null){
                    String[] configLocations = new String[]{ApplicationContextPath};
                    ctx_producer = new ClassPathXmlApplicationContext(configLocations);
                }
            }
        }
    }

    public static ApplicationContext getContext() {
        init();
        return ctx_producer;
    }
}
BeanFactoryUtil.java

創建 com.chanshuyi.util.SystemDetails.java,用於輸出系統信息:

package com.chanshuyi.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class SystemDetails {
    /**
     * 輸出系統基本信息
     */
    public static void outputDetails() {
        timeZone();
        currentTime();
        os();
    }

    /**
     * 輸出系統時區
     */
    private static void timeZone() {
        Calendar cal = Calendar.getInstance();
        TimeZone timeZone = cal.getTimeZone();
        System.out.println("系統時區:" + timeZone.getDisplayName());
    }

    /**
     * 輸出系統時間
     */
    private static void currentTime() {
        String fromFormat = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat format = new SimpleDateFormat(fromFormat);
        Date myDate = new Date();
        System.out.println("系統時間:" + format.format(myDate));
    }

    /**
     * 輸出系統基本配置
     */
    private static void os() {
        String osName = System.getProperty("os.name"); //操作系統名稱
        System.out.println("當前系統:" + osName);
        String osArch = System.getProperty("os.arch"); //操作系統構架
        System.out.println("當前系統架構" + osArch);
        String osVersion = System.getProperty("os.version"); //操作系統版本
        System.out.println("當前系統版本:" + osVersion);
    }
}
SystemDetails.java

創建 com.chanshuyi.Launcher.java,用於啟動 provider 服務,是啟動入口:

package com.chanshuyi;

import com.chanshuyi.util.BeanFactoryUtil;
import com.chanshuyi.util.SystemDetails;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Launcher {

    private static Log logger = LogFactory.getLog(Launcher.class);

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("=======================");
        System.out.println("        Core包啟動          ");
        SystemDetails.outputDetails();
        System.out.println("=======================");

        getLocalip();
        // 初始化spring
        logger.info("開始初始化core服務");
        BeanFactoryUtil.init();

        try{
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 取得本機ip地址 注意:Spring RmiServiceExporter取得本機ip的方法:InetAddress.getLocalHost()
     */
    private static void getLocalip() {
        try {
            System.out.println("服務暴露的ip: "
                    + java.net.InetAddress.getLocalHost().getHostAddress());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
Launcher.java

到這里 provider 模塊配置結束。我們運行 Launcher.main() 方法啟動服務,並打開 zookeeper 注冊中心(點擊這里下載,雙擊 bin/zkServer.cmd 運行即可),啟動 provider 服務。

接下來我們編寫 consumer 代碼。

在 consumer 的 pom.xml 中導入 Spring、dubbo、interface 模塊依賴

<!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 添加Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--添加spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 添加spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commonsLogging.version}</version>
        </dependency>
        <!--添加aspectjweaver包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- **************************** /Spring 依賴 **************************** -->

        <!-- **************************** Dubbo 依賴 **************************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- **************************** /Dubbo 依賴 **************************** -->

        <!-- **************************** interface 依賴 **************************** -->
        <dependency>
            <groupId>com.chanshuyi.DubboDemo</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- **************************** /interface 依賴 **************************** -->
pom.xml

創建類 com.chanshuyi.UserServiceConsumer.java 

package com.chanshuyi;

import com.chanshuyi.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by Administrator on 2016/1/19.
 */
public class UserServiceConsumer {

    private static Logger logger = LoggerFactory.getLogger(UserServiceConsumer.class);

    public static void main(String args[]) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        IUserService userService = (IUserService) ctx.getBean("userService");
        logger.info("執行結果:" + userService.login("hello", "hello"));
    }
}
UserServiceConsumer.java

配置 applicationContext.xml 文件以及 spring-consumer.java 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">

    <!-- **************************** 導入其他XML文件 **************************** -->
    <import resource="spring-consumer.xml"/>
    <!-- **************************** /導入其他XML文件 **************************** -->
</beans>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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="dubbodemo-consumer"/>
    <!-- 連接到哪個注冊中心(連接到本機的2181端口zookeeper) -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 消費方用什么協議獲取服務(用dubbo協議在20880端口暴露服務) -->
    <dubbo:protocol port="28080"/>
    <!-- 提供哪些接口給消費者調用 -->
    <dubbo:reference id="userService" interface="com.chanshuyi.service.IUserService"/>
</beans>
spring-consumer.xml

spring-consumer.xml 的配置大致與 spring-provider.xml 相同,只是 dubbo:service 節點換成 dubbo:reference 節點。<dubbo:reference> 節點表示引用一個服務,其中 id 表示該服務的唯一標識,可以用該 id 實現 IOC 注入,interface 表示引用的服務接口。

到這里 consumer 模塊配置基本結束。我們運行 UserServiceConsumer.main() 方法調用 provider 服務(provider 服務要開啟哦),成功之后會打印出是否調用成功。

如果這樣就表示成功調用了。可以看到 DUBBO 框架是在 Spring 的基礎上加上一個簡單的配置文件即可把一個服務暴露出去。

DUBBO 配置文件基本有 application、registry、protocol 3個公共參數分別告訴了 DUBBO 以及 zookeeper 注冊中心:我是誰?我向誰注冊?怎么調用我的服務?  通過這 3 個配置,其他消費者就可以找到對應服務。  

2、properties 配置文件方式

DUBBO 在讀取配置的時候會先讀取 XML文件中的配置,如果沒找到就會默認去讀取resources目錄下的 dubbo.properties 文件。而 dubbo.properties 的配置方式與 XML配置方式一樣,只不過是換了種寫法而已。要換成 dubbo.properties 配置,你只需把 spring-provider.xml 里關於 application、registry、protocol 里的配置注釋掉,然后加上對應的 dubbo.properties 文件即可。上面例子的 spring-provider.xml 換成 properties 文件的寫法是這樣的:

# 應用名
dubbo.application.name=dubbodemo-provider
# 注冊中心地址
dubbo.registry.address=zookeeper://localhost:2181
# 調用協議地址
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080

spring-consumer.xml 換成 properties 文件寫法是這樣的:

# 應用名
dubbo.application.name = dubbodemo-consumer
# 注冊中心地址
dubbo.registry.address = zookeeper://localhost:2181
# 調用協議地址
dubbo.protocol.name = dubbo
dubbo.protocol.port = 28080

此時 spring-provider.xml 和 spring-consumer.xml 文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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:service timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/> 
</beans>
spring-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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:reference id="userService" interface="com.chanshuyi.service.IUserService"/>
</beans>
spring-consumer.xml

注意,如果你即配置了 XML 又配置了 properties 的內容,那么 DUBBO 讀取時將直接讀取 XML 中的配置,忽略 properties 里的配置。

一般情況下 properties 都是用來配置一些公共的信息,比如可能一個應用需要調用多個注冊中心的服務,這時候它們的 application.name、dubbo.protocol.name等都是相同的,那么你可以用 properties 來配置這些公共信息。其他情況,還是建議用 XML 配置方式。

3、annotation 配置方式

annotation 配置方式其實是在 XML 配置方式上,將暴露服務和調用服務與 Spring 深度結合起來。

Provider 方配置

將 <dubbo:service>  節點換成 <dubbo:annotation> 節點:

<dubbo:annotation package="com.chanshuyi.service.impl" />

其中 package 表示要掃描的包。之后在實現類里加上注解 @Service(version = "1.0.0") :

package com.chanshuyi.service.impl;

import com.chanshuyi.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;

@Service(version = "1.0.0")
public class UserServiceImpl implements IUserService {

    @Override
    public boolean login(String username, String password) {
        ……
    }
}

注意這里用的 @Service 注解是 alibaba.dubbo 中的 Service 注解。

Consumer 方配置

將 <dubbo:reference>  節點換成 <dubbo:annotation> 節點:

<!-- 掃描注解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->
<dubbo:annotation package="com.chanshuyi" />    

其中 package 表示要掃描的包。之后在需要注入的服務里加上注解 @Reference(version="1.0.0"),修改后的 UserServiceConsumer.java 為:

package com.chanshuyi;

import com.chanshuyi.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;

/**
 * Created by chanshuyi on 2016/1/19.
 */
@Component
public class UserServiceConsumer {

    private static Logger logger = LoggerFactory.getLogger(UserServiceConsumer.class);

    @Reference(version="1.0.0")
    static IUserService userService;

    public static void main(String args[]) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        logger.info("執行結果:" + userService.login("hello", "hello"));
    }
}

之后啟動 provider服務,運行 UserServiceConsumer.main() 方法測試。

 

本文項目文件鏈接:http://pan.baidu.com/s/1kTYOtKV 密碼:d4cu

 

參考資料:

1. http://dubbo.io/

2. DUBBO 官方配置參考手冊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM