首页 > 编程知识 正文

dubbo框架原理,dubbo线程池原理

时间:2023-05-03 11:56:28 阅读:39084 作者:285

Dubbo的体系结构和原理

-从官方网站整理文档

简介Dubbo是阿里巴巴开源的分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动检测等有效的服务治理方案。 主要功能包括高性能NIO通信和多协议集成、服务动态寻址和路由、软负载平衡和容错、相关性分析和降级。

l远程通信—基于多个长连接(如“请求-响应”模式下的线程模型、序列化和信息交换)提供NIO框架的抽象封装。

l群集容错:提供基于接口的透明远程过程调用,包括多协议支持以及群集支持,如软负载平衡、容错、地址路由和动态配置。

l自动发现:基于注册中心目录服务,服务消费者动态搜索服务提供者,使地址透明,使服务提供者顺利增减机器。

随着需求和背景互联网的发展,网站APP应用的规模不断扩大,普通的垂直APP应用体系结构无法适应,分布式服务体系结构和移动计算体系结构势在必行,体系结构发展完善

单一应用架构

如果网站流量很少,则通过在一个APP应用程序中聚合所有功能来降低部署节点和成本。 此时,用于简化追加删除重新审视作业的数据访问框架(ORM )很重要。

垂直应用架构

随着访问次数的逐渐增加,一个APP应用程序增加机器所带来的加速度越来越小,将APP应用程序分解为几个相互无关的APP应用程序以提高效率。 此时,用于加快前端页面开发的Web框架(MVC )是关键。

分布式服务架构

随着垂直的APP应用越来越多,APP应用之间的交互不可避免,提取核心业务,作为独立的服务,逐渐形成稳定的服务中心,使前端APP应用能够更快地适应变化的市场需求。 此时,用于提高业务复用和整合的分布式服务框架(RPC )很重要。

流动计算架构

随着服务增加,容量评估、小服务资源浪费等问题日益突出,需要增加基于访问压力实时管理集群容量的调度中心,提高集群利用率。 此时,用于提高设备利用率的资源调度和管理中心(SOA )很重要。

在大规模服务化之前,APP应用程序可能只需要通过RMI和Hessian等工具,轻松暴露和引用远程服务,设置和调用服务的URL地址,并通过F5等硬件平衡负载。

)1)随着服务的增加,服务URL的配置管理变得非常困难,F5硬件负载平衡器的单点压力也越来越大。

此时,为了使服务的位置透明,需要服务注册中心。 需要动态注册和发现服务。 另外,通过在消费者端获取服务提供者地址列表,实现软负载均衡和Failover,还可以降低对F5硬件负载均衡器的依赖,降低部分成本。

)进一步发展,服务之间的依赖关系变得复杂,甚至不知道哪个APP应用程序在哪个APP应用程序之前启动,体系结构无法完全描述APP应用程序的体系结构关系。

此时,需要自动创建APP应用程序之间的依赖关系图,以帮助修订者组织关系。

)3)接下来,随着服务调用量的增加,服务容量问题会变得突出。 这项服务需要多少机器支持? 我应该什么时候添加机器?

为了解决这些问题,第一步统计服务当前每天的调用量、响应时间,作为容量修订版的参考指标。 接下来,为了能够动态调整权重,在线上,在一直增大某个设备的权重的同时,记录响应时间的变化,直到响应时间达到阈值为止,记录此时的访问数,将该访问数乘以设备数,反算总容量。

框架设计下图是dubbo框架的设计示意图。

在图中,左边的浅蓝色背景是用于服务消费者的接口,右边的浅蓝色背景是用于服务提供者的接口,中心轴上的是用于双方的接口。

l图中自下而上分为10层,各层均为单向依赖关系,右侧黑色箭头表示层间依赖关系,可以逐层剥离上层进行复用。 其中,服务和配置层为API,其他各层均为SPI。

图中绿色小块是扩展接口,蓝色小块是安装类,图中只示出了用于关联各层的安装类。

l图中的蓝色虚线是初始化过程,即在启动时构造链的过程,红色实线是方法调用过程,即运行时链,紫色三角箭头是继承,子类可以被视为父类的同一节点,o

各层说明:

配合l config

置层,对外提供配置接口,以SeviceConfig和Reference为中心,可以直接new配置类,也可以通过Spring加载配置类;

l   proxy服务代理层,服务接口透明代理,生产客户端的Stub和服务器端的Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory;

l   register注册中心层,封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory, Registry, RegistryService。

l   cluster路由层,封装多个服务提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster, Router, Directory, LoadBalance;

l   monitor监控层,RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory, Monitor, MonitorService;

l   protocol远程调用层,封装RPC调用,以Invocation,Result为中心,扩展接口为Protocal, Invoker, Exporter;

l   exchange信息交换层,封装请求响应模式,同步转异步,以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel, ExchangeClient,ExchangeServer;

l   transport网络传输层,抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel, Transporter, Client, Server, Codec;

l   serialize数据序列化层,可复用的一些工具,扩展接口为Serialization, ObjectInput, ObjectOutput,ThreadPool

关系说明:

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

l   图中的Consumer和Provider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端和服务端,不用Client和Server的原因是Dubbo在很多场景下都使用Provider, Consumer, Registry, Monitor划分逻辑拓扑节点,保持统一概念。

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

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

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

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

 

依赖关系


图例说明:

l   图中小方块Protocol, Cluster, Proxy, Service,Container, Registry, Monitor代表层或模块,蓝色的表示与业务有交互,绿色的表示只对Dubbo内部交互。

l   图中背景方块Consumer, Provider, Registry, Monitor代表部署逻辑拓普节点。

l   图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。

l   图中只包含RPC的层,不包含Remoting的层,Remoting整体都隐含在Protocol中。

调用链

Dubbo的调用链如下:


暴露服务时序

引用服务时序

领域模型

在Dubbo的核心领域模型中:

l   Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。

l   Invoker是实体域,它是Dubbo的核心模型,其他模型都向它靠拢,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

l   Invocation是会话域,它持有调用过程中的变量,比如方法名,参数等。

基本原则

l   采用Microkernel+ Plugin模式,Microkernel只负责组装Plugin,Dubbo自身的功能也是通过扩展点实现的,也就是Dubbo的所有功能点都可被用户自定义扩展所替换。

l   采用URL作为配置信息的统一格式,所有扩展点都通过传递URL携带配置信息

 


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。