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 用来声明一个注册中心,这里声明了一个本地端口号为 2181 的zookeeper 注册中心,id 为 registry。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,用于启动服务:

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 注册中心,启动 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-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 个配置,其他消费者就可以找到对应服务。

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 官方配置参考手册

时间: 2024-10-12 12:06:38

DUBBO配置方式详解的相关文章

[转载,感觉写的非常详细]DUBBO配置方式详解

[转载,感觉写的非常详细]DUBBO配置方式详解 原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html DUBBO 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Sp

OSChina 技术周刊第二十二期 —— DUBBO 配置规则详解

每周技术抢先看,总有你想要的! 移动开发 [翻译]为你的 Android 应用增加本地搜索功能 前端开发 [软件]AngularJS 的剪贴板扩展 ngClip [软件]国际化和本地化 JavaScript 库 Globalize [资讯]为网站开发准备的 30 个惊艳的 jQuery 插件 服务端开发/管理 [翻译]一年之后重新审视 Docker -- 根本性缺陷和炒作 [翻译]单线程 1KB 的 Redis 写操作有 84% 都是耗费在内核上 [翻译]使用 HAProxy 基于 HTTP 头

DUBBO配置规则详解

DUBBO配置规则详解 欢迎加入DUBBO交流群:259566260 研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它,那么如何更好的使用呢?就需要知道DUBBO的各个配置项,以及它可以通过哪些途径进行配置.个人对配置的理解,就好比时对动物的驯服,如何很好的驯服一头猛兽,那就需要知道它各种习性,从而调整,已达到自己期望的结果.这篇不对DUBBO有哪

数据库连接池两种配置方式详解

数据库连接池:   负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏:数据库连接池原理:   连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象.使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用.而连接的建立.断开都由

Spring事务Transaction配置的五种注入方式详解

Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ??? 总结如下: ??? Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. ???DataSou

使用HeartBeat实现高可用HA的配置过程详解

使用HeartBeat实现高可用HA的配置过程详解 一.写在前面 HA即(high available)高可用,又被叫做双机热备,用于关键性业务.简单理解就是,有2台机器 A 和 B,正常是 A 提供服务,B 待命闲置,当 A 宕机或服务宕掉,会切换至B机器继续提供服务.常见的实现高可用的开源软件有 heartbeat 和 keepalived. 这样,一台 web 服务器一天24小时提供web服务,难免会存在 web 服务挂掉或服务器宕机宕机的情况,那么用户就访问不了服务了,这当然不是我们期望

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

CentOS7下Firewall防火墙配置用法详解

官方文档地址: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html#sec-Introduction_to_firewalld1 修改防火墙配置文件之前,需要对之前防火墙做好备份 重启防火墙后,需要确认防火墙状态和防火墙规则是否加载,若重启失败或规则加载失败,则所有请求都会被防火墙拦截 1 2 3 4 5 6 7

jquery的uploadify插件多文件上传配置参数详解

最近做了个多文件上传,需要限制上传文件类型的例子.以前没做过找了一些资料,下次有用.同时也给大家做参考. uploader: uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后淡出打开文件对话框,默认值:uploadify.swf. script: 后台处理程序的相对路径 .默认值:uploadify.php checkScript:用来判断上传选择的文 件在服务器是否存在的后台处理程序的相对路径 fileDataName:设置一个名字,在服务器处理