本次dubbo搭建的项目,我将其分成三个项目框架
interfaced所有服务端暴露接口的项目
provider服务提供者
consumer服务使用者
首先通过eclipse建立三个maven项目,并将其项目的编译环境以及部分项目改成web项目调整好
结构如下
在interfaced项目的pom文件中,我们只要简单的配置一下单元测试依赖即可依赖即可
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
但是必须加上私服的推送配置,因为其他两个项目对其依赖时,需要的私服环境中下载其jar包
<distributionManagement>
<repository>
<id>interfaced-release</id>
<name>interfaced Project Release</name>
<url>http://192.168.1.222:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>interfaced-snapshots</id>
<name>interfaced Project SNAPSHOTS</name>
<url>http://192.168.1.222:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
顺便说一下setting文件的配置
<servers>
<server>
<id>interfaced-release</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>interfaced-snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
注意setting文件中的id属性值,必须和项目pom文件中的id值保持一致,要不然会发布不上去的
然后我们在interfaced项目中,新增一个简单userservice接口类,并提供一个简单的登录方法
public interface IUserService {
/**
* 测试方法
* @year 2017-10-16
* @author guiwenqing
* @param username
* @param password
* @return
* @return boolean
*
*/
public boolean login(String username,String password);
}
这样,interfaced项目配置完毕
配置provider项目的pom文件
<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>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- **************************** 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-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>
<!-- 直接引入的interfaced依赖 -->
<dependency>
<groupId>com.dubbo.interfaced</groupId>
<artifactId>interfaced</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
建立spring总控配置文件spring-all.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.user.service.impl"/>
<!-- **************************** /注解扫描 **************************** -->
<!-- **************************** 导入其他XML文件 **************************** -->
<import resource="spring-provider.xml"/>
<!-- **************************** /导入其他XML文件 **************************** -->
</beans>
建立dubbo服务提供者配置文件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: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://192.168.1.222:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="28080"/>
<!-- 声明需要暴露的服务接口 -->
<dubbo:service registry="dubbodemo" timeout="3000" interface="com.user.service.IUserService" ref="userServiceImpl"/>
</beans>
注意
application 即应用名称
registry 以id为名称注册到注册中心
protocol 以什么协议暴露什么端口给使用方
service 将哪个服务中的哪个接口暴露出来,其中ref的引用一定要注意,我下面的服务类是以默认类名称为bean名的,不要写错
实现刚刚的userservice接口类
@Service
public class UserServiceImpl implements IUserService {
private Logger logger = Logger.getLogger(UserServiceImpl.class);
public boolean login(String username, String password) {
logger.info("提交信息" + username + password);
if (username != null && password != null && username.equals(password)) {
return true;
}
return false;
}
}
因为dubbo服务项目,官方有配套开启,这里直接利用spring容器启动,使用ClassPathXmlApplicationContext类来加载spring启动
建立基础启动类
public class BeanFactoryUtil {
private static ApplicationContext ctx_producer = null;
public final static String ApplicationContextRoot = "";
public final static String ApplicationContextPath = ApplicationContextRoot + "spring-all.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 class Launcher {
private static Log logger = LogFactory.getLog(Launcher.class);
public static void main(String[] args) {
// 初始化spring
logger.info("开始初始化core服务");
BeanFactoryUtil.init();
}
}
直接用main方法跑该类即可启动dubbo的服务提供项目,服务提供者配置完毕
配置consumer项目pom文件
<!-- **************************** Properties 配置 **************************** -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<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-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.dubbo.interfaced</groupId>
<artifactId>interfaced</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- **************************** /interface 依赖 **************************** -->
</dependencies>
继续配置spring总控文件applicationContext.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>
配置dubbo消费者的spring配置文件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://192.168.1.222:2181"/>
<!-- 消费方用什么协议获取服务(用dubbo协议在20880端口暴露服务) -->
<dubbo:protocol port="28080"/>
<!-- 提供哪些接口给消费者调用 -->
<dubbo:reference id="userService" interface="com.user.service.IUserService"/>
</beans>
application 服务名称
registry 链接到哪个注册中心
protocol 使用哪种协议和端口进行服务获取
reference 使用哪些接口
利用spring容器特性,建立测试类
public class UserServiceConsumer {
private static Logger logger = Logger.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("test", "test"));
}
}
简单的dubbo服务消费配置完毕