Dubbo是什么?java
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,若是没有分布式的需求,实际上是不须要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,而且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)算法
其核心部分包含:spring
1. 远程通信: 提供对多种基于长链接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。apache
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。缓存
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方能够平滑增长或减小机器。性能优化
Dubbo能作什么?架构
1.透明化的远程方法调用,就像调用本地方法同样调用远程方法,只需简单配置,没有任何API侵入。并发
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,下降成本,减小单点。app
3. 服务自动注册与发现,再也不须要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,而且可以平滑添加或删除服务提供者。负载均衡
Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置便可,Dubbo基于Spring的Schema扩展进行加载。
以前使用Web Service,我想测试接口能够经过模拟消息的方式经过soapui或LR进行功能测试或性能测试。但如今使用Dubbo,接口之间不能直接交互,我尝试经过模拟消费者地址测试,结果不堪入目,再而使用jmeter经过junit进行测试,但仍是须要往dubbo上去注册,若是再不给提供源代码的前提下,这个测试用例很差写啊....
dubbo的架构
dubbo架构图以下所示:
节点角色说明:
Provider:暴露服务的服务提供方。
Consumer:调用远程服务的服务消费方。
Registry:服务注册与发现的注册中心。
Monitor:统计服务的调用次调和调用时间的监控中心。
Container:服务运行容器。
这点我以为很是好,角色分明,能够根据每一个节点角色的状态来肯定该服务是否正常。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册本身提供的服务。
2. 服务消费者在启动时,向注册中心订阅本身所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
dubbo的容错性显而易见,性能方面尚未还得及测,咱们系统某页面须要掉5次接口,原本想建议作个缓存,但业务关系不能采纳,还须要研究下dubbo的性能调优问题...
dubbo使用方法
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置便可,Dubbo基于Spring的Schema扩展进行加载。若是不想使用Spring配置,而但愿经过API的方式进行调用(不推荐)
下面咱们就来看看spring配置方式的写法:
服务提供者:
1.下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/下载后解压便可,进入D:\apach-zookeeper-3.4.5\bin,
双击zkServer.cmd启动注册中心服务。
2.定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
下面这个例子不错,写的很详细能够作个model
packagecom.unj.dubbotest.provider; importjava.util.List; publicinterfaceDemoService{ StringsayHello(Stringname); publicListgetUsers(); }
在服务提供方实现接口:(对服务消费方隐藏实现)
packagecom.unj.dubbotest.provider; importjava.util.ArrayList; importjava.util.LinkedList; importjava.util.List; publicclassDemoServiceImplimplementsDemoService{ publicStringsayHello(Stringname){ return"Hello"+name; } publicListgetUsers(){ Listlist=newArrayList(); Useru1=newUser(); u1.setName("jack"); u1.setAge(20); u1.setSex("男"); Useru2=newUser(); u2.setName("tom"); u2.setAge(21); u2.setSex("女"); Useru3=newUser(); u3.setName("rose"); u3.setAge(19); u3.setSex("女"); list.add(u1); list.add(u2); list.add(u3); returnlist; } }
加载Spring配置,启动服务:用Spring配置声明暴露服务:
<xmlversion="1.0"encoding="UTF-8"> <beansxmlns="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--> <beanid="demoService"class="com.unj.dubbotest.provider. DemoServiceImpl"/> <!--提供方应用信息,用于计算依赖关系--> <dubbo:applicationname="xixi_provider"/> <!--使用multicast广播注册中心暴露服务地址 <dubbo:registryaddress="multicast://224.5.6.7:1234"/>--> <!--使用zookeeper注册中心暴露服务地址--> <dubbo:registryaddress="zookeeper://127.0.0.1:2181"/> <!--用dubbo协议在20880端口暴露服务--> <dubbo:protocolname="dubbo"port="20880"/> <!--声明须要暴露的服务接口--> <dubbo:serviceinterface="com.unj.dubbotest. provider.DemoService"ref="demoService"/> </beans>
加载Spring配置,启动服务:
packagecom.unj.dubbotest.provider; importorg.springframework.context.support. ClassPathXmlApplicationContext; publicclassProvider{ publicstaticvoidmain(String[]args)throwsException{ ClassPathXmlApplicationContextcontext= newClassPathXmlApplicationContext(newString[]{"applicationContext.xml"}); context.start(); System.in.read();//为保证服务一直开着,利用输入流的阻塞来模拟 } }
服务消费者:
applicationContext-dubbo.xml 中注册本身须要调用的接口,我刚开始测试的时候须要的接口不少,因此把这个文件写的满满的,后来熟悉了把接口按业务类型分开,写了N多个applicationContext-dubbo-***.xml 简练多了 》。服务消费者:
1.经过Spring配置引用远程服务:
<xmlversion="1.0"encoding="UTF-8"> <beansxmlns="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:applicationname="hehe_consumer"/> <!--使用zookeeper注册中心暴露服务地址--> <!--<dubbo:registryaddress="multicast://224.5.6.7:1234"/>--> <dubbo:registryaddress="zookeeper://127.0.0.1:2181"/> <!--生成远程服务代理,能够像使用本地bean同样使用demoService--> <dubbo:referenceid="demoService" interface="com.unj.dubbotest.provider.DemoService"/> </beans>
2.加载Spring配置,并调用远程服务:
packagecom.alibaba.dubbo.demo.pp; importjava.util.List; importorg.springframework.context.support. ClassPathXmlApplicationContext; importcom.unj.dubbotest.provider.DemoService; publicclassConsumer{ publicstaticvoidmain(String[]args)throwsException{ ClassPathXmlApplicationContextcontext= newClassPathXmlApplicationContext( newString[]{"applicationContext.xml"}); context.start(); DemoServicedemoService=(DemoService)context.getBean ("demoService");// Stringhello=demoService.sayHello("tom");// System.out.println(hello);// // Listlist=demoService.getUsers(); if(list!=null&&list.size()>0){ for(inti=0;i<list.size();i++){ System.out.println(list.get(i)); } } //System.out.println(demoService.hehe()); System.in.read(); } }
调用结果为:2.加载Spring配置,并调用远程服务:
dubbo管理页面:
这个管理页面还须要部署一个环境的,一开始我还觉得是dubbo自带的,找了半天没有找到....
应用页面:
提供者页面:
消费者页面:
服务页面:
想要了解架构技术知识点的,能够关注我一下,我后续也会整理更多关于分布式架构这一块的知识点分享出来,另外顺便给你们推荐一个交流学习群:697--57--9-75-1,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多,如下的知识体系图也是在裙里面获取。