热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Dubbo:使用与源码分析

本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。

                                      Dubbo开篇综述

Dubbo是由阿里巴巴开源的高性能RPC(远程过程调用)框架,是阿里巴巴SOA(面向服务的架构)服务治理方案的核心组件。目前,Dubbo已被广泛应用于各大企业,如滴滴、京东、考拉等。

Dubbo的架构设计如下图所示:

Dubbo架构图
Dubbo架构图

当Provider启动时,会将自己的元数据(服务IP和端口、服务接口信息)注册到注册中心。Consumer启动时会从注册中心订阅服务元数据(首次订阅会拉取全量数据并缓存到本地),注册中心数据发生变化时会推送给订阅的Consumer。Consumer获取到服务元数据后,会发起RPC调用,并将调用信息上报给Monitor。

Dubbo的核心特性总结如下:

1. 面向接口的RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽了远程调用的复杂性。

2. 服务注册与发现:支持多种注册中心(如ZooKeeper、Redis、Multicast,官方推荐ZooKeeper),能够实时感知服务实例的上下线情况。

3. 运行期流量控制:内置条件、脚本等策略,通过配置不同的路由规则,轻松实现灰度发布和同机房优先等功能。

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

5. 高度可扩展性:遵循微内核设计,核心能力如协议、传输、序列化被设计成扩展点,支持平滑集成内置和第三方实现。

6. 可视化的服务治理与运维:提供丰富的服务治理和运维工具,支持实时查询服务元数据、服务健康状态及调用统计,以及实时下发路由策略和调整配置参数。

Dubbo的总体分层设计如下:

Dubbo总体分为业务逻辑层(Biz)、RPC层、Remote层。各层的具体划分如下图所示:

Dubbo分层设计
左边是具体的分层,右边是比较重要的接口

Service:业务层,包括业务代码接口和具体实现,即开发者实现的业务代码。

Config:配置层,主要包括ServiceConfig(暴露的服务配置)和ReferenceConfig(引用的服务配置)两个类,负责初始化配置信息,管理整个Dubbo的配置。

Proxy:服务代理层,Dubbo框架会为生产者和消费者生成服务代理类,整个过程对上层透明,使业务层对远程调用无感,如同调用本地接口。

Registry:注册层,负责Dubbo框架的服务注册与发现,当有新的服务加入或旧的服务下线时,注册中心会感知并通知所有订阅方,整个过程无需人工干预。

Cluster:集群容错层,负责远程过程调用失败时的容错策略,如快速失败、快速重试、立即返回等。

Monitor:监控层,负责调用次数和调用时间的统计等。

Protocol:远程调用层,封装RPC调用的具体过程,Protocol是Invoker暴露(发布一个服务供他人调用)和引用(引用一个远程服务到本地)的主要功能入口,负责管理Invoker的整个生命周期。Invoker是Dubbo的核心模型,框架中的其他模型都会转换成它,代表一个可执行体,允许向其发起调用,可能是本地接口实现、远程实现或集群实现。

Exchange:信息交换层,负责Request-Response模型的建立,封装请求响应模式,如将同步请求转换为异步请求。

Transport:网络传输层,将网络传输抽象成统一的接口,Dubbo将底层的通信框架如Mina和Netty封装成统一的接口,用户也可以自定义网络传输。

Serialize:序列化层,负责管理整个框架网络传输时的序列化/反序列化工作,确保数据在网络中传输时的正确性和效率。

Dubbo的整体调用过程如下:

Dubbo调用流程
Dubbo组件调用总体流程

服务端(服务提供者)在框架启动时,会初始化服务实例,通过Proxy组件调用具体协议(Protocol),将服务端要暴露的接口封装成Invoker,然后转换成Exporter。此时,框架会打开服务端口并记录服务实例到内存中,最后通过Registry将服务元数据注册到注册中心,完成服务提供者的接口暴露过程。

组件解析:

Proxy:服务端/消费端接口调用代理类,自动发起本地/远程调用并返回结果。

Protocol:根据不同的协议转换成不同的Invoker对象,如DubboInvoker将XML中的远程配置接口转换为DubboInvoker。

Exporter:用于暴露到注册中心的对象,内部持有Invoker对象。

Registry:将Exporter注册到注册中心。

调用过程整体分析如下:

调用从一个Proxy开始,Proxy持有一个Invoker对象。触发Invoker调用时,需要使用Cluster,Cluster负责容错,处理调用失败的快速返回或重试等。Cluster在调用前会通过Directory获取远程可调用的Invoker列表,如果用户配置了路由规则,会根据路由规则过滤Invoker。

存活下来的Invoker可能还有多个,会通过LoadBalance方法进行负载均衡,最终选择一个可调用的Invoker。这个Invoker会经过一系列过滤链,用于处理上下文、限流、计数等。

接着,使用Client进行传输,如Netty、Mina等。传输前会使用私有协议构造数据包,此时会用到Codec接口对数据包进行序列化,然后传输到服务端。服务端接收到数据包后,使用Codec接口进行协议处理,处理半包、粘包等问题,并对数据进行反序列化。

随后,Request会被分配到请求的线程池中进行处理。Server会处理这些Request,根据请求查找对应的Exporter(内部持有Invoker)。Invoker被用装饰器模式层层包装了许多Filter,因此在调用最终实现类之前,会经过服务端的过滤链。

最终,调用具体接口的真实实现并返回结果。


推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ... [详细]
  • 探索Squid反向代理中的远程代码执行漏洞
    本文深入探讨了在网站渗透测试过程中发现的Squid反向代理系统中存在的远程代码执行漏洞,旨在帮助网站管理者和开发者了解此类漏洞的危害及防范措施。 ... [详细]
  • Win10 UWP 开发技巧:利用 XamlTreeDump 获取 XAML 元素树
    本文介绍如何在 Win10 UWP 开发中使用 XamlTreeDump 库来获取和转换 XAML 元素树为 JSON 字符串,这对于 UI 单元测试非常有用。 ... [详细]
  • RedHat 系统下配置国内 YUM 源以替代官方收费源的方法
    本文详细介绍如何在 RedHat Linux 中安装并配置 YUM 包管理器,并通过使用国内镜像源来解决因未购买官方服务而导致的更新源限制问题。 ... [详细]
  • 本文介绍了如何在WildFly 10中配置MySQL数据源时遇到的服务依赖问题及其解决方案。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 深入解析MySQL查询优化:特定类型查询的高级策略
    本文详细探讨了MySQL中特定类型查询的优化方法,包括COUNT()查询、关联查询、LIMIT分页及UNION查询的优化技巧,旨在提高数据库查询效率。 ... [详细]
  • Redis安全防护深入解析
    本文详细探讨了如何通过指令安全、端口管理和SSL代理等措施有效保护Redis服务的安全性。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • Web前端性能提升指南:简化JavaScript与消除重复脚本
    本文为Web前端性能优化系列的第七篇,重点探讨简化JavaScript代码及清除重复脚本的方法。通过这些技术,可以显著提高网页加载速度和用户体验。了解更多信息,请参阅我们的完整指南:Web前端性能优化。 ... [详细]
  • java程序员_Java程序员最新职业规划,逆袭面经分享
    java程序员_Java程序员最新职业规划,逆袭面经分享 ... [详细]
author-avatar
凌波_薇步
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有