本文写做时,dubbo最高版本是V2.6.0。 写这篇文章主要想回答如下4个问题:spring
1、dubbo是什么?完成了哪些主要需求?服务器
2、dubbo适用于什么场景?网络
3、dubbo的整体架构是什么样的?架构
4、dubbo调用的过程是什么样的?负载均衡
下面就一一道来。框架
1、dubbo是什么?完成了哪些主要需求?异步
dubbo是一个面向服务治理(SOA)的分布式RPC框架。分布式
它主要实现了如下一些需求:ide
RPC方面:微服务
实现了基本的RPC过程,开发了DubboProtocol做为默认的实现,并集成了Hession,RMI,HTTP,WebService,Thrift(被改造,与原Thrift不兼容),Rest等远程过程调用框架。基本组成为:Protocol(默认dubbo),Invoker,Transporter(默认netty),Codec2(默认Hession2编码)。
编解码方面提供了Hession2(默认,阿里修改过的hessian lite)、dubbo、Java、JSON、Thrift(与原Thrift不兼容)、Kryo、FST序列化。
DubboProtocol实现了同步调用、异步请求、回调方法设置、本地调用等等灵活的调用特性。
服务治理方面:
一、实现了集群、容错、负载均衡及路由策略
二、实现了注册功能,完成提供者、消费者注册、订阅通知策略等;
三、对外提供了服务提供者、消费者配置信息、调用链、依赖关系的展示接口,并能够对服务提权、降级,配置路由信息等针对服务的治理手段;
四、开发了服务管理控制台dubbo-admin,能够在此查看服务相关注册信息,对服务实施治理;
五、开发了服务监控台dubbo-monitor,可查看服务实时调用状况,包括调用次数,调用时间,吞吐量等统计信息,实时查看服务的健康情况,做为服务治理手段的依据。
2、dubbo适用于什么场景?
一、业务中须要高吞吐量、复杂的RPC调用,有服务治理需求的场景;
二、有轻量级微服务化需求的场景;
下面引用dubbo用户手册的需求描述来讲明什么状况下须要用到dubbo:
在大规模服务化以前,应用可能只是经过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,经过配置服务的URL地址进行调用,经过 F5 等硬件进行负载均衡。
当服务愈来愈多时,服务 URL 配置管理变得很是困难,F5 硬件负载均衡器的单点压力也愈来愈大。 此时须要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并经过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,下降对 F5 硬件负载均衡器的依赖,也能减小部分红本。
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪一个应用要在哪一个应用以前启动,架构师都不能完整的描述应用的架构关系。 这时,须要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
接着,服务的调用量愈来愈大,服务的容量问题就暴露出来,这个服务须要多少机器支撑?何时该加机器? 为了解决这些问题,第一步,要将服务如今天天的调用量,响应时间,都统计出来,做为容量规划的参考指标。其次,要能够动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程当中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
以上是 Dubbo 最基本的几个需求。
3、dubbo的整体架构是什么样的?
调用关系说明:
0、服务容器在启动时启动、加载服务提供者;
一、启动时,服务提供者向注册中心注册服务;
二、启动时,服务消费者向注册中心订阅服务;
三、注册中心给消费者返回服务提供者的地址列表,的提供者服务有什么变更,将用长链接推送变更数据给订阅者;
四、服务消费者发起对提供者服务的调用,提供者返回调用结果给消费者;
五、服务消费者和提供者在内存中累计调用次数和调用时间,每分钟发送一次统计数据给监控中心Monitor,供监控中心统计查询。
Dubbo 架构具备如下几个特色,分别是连通性、健壮性、伸缩性、以及向将来架构的升级性。
整体设计:
此图在学习源码前看的眼花缭乱,学习以后看一目了然。
图例说明:
各层说明:
ServiceConfig
, ReferenceConfig
为中心,能够直接初始化配置类,也能够经过 spring 解析配置生成配置类ServiceProxy
为中心,扩展接口为 ProxyFactory
RegistryFactory
, Registry
, RegistryService
Invoker
为中心,扩展接口为 Cluster
, Directory
, Router
, LoadBalance
Statistics
为中心,扩展接口为MonitorFactory
, Monitor
, MonitorService
Invocation
, Result
为中心,扩展接口为 Protocol
,Invoker
, Exporter
Request
, Response
为中心,扩展接口为 Exchanger
, ExchangeChannel
, ExchangeClient
, ExchangeServer
Message
为中心,扩展接口为 Channel
,Transporter
, Client
, Server
, Codec
Serialization
, ObjectInput
,ObjectOutput
, ThreadPool
关系说明:
模块分包:
模块说明:
总体上按照分层结构进行分包,与分层的不一样点在于:
4、dubbo调用的过程是什么样的?
调用链:
展开总设计图的红色调用链,以下:
暴露服务时序图:
展开总设计图左边服务提供方暴露服务的蓝色初始化链,时序图以下:
引用服务时序图:
展开总设计图右边服务消费方引用服务的蓝色初始化链,时序图以下:
注:以上大量引用了dubbo的develop手册的文字和图片内容。