Dubbo是一个开源的分布式服务治理框架,提供高性能和透明化的RPC远程服务调用方案及SOA服务治理方案。不再使用Web Service模式中的WSDL,而是以服务者或消费者的方式在Dubbo上进行注册。Dubbo提供3个主要功能:基于接口的远程调用、容错和负载均衡、自动服务注册和发现。
服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或者删除服务提供者。Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需要Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
Provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次数和调用时间的监控中心
Container:服务运行容器
调用关系说明
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 示例
本地服务Spring配置
local.xml
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<bean id=“xxxAction” class=“com.xxx.XxxAction”>
<property name=“xxxService” ref=“xxxService” />
</bean>
远程服务Spring配置
在本地服务的基础上,只需做简单配置,即可完成远程化:
- 将上面的
local.xml
配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml
,将服务引用部分放在服务消费方remote-consumer.xml
。 - 并在提供方增加暴露服务配置
<dubbo:service>
,在消费方增加引用服务配置<dubbo:reference>
。
remote-provider.xml:
<!-- 和本地服务一样实现远程服务 -->
<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” />
remote-consumer.xml:<!-- 增加引用远程服务配置 -->
<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” />
<!-- 和本地服务一样使用远程服务 -->
<bean id=“xxxAction” class=“com.xxx.XxxAction”>
<property name=“xxxService” ref=“xxxService” />
</bean>
在github下载dubbo,在Eclipse中import这个maven项目
https://github.com/alibaba/dubbo
选中dubbo-admin项目,右键maven--update project
双击dubbo-admin项目中的pom.xml,查看到dubbo的版本号为2.5.8,packaging为war即一个web项目
修改dubbo-admin项目中的WEB-INF目录下的dubbo.properties
选中dubbo-admin项目,右键run as--maven install,在target目录下可以看到新生成的war包
将dubbo-admin-2.5.8.war上传到192.168.0.217 Linux虚拟机的tomcat的webapps下
启动tomcat,查看catalina.out输出的信息,发现无异常
此时,在Windows上的浏览器中输入http://192.168.0.217:8080/dubbo-admin-2.5.8/ ,访问dubbo管控台。
输入用户名root和密码root后,进入管控台界面,如下图。
在Eclipse中打开dubbo-demo-provider项目,修改文件dubbo-demo-provider.xml中注册中心地址为zookeeper集群中相关机器。
<dubbo:registry address="zookeeper://192.168.0.217:2181?backup=192.168.0.218:2181,192.168.0.219:2181"/>
DemoServiceImpl.java
package com.alibaba.dubbo.demo.provider;
import com.alibaba.dubbo.demo.DemoService;
import com.alibaba.dubbo.rpc.RpcContext;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
}
}
选中dubbo-demo-provider项目中的Provider.java,右键run as --java application
package com.alibaba.dubbo.demo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
//Prevent to get IPV6 address,this way only work in debug mode
//But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not
System.setProperty("java.net.preferIPv4Stack", "true");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});
context.start();
System.in.read(); // press any key to exit
}
}
此时,在浏览器中查看dubbo控制台内容
在Eclipse中打开dubbo-demo-consumer项目,修改文件dubbo-demo-consumer.xml中注册中心地址为zookeeper集群中相关机器。
<dubbo:registry address="zookeeper://192.168.0.217:2181?backup=192.168.0.218:2181,192.168.0.219:2181"/>
选中dubbo-demo-consumer项目中的Consumer.java,右键run as --java application
package com.alibaba.dubbo.demo.consumer;
import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Consumer {
public static void main(String[] args) {
//Prevent to get IPV6 address,this way only work in debug mode
//But you can pass use -Djava.net.preferIPv4Stack=true,then it work well whether in debug mode or not
System.setProperty("java.net.preferIPv4Stack", "true");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
while (true) {
try {
Thread.sleep(1000);
String hello = demoService.sayHello("world"); // call remote method
System.out.println(hello); // get result
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
}
此时,在Consumer对应的console中,显示内容如下:
同时,在Provider对应的console中,显示内容如下:
其中,192.168.0.107为运行dubbo-demo-consumer与dubbo-demo-provider所在windows机器的ip地址
此时,在dubbo-admin管控台查看消费者信息