1.dubbo的工作原理

①整体设计

图例说明:

  • 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。

  • 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。

  • 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。

  • 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。

②dubbo的十层架构说明

  • service 接口层 :给服务提供者、服务消费者去实现。

  • config 配置层 :对外的配置接口,以ServiceConfig,REferenceConfig为中心,可以直接初始化配置类。也可以通过spring解析配置生成配置类。

  • proxy服务代理层 :服务接口透明代理,生成服务的客户端Stub和服务端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory。

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

  • cluster路由层 :封装多个提供者的路由与负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为cluster,Directory,Router,LoadBalance。

  • monitor监控层 :RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory,Monitor,MonitorService。

  • protocol远程调用层 :封装RPC调用,以Invocation,Result为中心,扩展接口为Protocol,Invoker,Exportor。

  • exchange信息交换层 :封装请求响应模式,同步转异步,以Request,Response为中心,扩展接口为Exchanger,ExchangeChannel,ExchangeClient,ExchangeServer。

  • transport网络传输层:抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel,Transporter,Client,Server,Codec。

  • serialize数据序列化层 :可以复用的一些工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool。

③关系说明

  • 在RPC中,Protocol是核心层,也就是只要有Protocol+Invoker+Exporter就可以完成非透明的RPC调用,然后在Invoker的过程上Filter拦截点。

  • 图中的Consumer和Provider是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用 Client 和 Server 的原因是 Dubbo 在很多场景下都使用 Provider, Consumer, Registry, Monitor 划分逻辑拓普节点,保持统一概念。

  • Cluster是外围概念,所有cluster的目的是将多个Invoker伪装成一个Invoker,这样其他人只要关注Protocol层Invoker即可,加上Cluster或者去掉Cluster对其他层都不会造成影响,因为只有一个提供者时,是不需要Cluster的。

  • Proxy层封装了所有接口的透明化代理,而在其它层都以Invoker为中心,只有暴露给用户使用时,才用Proxy将Invoker转为接口,或者将接口实现为Invoker,也就是去掉Proxy层的RPC是可以run的,只是不那么透明,不那么看起来向本地服务一样调用远程服务。

  • Remoting实现是dubbo协议的实现,如果你选择RMI协议,整个Remoting都用不上,Remoting内部再划分为transport传输层和exchange交换层,Transport层只负责单向消息传输,是对mina,netty,Grizzly的抽象,它可以扩展UDP传输,二Exchange层是在传输层之上封装了Request-Response语义。

  • Registry和Monitor实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在了一起。

2.dubbo的一次调用过程

暴露服务时序

暴露服务时序

简易通信过程示意图

3.注册中心挂了可以继续通信吗?

可以,因为刚开始初始化的时候,消费者会将提供者的地址等信息拉取到本地缓存,所以注册中心挂了可以继续通信

分布式的几件小事(二)dubbo的工作原理的更多相关文章

  1. 关于Mybatis的几件小事(二)

    一.MyBatis缓存机制 1.简介 Mybatis包含了一个非常强大的查询缓存的特性,它可以非常方便地配置和定制. 缓存key极大提高查询效率 MyBatis系统中默认定义了两次缓存 默认情况下,只 ...

  2. 说一下Dubbo 的工作原理?注册中心挂了可以继续通信吗?

    面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原理,比如 kaf ...

  3. 1.说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程?

    作者:中华石杉 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原 ...

  4. 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    关键词:android  camera CMM 模组 camera参数  CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...

  5. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    一.摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解.下面我们析摄像头从寄存器角度是怎么工作的.如何阅读摄像头规格书(针对驱动调节时用到关键参数,以GT2005为例). 规格书, ...

  6. dubbo的工作原理

    dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客户端的 ...

  7. 面试系列22 dubbo的工作原理

    (1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...

  8. 2020-05-27:SpringCloud用了那些组件?分布式追踪链怎么做的?熔断器工作原理?

    福哥答案2020-05-27: SpringCloud分布式开发五大组件详解服务发现——Netflix Eureka客服端负载均衡——Netflix Ribbon断路器——Netflix Hystri ...

  9. 说一下的dubbo的工作原理?注册中心挂了可以继续通信吗?

    (1)dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客 ...

随机推荐

  1. Error:java: 错误: 不支持发行版本 5

    本文链接:https://blog.csdn.net/wo541075754/article/details/70154604 在Intellij idea中新建了一个Maven项目,运行时报错如下: ...

  2. 在sed中引入shell变量的四种方法

    1.eval sed ’s/$a/$b/’ filename2.sed "s/$a/$b/" filename3.sed ’s/’$a’/’$b’/’ filename 4.sed ...

  3. 再谈用Excel计算年龄

    有的时候,对于客人的信息并不是全知,那么身份证就可能用15位来代替,这个时候怎么计算年龄呢?有一个很简单的公式,可以一次性计算15位或18位身份证的年龄. 首先,需要判断一下,这个身份证是15位还是1 ...

  4. CoordinatorLayout使用全解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012124438/article/details/56701641 CoordinatorLayo ...

  5. PMML辅助机器学习算法上线

    在机器学习用于产品的时候,我们经常会遇到跨平台的问题.比如我们用Python基于一系列的机器学习库训练了一个模型,但是有时候其他的产品和项目想把这个模型集成进去,但是这些产品很多只支持某些特定的生产环 ...

  6. RN在Mac环境下开发环境搭建

    1.推荐使用Homebrew来安装 Node 和 Watchman.在命令行中执行下列命令安装: brew install node brew install watchman 如果你已经安装了 No ...

  7. Ubunut16.04 安装 Mahout

    近期笔者想安装mahout,看到网上教程过于陈旧,故记录之 转载请包含 http://www.cnblogs.com/lqruui/p/6037680.html 1.下载mahout   mahout ...

  8. Python之数据库操纵工具

    前言 基于原生模块:pymysql 推荐教程 Python 数据库处理的类库 pymysql [python原生模块] SQLAchemy [ORM框架] Python3 MySQL 数据库连接 - ...

  9. springboot子模块 @Autowired无法找到其他模块的接口和类的解决方法

    在main的启动类上添加 @SpringBootApplication(scanBasePackages = {"com.shangsheng"})或者@ComponentScan ...

  10. C#反射动态创建实例并调用方法

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...