一文看懂dubbo配置使用-Dubbo配置方式詳解

原文鏈接:http://www.cnblogs.com/chanshuyi/p/deep_insight_dubbo_config.html

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

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

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

  • XML 配置文件方式
  • properties 配置文件方式
  • annotation 配置方式
  • API 配置方式

這裏我們只介紹前兩種方式的配置。

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

在 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>

創建 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;
    }
}

創建 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);
    }
}

創建 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());
        }
    }
}

到這裏 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 依賴 **************************** -->

創建類 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"));
    }
}

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

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

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

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

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 文件內容如下:

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:service timeout="3000" interface="com.chanshuyi.service.IUserService" ref="userService"/> 
</beans>

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: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 配置方式。

annotation配置方式

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

Provider方配置

將 節點換成 節點:

<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方配置

將 節點換成 節點:

<!-- 掃描註解包路徑,多個包用逗號分隔,不填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() 方法測試。


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