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
配置方式;
这里我们只介绍前3种方式的配置。
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.service;
public interface IUserService {
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.service.impl.UserServiceImpl
类,实现IUserService
接口:
package com.service.impl;
import com.service.IUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@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.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.service.impl"/>
<!-- ************ /注解扫描 *********** -->
<!-- ******** 导入其他XML文件 ********* -->
<import resource="spring-provider.xml"/>
<!-- ************* /导入其他XML文件 ********** --></beans>
注意: 这里不要写成 com.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 为dubbodemo的注册中心,地址是本地服务器的2181
端口(这里要与zookeeper
配置文件的clientPort
属性值一致)。protocol
指该应用使用dubbo
协议在28080
端口暴露服务,其他应用可以通过这个接口调用服务。service
用来声明需要暴露的服务接口,这里暴露了IUserService 接口,并将接口注册到 id 为 dubbodemo 的注册中心,它引用了Spring
中名为 userService 的类,超时时间为 3 秒。
到这里 provider
提供者的配置基本上完成,但我们还需要写一个启动类将 provider
启动起来提供服务。
创建com.util.BeanFactoryUtil.java
,是加载 Spring
的工具类:
package com.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.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.Launcher.java
,用于启动 provider
服务,是启动入口:
package com;
import com.util.BeanFactoryUtil;
import com.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
注册中心,启动 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.UserServiceConsumer.java
package com;
import com.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.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"
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>
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:application name="dubbodemo-consumer"/>
<!-- 连接到哪个注册中心(连接到本机的2181端口zookeeper) -->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 消费方用什么协议获取服务(用dubbo协议在20880端口暴露服务) -->
<dubbo:protocol name="dubbo" 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.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>
注意,如果你既配置了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.service.impl" />
其中package
表示要扫描的包。之后在实现类里加上注解 @Service(version = "1.0.0")
:
package com.service.impl;
import com.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" />
其中 package
表示要扫描的包。之后在需要注入的服务里加上注解 @Reference(version="1.0.0")
,修改后的 UserServiceConsumer.java 为:
package com;
import com.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;
@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() 方法测试。
附
- 点赞
- 收藏
- 关注作者
评论(0)