為了更好的閱讀體驗,請點擊這里跳轉到最新的文章:《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
在 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);
}
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 節點。<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>

<?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>
注意,如果你即配置了 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
參考資料: