dubbo是阿里巴巴提供的基于spring的使用RPC服务的治理和调度框架
主要功能:
服务发布
服务调用
负载均衡
服务扩容
服务监控
服务管理
dubbo采用了spring配置,它没有api入侵,只需要xml配置即可。
dubbo+zookeeper和zookeeper的区别:
单纯的zookeeper实现远程调用的服务发现需要大量的Java代码,生产者消费者的服务发布和获取,zk通过集合来封装url,并通过随机数的方式来实现负载均衡,dubbo框架很好的解决了这些繁琐的问题,提高了开发效率,更容易上手,简直是新人的福利。前面的文章我专门书写了zk实现服务发现的过程,有兴趣的小伙伴们可以去看一下,dubbo基于zk功能更加强大。
使用步骤
1添加依赖
<dependencies>
<!-- zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.0</version>
</dependency>
2.创建接口,远程调用生产者宝楼给消费者的接口服务,一般该接口作为单独项目实现
3.生产者实现该接口,体现具体功能。
4. 发布服务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 扫描业务对象 -->
<context:component-scan base-package="实现类包"></context:component-scan>
<!-- 给发布的服务起名字 不可重复 -->
<dubbo:application name="red-provider"/>
<!-- 配置服务的注册中心 选择zookeeper -->
<dubbo:registry protocol="zookeeper"
address="zk集群地址+端口" />
<!-- 指定暴露的远程服务的协议,主机,端口 当前服务器,客户端通过这个来访问 -->
<dubbo:protocol name="dubbo" host="生产者主机" port="20882"/>
<!-- 指定需要暴露服务的对应的接口
interface : 指定需要暴露的服务对应的接口,客户端通过这个接口来调用服务,我们必须给他实例化实现类对象,客户才可以调用
ref:指定提供远程服务的实现类对象
-->
<dubbo:service interface="服务接口完全限定名" ref="实现类名首字母小写"/>
</beans>
5.创建启动类发布集群服务
public class ProviderApp {
public static void main(String[] args) throws IOException {
//加载spring容器,发布远程服务
ClassPathXmlApplicationContext
ac=new ClassPathXmlApplicationContext("red-provider.xml");
ac.start(); //启动spring容器
System.out.println("-------发布dubbo服务-------20882");
System.in.read(); //阻塞主线程,主线程停止,服务器就会关闭,客户端连接不上
}
}
6.消费者
1.获取服务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 给发布的服务起名字 -->
<dubbo:application name="red-consumer"/>
<!-- 配置服务的注册中心 -->
<dubbo:registry protocol="zookeeper"
address="zk集群主机+端口" />
<!--
获得远程服务的代理对象
-->
<dubbo:reference id="代理对象" interface="服务接口的完全限定名"/>
加载spring配置文件的时候,dubbo自动连接zk集群,获得interface对应的节点下,providers接下的服务列表,产生代理对象
</beans>
2.创建启动类测试
public class ConsumerApp {
public static void main(String[] args) throws InterruptedException {
/***
* 完成集群服务消费,测试负载均衡
*/
ApplicationContext
ac=new ClassPathXmlApplicationContext("red-consumer.xml");
//获得spring容器的远程代理对象
RedService service=(向下转型) ac.getBean("代理对象");
//调用远程服务
while(true){
String value = service.sendRed(调用服务传参数);
System.out.println(value);
Thread.sleep(3000);
}
}
测试步骤比较简洁,实际开发中根据不同情况合理分配资源。