当前位置:

首页 > 编程开发 > java开发分布式服务框架Dubbo原理机制的示例分析

java开发分布式服务框架Dubbo原理机制的示例分析

前言在介绍Dubbo之前先了解一下基本概念:Dubbo是一个RPC框架,RPC,即RemoteProcedureCall(远程过程调用),相对的就是本地过程调用,在分布式架构之前的单体应用架构和垂直应用架构运用的都是本地过程调用。它允许程序调用另外一个地址空间(通常是网络共享的另外一台机器)的过程或函数,并且不用程序员显式编码这个远程调用的细节。而分布式架构应用与应用之间的远程调用就需要RPC框架来做,目的就是为了让远程调用像本地调用一样简单。Dubbo框架有以下部件Consumer即调用远程服务的服务消

本文目录

      前言

      在介绍Dubbo之前先了解一下基本概念:

      Dubbo是一个RPC框架,RPC,即Remote Procedure Call(远程过程调用),相对的就是本地过程调用,在分布式架构之前的单体应用架构和垂直应用架构运用的都是本地过程调用。它允许程序调用另外一个地址空间(通常是网络共享的另外一台机器)的过程或函数,并且不用程序员显式编码这个远程调用的细节。

      而分布式架构应用与应用之间的远程调用就需要RPC框架来做,目的就是为了让远程调用像本地调用一样简单。

      java开发分布式服务框架Dubbo原理机制的示例分析

      Dubbo框架有以下部件

      Consumer

      即调用远程服务的服务消费方,消费者需要面向接口编程,知道了哪些接口可以调用了,具体实现需要框架提供一个代理类来为接口提供具体实现,让消费者只管调用什么接口,而具体实现的获取由代理类来处理。

      消费者还需要提供调用方法名以及方法的参数值。

      但是代理类此时还不知道需要调用哪个服务器上的远程方法,此时需要一个注册中心,通过注册中心获取可以调用的远程服务列表。

      远程服务器一般都是集群部署,那么调用哪个服务器则需要通过负载均衡来选择一个最合适的服务器来调用。

      同时还需要有集群容错机制,因为各种原因,可能远程调用会失败,此时需要容错机制来重试调用,保证远程调用的稳定性。

      同时与服务提供方约定好通信协议和序列化格式,方便通信以及数据传输。

      Provider

      即暴露服务的服务提供方,服务提供方内部实现具体的接口,然后将接口暴露出去,再将服务注册到注册中心,服务消费方调用服务,提供者接收到调用请求后,通过约定好的通信协议来处理该请求,然后做反序列化,完成后,将请求放入线程池中处理,某个线程接收到这个请求然后找到对应的接口实现进行调用,然后将调用结果原路返回。

      Registry

      即服务注册与发现的注册中心,注册中心负责服务地址的注册与查找,相当于服务目录,服务提供者和消费者只会再启动时与注册中心交互,注册中心不转发请求,压力小。

      java开发分布式服务框架Dubbo原理机制的示例分析

      注册中心还可以集中化处理配置以及动态地将变更通知订阅方。

      但是为什么需要注册中心呢?没有注册中心不可以吗?

      在没有注册中心,各服务之间的调用关系是这样的:

      java开发分布式服务框架Dubbo原理机制的示例分析

      当服务越来越多时,服务URL配置管理变得非常困难,硬件负载均衡器的单点压力也越来越大,而有了注册中心之后,就可以实现服务的统一管理,并且实现软负载均衡,降低硬件成本,以下为注册中心示意图:

      java开发分布式服务框架Dubbo原理机制的示例分析

      Monitor

      即统计服务调用次数和调用时间的监控中心,面对众多服务,精细化的监控和方便的运维是不可或缺的,对后期维护相当重要。

      Container

      即服务运行的容器。

      架构

      java开发分布式服务框架Dubbo原理机制的示例分析

      图中的各个节点充当的角色已经介绍过了,以下是各节点之间调用关系:

      Container服务容器负责启动,加载以及运行

      Provider服务提供者Provider服务提供者启动时,需要将自身暴露出去让远程服务器可以发现,同时向Registry注册中心注册自己提供的服务

      Consumer服务消费者启动时,向Registry注册中心订阅所需要的服务

      Registry注册中心返回服务提供者列表给消费者,同时如果发生变更,注册中心将基于长连接推送实时数据给消费者

      服务消费者需要调用远程服务时,会从提供者的地址列表中,基于负载均衡算法选出一台提供者服务器进行调用,如果调用失败,会基于集群容错策略进行调用重试

      服务消费者与提供者会在内存中统计调用次数和调用时间,然后通过定时任务将数据发送给Monitor监控中心

      高可用性

      • 监控中心宕机后不会对服务造成影响,只是丢失部分统计数据

      • 注册中心集群后,任意一台宕机后,将自动切换到其他注册中心

      • 当所有注册中心均宕机后,服务提供者和消费者之间仍然能通过本地记录了彼此信息的缓存进行通讯,但是如果一方产生变更,另外一方无法感知

      • 服务提供者无状态,任意一台服务器宕机后不影响使用,会有其他服务提供者提供服务

      • 当所有服务提供者宕机后,服务消费者无法正常使用,将进行无限次重连等待服务提供者重新连线恢复

      框架设计

      java开发分布式服务框架Dubbo原理机制的示例分析

      大的分层为Business(业务逻辑层)、RPC层和Remoting层。

      再细分下来,Dubbo一共有十层架构,作用分别如下:

      Service,业务层,即日常开发中的业务逻辑层

      Config,配置层,对外配置接口,以ServiceConfig 和ReferenceConfig为中心,可以直接初始化配置类,也可以通过Spring解析配置生成配置类

      Proxy,服务代理层,服务接口透明代理,生成服务的客户端Stub和客户端Skeleton,负责远程调用和返回结果

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

      Cluster路由和集群容错层,封装了多个提供者的路由、负载均衡以及集群容错,并桥接注册中心,负责通过负载均衡选取调用具体的节点,处理特殊调用请求和负责远程调用失败的容错措施

      Monitor,监控层,负责监控统计RPC调用次数和调用时间

      Portocol,远程调用层,主要封装RPC远程调用方法

      Exchange,信息交换层,用于封装请求响应模型

      Transport,网络传输层,抽象化网络传输统一接口,有Mina和Netty可供使用

      Serialize,序列化层,将数据序列化成二进制流进行传输,也可以反序列化接收数据

      服务暴露过程

      首先Provider启动,Protocal通过Proxy代理将需要暴露的接口封装成Invoker,是一个可执行体,然后通过Exporter包装并发送到注册中心完成注册,至此服务就暴露完成。

      java开发分布式服务框架Dubbo原理机制的示例分析

      服务消费过程

      java开发分布式服务框架Dubbo原理机制的示例分析

      注:上图中蓝色部分为服务消费者,绿色部分为服务提供者。

      服务消费者启动时会向注册中心订阅并拉取所需服务提供者的信息,并保存到本地缓存,由此即使所有注册中心宕机后,服务提供者和服务消费者也可以通过本地缓存进行通讯,只是一方出现了信息变更,另一方无法感知,但并不影响服务的进行。

      之后整个服务消费流程从图中的Proxy开始,由代理类完成处理,以此到达透明无感知。

      ProxyFactory生成一个Proxy代理类,Proxy持有一个Invoker可执行对象,调用invoke之后需要通过Cluster从Directory中获取所有可调用的远程服务Invoker列表,如果配置了某些路由规则,还需要再过滤一遍Invoker列表。

      剩下的Invoker再通过LoadBalance做负载均衡选取一个,还需要再通过Filter进行一些数据统计,之后将这些数据保存下来,定时发送给Monitor。

      接下来用Client做数据传输,一般用Netty进行传输。

      传输需要通过Codec接口进行协议构造,然后再通过Serialization进行序列化,最后将序列化后的二进制流发送至给对应的服务提供者。

      服务提供者接收到二进制流后也会进行Codec协议处理,然后进行反序列化(此处的处理与传输之前的处理是呈对称的)后将请求放入线程池中处理,某个线程会根据请求找到对应的Exporter,然后再通过Filter进行层层过滤得到Invoker,最终调用对应的实现类然后将结果原路返回。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java Dubbo
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。