dubbo_分布式框架dubbox介绍

1.Dubbo概述
Dubbo是阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。
简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架

它的核心功能包括:
#remoting:远程通讯,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。
#Cluster: 服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
#registry: 服务注册中心,服务自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

2. Dubbo能做什么?
#.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
#.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
#. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

3.Dubbox  实现原理

 

 节点角色说明:

       Provider: 暴露服务的服务提供方。

       Consumer: 调用远程服务的服务消费方。

       Registry: 服务注册与发现的注册中心。

       Monitor: 统计服务的调用次调和调用时间的监控中心。

       Container: 服务运行容器。

  调用关系说明:

    0  服务容器负责启动,加载,运行服务提供者。

    1. 服务提供者在启动时,向注册中心注册自己提供的服务。

    2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

    3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

4.Doubbox 特性:

  (1) 连通性: 

  注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小

  监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示 

  服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销

  服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销 

  注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外 

  注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者

  注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表 

  注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

 (2) 健状性:

  监控中心宕掉不影响使用,只是丢失部分采样数据

  数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务 

  注册中心对等集群,任意一台宕掉后,将自动切换到另一台

  注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

  服务提供者无状态,任意一台宕掉后,不影响使用 

  服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

 (3) 伸缩性: 

  注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心

  服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者 

(4) 升级性: 

  当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力

5. Dubbox安装部署

  • 前提背景:JDK1.7,maven 已安装
  • 下载解压一个zookeeper,编辑其conf/zoo.cfg后启动zookeeper用作dubbo注册中心:bin/zkServer.sh start 
  • 下载地址:https://github.com/dangdangdotcom/dubbox
  • 下载dubbo.xsd: http://download.csdn.net/download/he000111/8244449
  • Eclipse: 选择 window --> preferences -->XML --> XML  Catalog --> add   在 location:选择dubbox.xsd本地路径;key:  http://code.alibabatech.com/schema/dubbo/dubbo.xsd
  • 在下载的dubbox目录执行mvn install -Dmaven.test.skip=true来尝试编译一下dubbo(并将dubbo的jar安装到本地maven库)
  • 在dubbox根目录执行mvn idea:idea或者mvn eclipse:eclipse,来创建IDE工程文件
  • 将项目导入IDE
  • 用IDE运行/dubbo-demo/dubbo-demo-provider/…/test目录下的DemoProvider启动dubbo服务端,目前他会分别启动dubbo协议(包括用kryo和FST序列化)和REST协议的服务
  • 用IDE运行/dubbo-demo/dubbo-demo-consumer/…/test目录下的DemoConsumer来启动dubbo客户端调用上面的服务端,直接看console的输出即可
  • 用IDE运行/dubbo-demo/dubbo-demo-consumer/…/test目录下的RestClient来启动rest客户端(模拟非dubbo的rest客户端)调用上面的服务端,直接看console的输出即可
  • 可以在浏览器中直接访问http://localhost:8888/services/users/100.xml或者http://localhost:8888/services/users/101.json之类来测试REST服务
  • 了解tomcat和IDE集成的同事,可以直接在IDE中将/dubbo-demo/dubbo-demo-provider/部署到tomcat上,用tomcat的servlet容器来发布REST服务(要同时修改dubbo-demo-provider.xml,请看那个文件中的注释)。(当然也可以在命令行直接mvn package,然后将生成的war部署到外面的tomcat中做测试)
  • 如果想看服务监控效果,或者避免demo抛出找不到监控的异常警告,用IDE运行/dubbo-simple/dubbo-simple-monitor/…/test目录下的SimpleMonitor来启动监控中心即可。页面访问:    http://localhost:8080/

6. Dubbox—负载均衡

在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。 可以自行扩展负载均衡策略,参见:负载均衡扩展 

  • Random LoadBalance 随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
  • RoundRobin LoadBalance 轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
  • LeastActive LoadBalance最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
  • ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 缺省只对第一个参数Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" /> 缺省用160份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes" value="320" />

 配置如: 

 <dubbo:service interface="..."loadbalance="roundrobin"/><dubbo:reference interface="..."loadbalance="roundrobin"/>

或: <dubbo:service interface="..."> 
                 <dubbo:methodname="..."loadbalance="roundrobin"/> 
       </dubbo:service> 
或: <dubbo:reference interface="..."> 
                <dubbo:methodname="..."loadbalance="roundrobin"/> 
        </dubbo:reference> 

7. Dubbox实例 & 应用

 参考dubbox  源码中的 dubbo-demo 模块

对于外部系统使用dubbox:在工程pom.xml 引入jar :

<dependency> <groupId>com.alibaba</groupId> 
  <artifactId>dubbo</artifactId> 
  <version>2.8.4</version> 
</dependency> 

<dependency>
  <groupId>com.caucho</groupId> 
  <artifactId>hessian</artifactId>
   <version>4.0.7</version>
</dependency>

 Dubbo Home: 
http://code.alibabatech.com/wiki/display/dubbo/Home 
http://weibo.com/dubbo 

Dubbo Download: 
http://code.alibabatech.com/wiki/display/dubbo/Download 

Dubbo Example: 
1. Export a remote service: 

Xml代码  收藏代码
  1. <bean id="xxxService" class="com.xxx.XxxServiceImpl" />   
  2. <dubbo:service interface="com.xxx.XxxService" ref="xxxService" />  

2. Reference a remote service: 

Xml代码  收藏代码
  1. <dubbo:reference id="xxxService" interface="com.xxx.XxxService" />  
  2.     <bean id="xxxAction" class="com.xxx.XxxAction">  
  3.     <property name="xxxService" ref="xxxService" />  
  4. </bean>  

posted on 2016-07-17 00:48  dengzy  阅读(1306)  评论(0编辑  收藏  举报