一、工程规划
dubbo-parent 父工程,依赖包管理
dubbo-common 公共工程,工具类
dubbo-api-user 用户服务接口工程,暴露用户服务接口
dubbo-service-user 用户服务工程,接口具体实现
dubbo-consumer 消费者工程,消费用户服务
二、具体实现
- dubbo-parent
工程只有pom文件,添加spring、dubbo、zookeeper等依赖
使用dependencyManagement管理依赖,其他工程继承父工程时只需声明groupId和artifactId,不需添加version。
- dubbo-common(继承dubbo-parent)
编写StringUtil类做测试用
public class StringUtil {
public static String cutString(String str) {
return str.substring(1);
}
}
- dubbo-api-user(继承dubbo-parent,依赖cubbo-common)
编写实体类User,接口IUser
package com.dubbo.entity;
import com.dubbo.util.StringUtil;
public class User {
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
id = "111";
name = StringUtil.cutString("jim");
}
}
package com.dubbo.api;
public interface IUser {
public String getUser(String userId);
}
- dubbo-service-user(继承dubbo-parent,依赖dubbo-api-user)
编写dubbo及bean配置文件spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 配置要扫描的包 -->
<context:component-scan base-package="com.dubbo" />
<!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
<dubbo:application name="dubbo-provider" />
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.dubbo.api.IUser" ref="iUser" protocol="dubbo" />
</beans>
UserService类为具体的服务实现
package com.dubbo.service;
import org.springframework.stereotype.Service;
import com.dubbo.api.IUser;
import com.dubbo.entity.User;
@Service("iUser")
public class UserService implements IUser{
public String getUser(String userId) {
User user = new User();
return user.getName();
}
}
编写Provider用于本地启动dubbo服务
package com.dubbo.test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
private static final Log log = LogFactory.getLog(Provider.class);
public static void main(String[] args) {
try {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-context.xml");
context.start();
} catch (Exception e) {
log.error("== DubboProvider context start error:",e);
}
synchronized (Provider.class) {
while (true) {
try {
Provider.class.wait();
} catch (InterruptedException e) {
log.error("== synchronized error:",e);
}
}
}
}
}
- dubbo-consumer(继承dubbo-parent,依赖dubbo-api-user)
编写spring-context.xml文件配置dubbo服务调用
<?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="dubbo-consumer"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<dubbo:reference id="iUser" interface="com.dubbo.api.IUser"/>
</beans>
Consumer类启动本地消费者,调用User服务
package com.dubbo.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.api.IUser;
public class Consumer {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath:spring-context.xml");
context.start();
System.out.println("consumer start");
while(true) {
IUser iUser = (IUser)context.getBean("iUser");
System.out.println(iUser.getUser("1"));
Thread.sleep(2000);
}
}
}
三、聚合工程
新建maven工程dubbo-package,编写pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jim</groupId>
<artifactId>dubbo-package</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>../dubbo-parent/pom.xml</module>
<module>../dubbo-common/pom.xml</module>
<module>../dubbo-api-user/pom.xml</module>
<module>../dubbo-service-user/pom.xml</module>
<module>../dubbo-consumer/pom.xml</module>
</modules>
</project>
直接对该项目进行mvn clean, mvn package, mvn install可同时作用于所有模块。