四时宝库

程序员的知识宝库

学习笔记-Dubbo简单理解(dubbo的底层实现原理和机制)

Dubbo是什么

Dubbo是阿里开源的一款高性能、轻量级的开源Java RPC框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 框架无缝集成。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。(RPC详见学习笔记-RPC简单理解

主要核心部件

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

RPC: 一个的抽象,支持、和功能

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

工作原理

Provider:暴露服务的服务提供方,称之为"服务提供者"。

Consumer:调用远程服务的服务消费方,称之为"服务消费者"。

Registry:服务注册与发现的注册中心,称之为"服务注册中心"。

Monitor:统计服务的调用次数和调用时间的监控中心,称之为"服务监控中心"。

Container:服务运行容器

调用流程

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

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

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

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

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

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

基本特性

Dubbo架构具有以下几个特性,连通性、健壮性、伸缩性、升级性。

连通性(服务消费者和服务提供者的关联)

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

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

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

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

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

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

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

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

健壮性(任意节点宕掉后,服务仍然可用)

1,监控中心宕掉不影响使用,只是丢失部分

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

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

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

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

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

伸缩性(节点可以自动增加)

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

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

升级性(可平滑升级)

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

Dubbo架构

如下图所示,Dubbo总体架构设计一共划分了10层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。

结合Dubbo官方文档,理解一下总体架构分层中,各个层次的设计要点:

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

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

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

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

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

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

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

8. 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。

9. 网络传输层(Transport):抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec。

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

特性

面向接口代理的高性能RPC调用

提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

智能负载均衡

内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

服务自动注册与发现

支持多种注册中心服务,服务实例上下线实时感知。

高度可扩展能力

遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

运行期流量调度

内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

可视化的服务治理与运维

提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

Dubbo 核心的配置

Dubbo集群容错方案

Dubbo优缺点

优点:

1,透明化的远程方法调用

像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。

2,软负载均衡及容错机制

可在内网替代nginx lvs等硬件负载均衡器。

3,服务注册中心自动注册 & 配置管理

不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。

4,服务接口监控与治理

Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

缺点:

只支持JAVA语言

远程调用细节:

服务提供者暴露一个服务的详细过程:

上图是服务提供者暴露服务的主过程:

首先ServiceConfig类拿到对外提供服务的实际类ref,然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到invoker的转化。接下来就是Invoker转换到Exporter的过程。

Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,下面我们以Dubbo和rmi这两种典型协议的实现来进行说明:

Dubbo的实现:

Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由dubbo自己实现。

Rmi的实现:

RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,他通过Spring或Dubbo或JDK来实现服务,通讯细节由JDK底层来实现。

服务消费者消费一个服务的详细过程

上图是服务消费的主过程:

首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口即可。

本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联系删。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接