纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Dubbo分布式服务框架原理机制 java开发分布式服务框架Dubbo原理机制详解

Dubbo原理机制详解   2021-11-20 我要评论
想了解java开发分布式服务框架Dubbo原理机制详解的相关内容吗Dubbo原理机制详解在本文为您仔细讲解Dubbo分布式服务框架原理机制的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java分布式服务框架,Dubbo原理机制下面大家一起来学习吧。

前言

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

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

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

在这里插入图片描述

Dubbo框架有以下部件

Consumer

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

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

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

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

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

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

Provider

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

Registry

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

在这里插入图片描述

Monitor

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

Container

即服务运行的容器。

架构

在这里插入图片描述

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

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

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

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

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

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

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

高可用性

  • 监控中心宕机后不会对服务造成影响只是丢失部分统计数据
  • 注册中心集群后任意一台宕机后将自动切换到其他注册中心
  • 当所有注册中心均宕机后服务提供者和消费者之间仍然能通过本地记录了彼此信息的缓存进行通讯但是如果一方产生变更另外一方无法感知
  • 服务提供者无状态任意一台服务器宕机后不影响使用会有其他服务提供者提供服务
  • 当所有服务提供者宕机后服务消费者无法正常使用将进行无限次重连等待服务提供者重新连线恢复

框架设计

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

Transport网络传输层抽象化网络传输统一接口有MinaNetty可供使用

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

服务暴露过程

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

在这里插入图片描述

服务消费过程

在这里插入图片描述

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

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

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

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

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

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

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

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

如有错误或不足欢迎评论指正。


相关文章

猜您喜欢

  • Python抢购脚本 Python抢购脚本的编写方法

    想了解Python抢购脚本的编写方法的相关内容吗python可乐编程在本文为您仔细讲解Python抢购脚本的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Python抢购脚本,Python抢购脚本写法下面大家一起来学习吧。..
  • C语言 烟花 给喜欢的人用C语言写烟花

    想了解给喜欢的人用C语言写烟花的相关内容吗MAX在码字在本文为您仔细讲解C语言 烟花的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C语言,烟花,C语言,实例下面大家一起来学习吧。..

网友评论

Copyright 2020 www.tdogsoftware.com 【零度软件园】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式