Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架

作者:纪军伟 分类:高性能架构 时间:2015-08-20 14:51
山西优府信息技术开发公司

Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

主要核心部件:

 

  • Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制.

  • RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能

  • Registry: 服务目录框架用于服务的注册和服务事件发布和订阅

Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。
下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:

1. 服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。

2. 配置层(Config):对外配置接口,以ServiceConfigReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。

3. 服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory

4. 服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactoryRegistryRegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。

5. 集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为ClusterDirectoryRouterLoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供方进行交互。

6. 监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactoryMonitorMonitorService

7. 远程调用层(Protocol):封将RPC调用,以InvocationResult为中心,扩展接口为ProtocolInvokerExporterProtocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

8. 信息交换层(Exchange):封装请求响应模式,同步转异步,以RequestResponse为中心,扩展接口为ExchangerExchangeChannelExchangeClientExchangeServer

9. 网络传输层(Transport):抽象minanetty为统一接口,以Message为中心,扩展接口为ChannelTransporterClientServerCodec

10. 数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、 ObjectInputObjectOutputThreadPool

从上图可以看出,Dubbo对于服务提供方和服务消费方,从框架的10层中分别提供了各自需要关心和扩展的接口,构建整个服务生态系统(服务提供方和服务消费方本身就是一个以服务为中心的)。
根据官方提供的,对于上述各层之间关系的描述,如下所示:

· 在RPC中,Protocol是核心层,也就是只要有Protocol + Invoker + Exporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filter拦截点。

· 图中的ConsumerProvider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用ClientServer的原因是Dubbo在很多场景下都使用ProviderConsumerRegistryMonitor划分逻辑拓普节点,保持统一概念。

· 而Cluster是外围概念,所以Cluster的目的是将多个Invoker伪装成一个Invoker,这样其它人只要关注ProtocolInvoker即可,加上Cluster或者去掉Cluster对其它层都不会造成影响,因为只有一个提供者时,是不需要Cluster的。

· Proxy层封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有到了暴露给用户使用时,才用ProxyInvoker转成接口,或将接口实现转成Invoker,也就是去掉ProxyRPC是可以Run的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。

· 而Remoting实现是Dubbo协议的实现,如果你选择RMI协议,整个Remoting都不会用上,Remoting内部再划为Transport传输层和Exchange信息交换层,Transport层只负责单向消息传输,是对MinaNettyGrizzly的抽象,它也可以扩展UDP传输,而Exchange层是在传输层之上封装了Request-Response语义。

· RegistryMonitor实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。

从上面的架构图中,我们可以了解到,Dubbo作为一个分布式服务框架,主要具有如下几个核心的要点:

服务定义
服务是围绕服务提供方和服务消费方的,服务提供方实现服务,而服务消费方调用服务。

服务注册
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型可供选择:

· Multicast注册中心

· Zookeeper注册中心

· Redis注册中心

· Simple注册中心

服务监控
无论是服务提供方,还是服务消费方,他们都需要对服务调用的实际状态进行有效的监控,从而改进服务质量。

远程通信与信息交换
远程通信需要指定通信双方所约定的协议,在保证通信双方理解协议语义的基础上,还要保证高效、稳定的消息传输。Dubbo继承了当前主流的网络通信框架,主要包括如下几个:

· Mina

· Netty

· Grizzly


当前用户暂时关闭评论 或尚未登录,请先 登录注册
暂无留言
版权所有:拓荒族 晋ICP备17002471号-6