Dubbo 框架是用来处理分布式系统中,服务发现与注册以及调用问题的,并且管理调用过程。
一,工作流程:

  • 服务提供者在启动的时候,会通过读取一些配置将服务实例化。
  • Proxy 封装服务调用接口,方便调用者调用。客户端获取 Proxy 时,可以像调用本地服务一样,调用远程服务。
  • Proxy 在封装时,需要调用 Protocol 定义协议格式,例如:Dubbo Protocol。
  • 将 Proxy 封装成 Invoker,它是真实服务调用的实例。
  • 将 Invoker 转化成 Exporter,Exporter 只是把 Invoker
    包装了一层,是为了在注册中心中暴露自己,方便消费者使用。
  • 将包装好的 Exporter 注册到注册中心。
  • 服务消费者建立好实例,会到服务注册中心订阅服务提供者的元数据。元数据包括服务 IP 和端口以及调用方式(Proxy)。
  • 消费者会通过获取的 Proxy 进行调用。通过服务提供方包装过程可以知道,Proxy 实际包装了 Invoker 实体,因此需要使用
    Invoker 进行调用。
  • 在 Invoker 调用之前,通过 Directory 获取服务提供者的 Invoker
    列表。在分布式的服务中有可能出现同一个服务,分布在不同的节点上。
  • 通过路由规则了解,服务需要从哪些节点获取。
  • Invoker 调用过程中,通过 Cluster 进行容错,如果遇到失败策略进行重试。
  • 调用中,由于多个服务可能会分布到不同的节点,就要通过 LoadBalance 来实现负载均衡。
  • Invoker 调用之前还需要经过 Filter,它是一个过滤链,用来处理上下文,限流和计数的工作。
  • 生成过滤以后的 Invoker。
  • 用 Client 进行数据传输。
  • Codec 会根据 Protocol 定义的协议,进行协议的构造。
  • 构造完成的数据,通过序列化 Serialization 传输给服务提供者。
  • Request 已经到达了服务提供者,它会被分配到线程池(ThreadPool)中进行处理。
  • Server 拿到请求以后查找对应的 Exporter(包含有 Invoker)。
  • 由于 Export 也会被 Filter 层层包裹
  • 通过 Filter 以后获得 Invoker
  • 最后,对服务提供者实体进行调用。

二、各个部分整体机制
1、提供者暴露服务的整体机制:

  • 在服务提供者初始化的时候,会通过 Config 组件中的 ServiceConfig 读取服务的配置信息。这个配置信息有三种形式,分别是 XML 文件,注解(Annoation)和属性文件(Properties 和 yaml)。

  • 在读取配置文件生成服务实体以后,会通过 ProxyFactory 将 Proxy 转换成 Invoker。

  • 此时,Invoker 会被定义 Protocol,之后会被包装成 Exporter。

  • 最后,Exporter 会发送到注册中心,作为服务的注册信息

2.注册中心
其主要作用如下:

  • 动态载入服务
  • 动态发现服务
  • 参数动态调整
  • 服务统一配置管理

  • 提供者(Provider)启动时,会向注册中心写入自己的元数据信息(调用方式)。
  • 消费者(Consumer)启动时,也会在注册中心写入自己的元数据信息,并且订阅服务提供者,路由和配置元数据的信息。
  • 服务治理中心(duubo-admin)启动时,会同时订阅所有消费者,提供者,路由和配置元数据的信息。
  • 当提供者离开或者新提供者加入时,注册中心发现变化会通知消费者和服务治理中心。

Dubbo 有四种注册中心的实现,分别是 ZooKeeper,Redis,Simple 和 Multicast。
ZooKeeper 是负责协调服务式应用的。通过树形文件存储的 ZNode 在 /dubbo/Service 目录下面建立了四个目录,分别是:

Providers 目录下面,存放服务提供者 URL 和元数据。
Consumers 目录下面,存放消费者的 URL 和元数据。
Routers 目录下面,存放消费者的路由策略。
Configurators 目录下面,存放多个用于服务提供者动态配置 URL 元数据信息。

客户端第一次连接注册中心的时候,会获取全量的服务元数据,包括服务提供者和服务消费者以及路由和配置的信息。

根据 ZooKeeper 客户端的特性,会在对应 ZNode 的目录上注册一个 Watcher,同时让客户端和注册中心保持 TCP 长连接。

如果服务的元数据信息发生变化,客户端会接受到变更通知,然后去注册中心更新元数据信息。变更时根据 ZNode 节点中版本变化进行。

3.服务消费者

服务消费者首先持有远程服务实例生成的 Invoker,然后把 Invoker 转换成用户接口的动态代理引用,服务引用的入口点在 ReferenceBean

4.Dubbo 集群容错
分布式服务多以集群形式出现,在消费服务发起调用的时候,会涉及到 Cluster,Directory,Router,LoadBalance 几个核心组件。

cluster生成 Invoker 对象后就获取可调用的服务列表,在 Directory 获取所有 Invoker 列表之后,会调用路由接口(Router)。其会根据用户配置的不同策略对 Invoker 列表进行过滤,只返回符合规则的 Invoker。生成的 Invoker服务有可能分布在不同的节点上面。所以,需要经过 LoadBalance。

5.Dubbo 远程调用
服务消费者经过容错,Invoker 列表,路由和负载均衡以后,会对 Invoker 进行过滤,之后通过 Client 编码,序列化发给服务提供者。

dubbo原理和机制相关推荐

  1. Dubbo 原理和机制详解

    Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案.作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利. 1. Dubbo核心功能 Dubbo主要提供 ...

  2. Dubbo原理和机制详解(非常全面)

    Dubbo是一款Java RPC框架,致力于提供高性能的RPC远程服务调用方案.Dubbo 作为主流的微服务框架之一,为开发人员带来了非常多的便利. 本文我们重点详解 Dubbo 的原理机制 @mik ...

  3. dubbo原理和机制_面试官几个 Dubbo 微服务框架问题,把我整懵了?

    Dubbo本身并不复杂,而且官方文档写的非常清楚详细,面试中dubbo的问题一般不会很多,从分层到工作原理.负载均衡策略.容错机制.SPI机制基本就差不多了,最大的一道大题一般就是怎么设计一个RPC框 ...

  4. Dubbo服务Spi机制和原理

    ​ 什么是Dubbo的spi机制? SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置 ...

  5. Dubbo的原理和机制

    Dubbo :是一个RPC框架,SOA框架: Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 作为RPC:支持各种 ...

  6. Dubbo的底层实现原理和机制

    Dubbo :是一个RPC框架,SOA框架: Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 作为RPC:支持各种 ...

  7. Spring - Dubbo的底层实现原理和机制

    Dubbo :是一个RPC框架,SOA框架: Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 作为RPC:支持各种 ...

  8. 【Dubbo原理】(一)Dubbo的微内核架构及SPI机制

    文章目录 Dubbo的微内核架构及SPI机制 1.什么是微内核架构 1.1.基本架构 1.2.设计关键点 2.Dubbo中的微内核架构 2.1.Dubbo的分层 2.2.Dubbo的插件模块 2.3. ...

  9. Dubbo原理和源码解析之服务引用

    github新增仓库 "dubbo-read"(点此查看),集合所有<Dubbo原理和源码解析>系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行 ...

最新文章

  1. 年度书单盘点 | 史上最卷考研潮过后,这十本书让你不再迷茫
  2. python 关键字 及代码
  3. mysql与php驱动,用PHP和MySQL构建一个数据库驱动的网站(四)-PHP教程,PHP基础
  4. war项目主页跳转找不到_找不到优秀的开源项目?快来看看 11 月入选的码云 GVP...
  5. Go性能测试benchmark
  6. linux C++怎么转java?从云计算切入容易么?
  7. 对症下药教你清除电脑中的木马
  8. Tokyo Tyrant安装和配置
  9. 【计算机网络复习 物理层】2.3 物理层设备
  10. JAVA中关于set()和get()方法的理解及使用
  11. h5在Android里文字位置偏下,【CSS】如何解决安卓上按钮文字偏上的问题
  12. java 路径不存在则创建_java中判断目录是否存在,若不存在则创建
  13. wordpress代码高亮插件coolcode
  14. 10.企业安全建设指南(金融行业安全架构与技术实践) --- 安全预算、总结与汇报
  15. cmd查看所有数据库 db2_db2数据库常用操作命令大全
  16. am信号包络检波matlab,高频课程设计AM信号包络检波器
  17. ZigBee模块学习
  18. itext设置字体间距_设计时sketch中字体行高到底该如何设置
  19. 企业微信和个人微信的区别
  20. 今天结束了ie被劫持的生活

热门文章

  1. SSE:使用HTTP做服务端数据推送的技术及其他通信技术
  2. Android端连接ActiveMQ服务器
  3. 一个成功男人30岁前应该完成的那些事情
  4. ubuntu安装时系统分区设置
  5. 《OC疯狂讲义》笔记(三)
  6. JS数组中的 slice() 方法
  7. Android使用WebView加载网页及数据
  8. PHP扩展 zqf 兼容7.0
  9. FFmpeg入门详解之127:GB28181平台安装部署过程 - 可接入海康、大华、华为、科达、宇视等等设备和平台
  10. 嘉一机电告诉你胶球清洗装置好不好用(附安装示意图)