文章首發於【博客園-陳樹義】,點擊跳轉到原文《Dubbo配置方式詳解》
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 節點。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: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
