dubbo的几种配置方式(转)
昨天刚接触公司dubbo,发现公司中项目里面的spring-dubbo-privider的dubbo中<dubbo:application name=""/>和<dubbo:address .../>等都没有填写,于是纳闷项目是怎么找到对应的配置的呢?当然,启动项目的时候需要在tomcat的vm options里面指定dubbo.properties的地址,但是因为之前使用的都是xml的配置方式,所以不太理解。于是查资料。感觉这文章不错。
原文链接:http://www.cnblogs.com/chanshuyi/p/5144288.html
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
参考资料:
dubbo的几种配置方式(转)的更多相关文章
- Dubbo基础三之配置方式简述
Dubbo基础一之实战初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,体验了两种配置方式一种注解一种xml.其中xml是在注解配置失败没有找到解决方法后选择xml替代体验的.那 ...
- c3p0三种配置方式(automaticTestTable)
c3p0的配置方式分为三种,分别是http://my.oschina.net/lyzg/blog/551331.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文 ...
- tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- 关于nginx upstream的几种配置方式
平时一直依赖硬件来作load blance,最近研究Nginx来做负载设备,记录下upstream的几种配置方式. 第一种:轮询 upstream test{ server 192.168.0 ...
- IIS下PHP的三种配置方式比较
在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...
- 【转】tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- Nginx记录-nginx 负载均衡5种配置方式(转载)
nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成 ...
- nginx 负载均衡5种配置方式
nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...
- STM32 通用定时器的几种配置方式
STM32 通用定时器的几种配置方式 //------------------------------------------------------------------------------ ...
随机推荐
- C#流(stream)
http://www.cnblogs.com/liuxinls/archive/2013/02/15/2912968.html 流用于对IO处理 在System.IO名称空间中有以下类 BinaryR ...
- Can't find kernel text map area from kcore
kernel : 4.9.51kexec-tools : 2.0.4 1.~ # ./kexec -p /boot/vmlinuz --initrd=/boot/initrd --command-li ...
- Spring Batch 介绍
在企业应用的关键环境中,通常有需要很多应用来来处理大量的应用.这商业操作包括了自动化,并且负责的处理程序来对大量数据进行高效的处理,通常这些程序不需要人工进行干预.这些事件包括有基于时间周期产生的操作 ...
- Luffy之登录认证以及JWT
1.用户认证 在前面我们已经完成了,前端登录页面的搭建,以及路由分配,现在我们作关于登录认证部分的东西 Django提供了认证系统.认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做 ...
- 基于spring的web项目启动时预加载数据到ServletContext
1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...
- Mono jexus
Mono:测试环境 linux系统定义:.NET在Linux上使用的开源工程 C#语言的编译器 在Linux上用C#开发程序 jexus:测试环境linux系统Linux系统下部署Jexus应用服务器 ...
- 理解JS中的this的指向
原文地址:https://www.cnblogs.com/pssp/p/5216085.html#1 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到 ...
- java项目中登陆时记住密码
1.在登陆的时候记住密码,不知自动登陆: 2.登陆页面,填写用户名,密码,点击记住密码,下次进入登陆页面的时候,填写同样的用户名,密码自动填充(在不一次会话的情况下也就是说在不关闭浏览器的情况下): ...
- iOS性能优化总结
iOS性能优化总结.关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化.电量优化. 安装包瘦身.启动优化.网络优化等. 关于iOS 性能优化梳理: 基本工具.业务优化.内存 ...
- php-fpm占用cpu和内存过高100% 解决办法
参考网站: https://www.fujieace.com/php/php-fpm.html https://www.fujieace.com/php/pm-max_children-2.html ...