dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,由于工作需要,需要了解它,本文没有对该框架有过多研究,只是简单的入门部署、应用。
源码地址:https://github.com/alibaba/dubbo
这是dubbo的服务架构图,有助于加深我们对服务过程调用的理解
Provider:暴露服务的服务提供方
Consumer: 调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor: 统计服务的调用次调和调用时间的监控中心
Container: 服务运行容器
- 安装ZooKeeper(作为注册中心,当然你也可以选择其他工具实现注册中心这一角色,如multicast)
如果尚未安装,点击 下载后安装,先新建data、log目录,再修改conf文件目录下的zoo.cfg文件。此处我并没有想配置成集群模式,所以这样简单配置一下即可,集群模式参看文章配置
windows环境下点击启动bin目录下的zkServer.cmd,启动成功。
- dubbo服务部署
我定义了两个main方法模拟发布者和消费者,实现发布一个用户服务接口供消费者订阅,代码如下:
User.java
public class User implements Serializable {
private int id;
private String name;
private int age;
private String sex;
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
DemoService.java
public interface DemoService {
String sayHello(String name);
List getUsers();
}
DemoServiceImpl.java
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello---> " + name;
}
public List getUsers() {
List list = new ArrayList();
User u1 = new User();
u1.setName("jack");
u1.setAge(21);
u1.setSex("男");
User u2 = new User();
u2.setName("tom");
u2.setAge(22);
u2.setSex("女");
User u3 = new User();
u3.setName("rose");
u3.setAge(23);
u3.setSex("女");
list.add(u1);
list.add(u2);
list.add(u3);
return list;
}
}
MainProvider.java
/**
* 发布者
*
* Created by smqi on 2016/10/12.
*/
public class MainProvider {
private static final Logger log = LoggerFactory.getLogger(MainProvider.class);
private static AbstractApplicationContext applicationContext = null;
public static void main(String[] args) {
log.info("开始初始化spring-dubbo-provider");
applicationContext = new
ClassPathXmlApplicationContext("classpath:config/spring/spring-dubbo-provider.xml");
try {
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
} catch (IOException e) {
e.printStackTrace();
}
}
}
MainConsumer .java
/**
* 消费者
*
* Created by smqi on 2016/10/12.
*/
public class MainConsumer {
private static final Logger log = LoggerFactory.getLogger(MainProvider.class);
private static AbstractApplicationContext applicationContext = null;
public static void main(String[] args) {
log.info("开始初始化spring-dubbo-consumer");
applicationContext = new
ClassPathXmlApplicationContext("classpath:config/spring/spring-dubbo-consumer.xml");
DemoService demoService = (DemoService) applicationContext.getBean("demoService"); //
String hello = demoService.sayHello("tom"); // ִ
System.out.println(hello); //
//
List list = demoService.getUsers();
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println("大家好,我的名字叫: "+list.get(i));
}
}
// System.out.println(demoService.hehe());
//System.in.read();
}
}
两个配置文件:
spring-dubbo-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
">
<!-- 具体的实现bean -->
<bean id="demoService" class="dubbo.service.impl.DemoServiceImpl" />
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="demo_provider"/>
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="dubbo.service.DemoService" ref="demoService" />
</beans>
spring-dubbo-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"
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="demo_consumer" />
<!-- 使用zookeeper注册中心暴露服务地址,此处zkclient配置不是必须的,只要pom文件加入依赖即可 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient" />
<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference id="demoService"
interface="dubbo.service.DemoService" />
</beans>
- demo测试
先启动发布者的main方法,再启动消费者的main方法,执行结果如下:
针对上述demo有一点可以优化,即接口和接口涉及到的对象,因为我们的接口是对外提供服务的,没有必要每个调用此接口的系统都要编写一套一样的接口和对象如DemoService和user,可以将其剥离出来打入一个jar包,我们姑且取名dubbo-demo-api.jar,然后在各自系统加入依赖即可,下面我按照这个思路进行优化
删除原先定义的接口和对象
然后在我们的工程里引入刚才打好的jar包,并在pom文件加入依赖
重新跑一下,服务调用正常。