`
Donald_Draper
  • 浏览: 980867 次
社区版块
存档分类
最新评论

Dubbo框架设计及源码解读

阅读更多
Dubbo框架设计及源码解读原文地址:https://donaldhan.github.io/dubbo/2020/11/25/dubbo-framework-design.html

引言
随着互联网应用体量不断的增加,为了对应大量用户访问的体验效果,及提供应用的可用性,微服务应运而生,微服务使应用的业务具有更高的内聚性,同时对整体应用进行服务化的解耦;微服务之间除了通过异步的MQ进行通信,常用的还有基于同步的RPC通知机制,比如基于HTTP的GRPC, BRPC及在国内使用比较广泛的[Dubbo][]。一致在使用DUBOO,对其中的功能组件有大致的了解,本计划看一下源码的,一致没有抽出时间,最近终于忙里抽闲,一探Dubbo芳容。



目录
* [概要框架设计](#概要框架设计)
* [源码分析](#源码分析)
    * [应用协议](#应用协议)
        * [注册器协议](#注册器协议)
            * [服务导出Exporter](#服务导出exporter)
            * [服务注册](#注册器协议)
            * [订阅服务](#订阅服务)
            * [服务Invoker](#服务invoker)
        * [Dubbo协议](#dubbo协议)
    * [数据传输器Transport](#数据传输器transport)
        * [服务端](#服务端)
        * [客户端](#客户端)
    * [消息编解码](#消息编解码)
        * [消息编码器](#消息编码器)
        * [消息解码器](#消息解码器)
* [附](#附)


1.概要框架设计



靠,这里显示不出来,直接访问原文好了。

dubbo框架主要包括序列化,消息层,传输层,协议层。序列化主要是请求消息和响应消息的序列化,比如基于Javad的ObjectOut/InputStream序列化、基于JSON的序列化。消息层提供消费者调用服务请求消息、服务提供方处理
结果响应消息的编解码;传输层主要建立消费者和服务者的通信通道,传输服务请求响应数据,比如基于Netty和Mina的,默认为Netty;协议层首先是基于相关协议将服提供者,和消费者通过export暴露出去,即注册器Registry中,消费者通过Registry订阅响应的服务提供者,消费者发现有服务
提供者,则与服务提供者建立连接,注册协议有基于Zookeeper,Redis等,在注册协议中还有一个注册器目录服务,用于提供消费者和服务者列表,及根据负载均衡策略选择服务者。服务提供者接受的消费者的服务请求后,根据相关协议,调用相应的Invoker服务。 消费者和服务者的RPC调用协议,实际在DubboProtocol中,协议首先导出服务,消费者发送RPC请求,调用Exporter服务容器中的Invoker。

2.源码分析

[Dubbo框架设计源码解读第一篇(服务和引用bean初始化)](https://donaldhan.github.io/dubbo/2020/11/17/dubbo-framework-service-reference-bean-init.html)

dubbo框架主要包括消息层,传输层,协议层。消息层提供消费者调用服务请求消息、服务提供方处理
结果响应消息的编解码;传输层主要建立消费者和服务者的通信通道,传输服务请求响应数据;协议层首先是基于相关协议将服
提供者,和消费者通过export暴露出去,即注册的Registry中,消费者通过Registry订阅响应的服务提供者,消费者发现有服务
提供者,则与服务提供者建立连接。服务提供者接受的消费者的服务请求后,根据相关协议,调用响应的Invoker服务。


ServiceAnnotationBeanPostProcessor主要做的事情是扫描 应用先的Service注解bean,并构造ServiceBean,注册到bean注册器中。导出服务实际委托给相应的协议RegistryProtocol


ReferenceBean后处理主要扫描Reference注解的bean,并构造ReferenceBean,ReferenceBean通过Invoker去调用服务提供者的服务,Invoker为服务的包装类。实际通过相应的协议创建。

3.应用协议

3.1注册器协议
[Dubbo框架设计源码解读二(注册器,服务注册,订阅)](https://donaldhan.github.io/dubbo/2020/11/19/dubbo-framework-application-registry-protocol.html)


注册协议,导出服务主要有注册服务和订阅服务。注册服务,实际是将基于Dubbo协议的服务URL写到ZK上,如何在注册的过程中,由于Dubbo自身机制导致的注册失败,将加入的失败注册集,并有定时钟,进行重试注册。订阅服务,监听服务提供者的节点路径。消费者注册到ZK上的订阅服务节点上,具体的订阅委托给目录服务。

注册目录服务依赖于注册器,消费者从注册器获取服务提供者,实际为从注册目录服务获取服务列表(zk注册器为,服务节点下的提供者),并根据路由策略,选择可用的服务提供者Invoker。注册器目录处理提供服务路由,同时监听服务的变化。如果注册器节点信息存在变化,则重新刷新服务,建立服务Invoker索引。

3.2Dubbo协议

[Dubbo框架设计源码解读三(Dubbo协议,服务导出,引用)](https://donaldhan.github.io/dubbo/2020/11/19/dubbo-framework-dubbo-protocol.html

Dubbo协议是消费者和服务者通信的基础,包括服务的调用。注册器协议中,有如下一个功能,导出服务到本地, 实际委托的相应的协议,比如Dubbo协议DubboProtocol的export操作。注册器目录,当前监听注册器节点变化是,重新索引服务,在转换URL为Invoker,实际委托的相应的协议,比如Dubbo协议DubboProtocol的 refer操作。 dubbo协议的导出服务,实际上创建一个服务Server,根据dubbo协议配置,可为NettyServer,或MinaServer。默认为NettyServer。

4.数据传输器Transport

[Dubbo框架设计源码解读四(Dubbo基于Netty的传输器Transport)](https://donaldhan.github.io/dubbo/2020/11/23/dubbo-framework-netty-server-client.html

Netty服务端是基于经典的bootstrap,事件,worker, 编解码器,消息处理器的实现。netty处理器实际为一个共享的SimpleChannelHandler, 所有操作委托内部通道处理器DecodeHandler。DecodeHandler在接受消息后,解码相应的消息,将交由内部的HeaderExchangeHandler处理。HeaderExchangeHandler, 所有的操作委托给内部的ExchangeHander,实际为DubboProtocol的中ExchangeHandleAdater。

消费者调用服务提供者实际上发送的一个Invocation消息,服务端接受到消息,根据Invoker上下文,从Dubbo协议的Exporter容器中获取对应的Invoker,调用相关服务,将调用结果返回给消费者。

netty客户端也没有多少新鲜的动心,编解码器,Netty客户端处理器NettyClientHandler。NettyClientHandler实际为一个共享的ChannelDuplexHandler,所有操作委托内部通道处理器DecodeHandler。DecodeHandler在接受消息后,解码相应的消息,将交由内部的HeaderExchangeHandler处理。HeanderExchangeHandler,HeanderExchangeHandler所有的操作委托给内部的ExchangeHander,实际为DubboProtocol的中ExchangeHandleAdater。一个请求,主要包括请求Id,版本,及数据及Invocation。服务响应,主要包含消息id,消息版本,状态,相应结果,及错误信息,如果有的话。


5.消息编解码

[Dubbo框架设计源码解读五(消息编解码器)](https://donaldhan.github.io/dubbo/2020/11/25/dubbo-framework-encoder-decoder.html)

NettyCodecAdapter为编解码器的适配,内部编码器实际为ByteToMessageDecoder, 内部的编码操作委托给内部编解码器,根据SPI机制,实际为DubboCodec;内部解码器实际为ByteToMessageDecoder,解码操作委托给DubboCodec。


编码器编码主要是针对请求Request和响应Response,编码首先写头部,针对请求主要有魔数、序列化标志,请求id,然后是请求数据,主要有RpcInvocation的服务URL,版本信息,服务方法,方法参数类型,方法参数类型通过ReflectUtils进行编码,最后还有方法参数;针对响应,首先写头部,魔数,请求id,然后是响应数据。需要注意在编码请求和响应的时候,有一部分是Attament,这部分是可以扩展的地方。序列化器,有FastJsonSerialization,JavaSerialization, 默认为JavaSerialization。JavaSerialization的序列化和反序列化实际是基于ObjectOutput/InputStream。


解码消息首先解码消息头部魔数等数据,然后是请求id,如果是消费者请求则解码出消息体,实际为DecodeableRpcInvocation,包括方面名,参数以及参数值;如果是请求响应,解码出返回结果,实际为DecodeableRpcResult,包含服务响应数据。










这里显示不出来,看样我只有放弃了。

参考文献

[dubbo offical site](https://dubbo.apache.org/zh-cn/index.html)   
[dubbo github](https://github.com/apache/dubbo)  
[dubbo github vt](https://github.com/Donaldhan/incubator-dubbo
[incubator-dubbo-spring-boot-project github vt](https://github.com/Donaldhan/incubator-dubbo-spring-boot-project
分享到:
评论

相关推荐

    dubbo源码解析

    这些是dubbo框架中最为核心的实现部分,对于理解dubbo的工作原理至关重要。 7. 扩展点的讨论是了解dubbo灵活性的关键。dubbo采用JavaSPI机制来实现扩展点的注册和加载。了解扩展点配置、加载流程及扩展点装饰的具体...

    dubbo源码分析pdf.zip

    2. **源码解读**:针对Dubbo的关键模块,如Proxy、Filter、Monitor等,进行源码级别的分析,帮助读者深入理解代码实现细节。 3. **性能优化技巧**:分享Dubbo的性能调优策略,包括参数调整、服务治理策略优化等,以...

    Dubbo源码解读

    总体来说,源码分析显示了Dubbo框架强大的扩展能力和高度的可配置性,同时也体现了作者对Spring框架深入了解的深度以及对Java语言特性运用的娴熟。通过阅读和理解Dubbo源码,开发者不仅能学习到如何实现一个复杂的...

    dubbo源码解析2.01.pdf

    Dubbo源码解析不仅涵盖了框架本身的设计和实现细节,还包括了对Java相关技术和设计模式的应用。通过深入理解这些知识点,不仅可以帮助开发者更好地使用Dubbo,还能提高他们对分布式系统设计的理解和掌握。

    dubbo2.5.5源码

    本文将围绕Dubbo 2.5.5版本的源码进行详细解读,帮助开发者深入了解其内部工作原理,从而更好地利用和优化该框架。 首先,我们要明白的是,Dubbo的核心功能包括服务注册与发现、服务调用、负载均衡、容错机制、服务...

    Dubbo源码解读与实战_文档.zip

    《Dubbo源码解读与实战》是一份深入探讨Apache Dubbo这一高性能、分布式服务框架的文档,旨在帮助开发者深入理解其内部机制,并提供实战指导。本文将基于该文档的要点,详细阐述Dubbo的核心概念、设计模式以及源码...

    dubbo源码分析系列

    在Dubbo源码分析系列中,知秋整理了Dubbo架构设计和源码风格的详细解读,并对核心模块的职责和关系进行了深入的剖析。这对于想要了解和掌握Dubbo源码的开发者来说,是一份宝贵的资料。通过源码分析,开发者不仅能够...

    dubbo相关官方文档

    《Dubbo相关官方文档》包含了三个重要的组成部分:《dubbo-user-book》、《dubbo-dev-book》和《dubbo-admin-book》,这些都是深入了解和使用Dubbo框架必不可少的参考资料。接下来,我们将详细探讨这些文档中涉及的...

    dubbo-2.6.0

    本文将聚焦于Dubbo 2.6.0版本,通过对源码的深入解读,揭示其内在的工作原理和技术亮点。 1. **Dubbo架构概述** Dubbo采用了微内核+插件的设计模式,核心组件包括服务提供者(Provider)、服务消费者(Consumer)、...

    dubbo源码学习.zip--------------

    "答辩-dubbo.docx"可能包含了对Dubbo设计理念、架构及其实现的全面解读,是深入理解Dubbo整体框架和设计理念的重要参考资料。 最后,"服务端接收消息图"和"IOworker主要做的工作.docx"将帮助我们形象地理解服务端...

    掌握框架底层源码,提升实战开发能力-视频教程网盘链接提取码下载 .txt

    更重要的是,RPC 框架的底层原理与设计是相通的,吃透 Dubbo 源码,也能让你对其他框架得心应手,提升你的编程思想,更好地应对微服务架构实战。 本专栏共 6 个模块,以结合实战的方式深度解读 Dubbo 源码,带你...

    dubbolearn1_dubbo_

    接下来,深入到5.3-Dubbo核心源码分析-笔记.pdf,这份文档可能详细解读了Dubbo的关键组件和其工作原理: 1. **Protocol组件**:Dubbo的协议层负责序列化、反序列化以及网络通信,例如Dubbo协议、RMI协议、Hessian2...

    dubbox-dubbox-2.8.4a源码

    源码解读有助于理解和应用微服务的最佳实践。 通过深入研究dubbox-dubbox-2.8.4a的源码,开发者不仅可以掌握Dubbo的核心原理,还能了解到服务治理的高级特性,从而提升在分布式系统开发中的专业能力。

    Java思维导图xmind文件+导出图片

    深入分析Zookeeper Zab协议及选举机制源码解读 Dubbo 使用Dubbo对单一应用服务化改造 Dubbo管理中心及及监控平台安装部署 Dubbo分布式服务模块划分(领域驱动) 基于Dubbo的分布式系统架构实战 Dubbo负载均衡...

    android开源项目源码,完整商城项目源码(服务端+客户端)

    这篇文档将深入解析《android开源项目源码,完整商城项目源码(服务端+客户端)》这一开源资源,包括服务端(ECServer_D)和客户端(ECClient_D)的架构设计、主要功能模块、技术选型及开发文档的解读。 首先,这...

    编程框架(1).pdf

    - Dubbo面试题:提供针对Dubbo框架的面试问题集。 - Dubbo基础:可能包含Dubbo的入门知识和基本使用。 - Java RMI与Dubbo:对比分析Java远程方法调用(RMI)和Dubbo的区别和联系。 - Dubbo配置参考:提供Dubbo...

    xuyulong:一个使用dubbo分布式事务开发的简易支付系统

    "Xuyulong"可能是项目开发者或团队的名字,而"Pay-dubbo"则可能是该项目的命名,它明确指出这是一个与支付相关的系统,并且是基于Dubbo框架来实现的。Dubbo是一个由阿里巴巴开源的高性能Java服务框架,它专注于服务...

    pinpoint-1.8.x.zip

    《Pinpoint 源码分析:1.8.x 版本深度解读》 Pinpoint 是一个高度可扩展的分布式跟踪系统,专为监控基于微服务架构的大型分布式系统而设计。它提供了强大的调用链路追踪功能,有助于开发者诊断性能瓶颈,提升系统的...

    java 高级架构进阶学习

    - **MyBatis源码分析**:解读MyBatis的工作流程、执行过程及SQL映射机制。 - **事务管理**:讨论非传统事务处理方式——柔性事务的概念及其优势。 - **MySQL优化**:分享MySQL性能调优技巧,包括索引优化、查询...

Global site tag (gtag.js) - Google Analytics