官方文档: Dubbo 框架设计、模块说明、依赖关系

 

以下内容全文转自 apache 官方 dubbo文档:http://dubbo.apache.org/en-us/docs/dev/design.html

 

框架设计

/dev-guide/images/dubbo-framework.jpg

 

图片描述:

  • 浅蓝色背景的左侧区域显示服务用户界面,浅绿色背景的右侧区域显示服务提供者界面,中心区域显示两个侧面界面。
  • 图像从底部到顶部分为10层,这些层是单向依赖的。右侧的黑色箭头表示层之间的依赖关系,每层可以从上层剥离以重复使用,Service和Config层是API,其他层是SPI。
  • 绿框是扩展接口,蓝框是实现类,图像仅显示关联层的实现类。
  • 蓝色虚线是初始化过程,启动时为装配链,方法调用过程为红线,运行时调用链,继承紫色三角箭头,可将子类视为父类的同一节点,文本为lines是方法调用。

图层描述

  • config层:外部配置界面,ServiceConfig并且ReferenceConfig是图层的中心,可以直接初始化配置类,也可以通过spring生成配置类。
  • 代理层:服务接口的透明代理,生成客户端Stub服务和服务器Skeletion of service,ServiceProxy是中心,扩展接口是ProxyFactory
  • 注册表层:服务注册表和发现的封装,服务URL是中心,扩展接口是RegistryFactoryRegistryRegistryService
  • 簇层:muliple提供商和负载平衡,和桥接登记中心的簇的封装,Invoker是中心,扩展接口是ClusterDirectoryRouterLoadBalance
  • 监控层:的RPC调用倍显示器和呼叫执行时间,Statistics是中心,扩展接口是MonitorFactoryMonitorMonitorService
  • 协议层:RPC的封装,Invocation并且Result是中心,扩展接口是ProtocolInvokerExporter
  • 交换层:的请求和响应,同步传输异步封装,Request并且Response是中心,扩展接口是ExchangerExchangeChannelExchangeClientExchangeServer
  • 传输层:米娜和网状的抽象,Message是中心,扩展接口是ChannelTransporterClientServerCodec
  • 序列化层:可重复使用的工具,扩展接口SerializationObjectInputObjectOutputThreadPool

关系描述

  • 在RPC中,Protocol是核心层,它意味着您可以通过Protocol + Invoker + Exporter完成RPC调用,然后在Invoker的主进程中进行过滤。
  • Consumer和Provider是抽象概念,只是希望您能更直观地了解哪些类属于客户端和服务器端,不使用Client和Server的原因是Dubbo使用Provider,Consumer,Registry,Monitor划分逻辑拓扑节点。场景,保持团结的概念。
  • Cluster是外部概念,Cluster的目的是让各种Invoker伪装成一个Invoker,这样我们只关注Invoker in Protocol层,添加Cluster或删除Cluster不会影响其他层,因为我们不需要Cluster什么时候只有一个提供者。
  • Proxy层封装了所有接口的透明代理,在Invoker作为中心的其他层中,将Invoker转换为接口,或者仅在暴露给用户时将接口实现转换为Invoker by Proxy。RPC仍然可以工作,甚至删除代理层,但不是那么透明,使得远程服务调用看起来不像本地服务调用。
  • 远程处理是Dubbo协议的实现,如果选择RMI,您可以删除远程处理。Remoting分为Transport层和Exchange层,Transport层负责单向消息传输,它是Mina,Netty,Grizzly的抽象,它还可以扩展UDP传输。Exchange层在传输层上封装了Request-Response语义。
  • 实际上Registry和Monitor不在同一层,它们是独立的节点,只是为了全局视图而一层一层地绘制它们。

模块包装

/dev-guide/images/dubbo-modules.jpg

模块说明:

  • dubbo-common模块:包括Util类和通用模块。
  • dubbo-remoting模块:是Dubbo协议实现,如果使用RMI for RPC则无需使用此模块。
  • dubbo-rpc模块:各种协议的抽象,和动态代理,只有一对一的调用,不关心集群的管理。
  • dubbo-cluster模块:将许多服务提供者伪装成一个提供者,包括负载平衡,容错,路由等。群集的地址列表可以是静态的,也可以是注册表发送的。
  • dubbo-registry模块:基于注册表发送地址的集群和各种注册中心的抽象。
  • dubbo-monitor模块:服务呼叫时间统计,呼叫时间,呼叫链跟踪服务。
  • dubbo-config模块:是Dubbo外部API,用户使用Dubbo by Config,隐藏Dubbo的详细信息。
  • dubbo-container模块:是一个Standlone容器,只需使用Main方法加载Spring,因为通常服务不需要Tomcat / JBoss功能。

包层根据层结构划分,与层划分的区别:

  • 容器是服务容器,用于服务运行部署,未在映像中显示。
  • 协议层和代理层都放在RPC模块中,它们是RPC模块的核心,当只有1个提供者时,可以使用这2层完整的RPC调用。
  • 传输层和交换层放置在远程模块中,用于RPC呼叫基础通信。
  • 序列化层放在通用模块中,以便重用。

依赖关系

/dev-guide/images/dubbo-relation.jpg

图片描述:

  • 图像,协议,群集,代理,服务,容器,注册表,监视器中的框表示层或模块,蓝调表示与业务交互,绿色表示仅与Dubbo的内部交互。
  • 图像,消费者,提供者,注册表,监视器中的背景框表示部署逻辑拓扑节点。
  • 调用图像中的蓝色虚线进行初始化,为运行时异步调用红色虚线,并为运行时同步调用红线。
  • 图像仅包含RPC层,不包括Remoting层,整个Remoting隐藏在Protocol层中。

调用链

展开整个设计地图的红色调用链:

/dev-guide/images/dubbo-extension.jpg

公开服务顺序

展开服务提供者公开服务的初始化链,在整个设计图的左侧,序列图如下所示:

/dev-guide/images/dubbo-export.jpg

参考服务序列

展开服务使用者参考服务的初始化链,在整个设计图的右侧,序列图如下所示:

/dev-guide/images/dubbo-refer.jpg

领域模型

达博的核心领域模型:

  • 协议是服务域,它是Invoker暴露和参考的主要功能入口,它负责Invoker的生命周期管理。
  • Invoker是实体域,它是Dubbo的核心模型,所有其他模型都受到干扰,或转换为它,它代表一个可执行文件,你可以通过调用invoke来调用它,它可以是一个本地实现,一个远程实现,或者集群实现。
  • 调用是会话域,它在调用进程中保存变量,例如方法名称,参数等。

基本设计原则

  • 使用Microkernel + Plugin设计模式,Microkernel只负责组装插件,Dubbo的功能是通过扩展点实现的,这意味着Dubbo的所有功能都可以被用户自定义扩展替换。
  • 使用URL作为配置信息的startdard格式,所有扩展点都通过URL传输配置信息。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些花儿

今天上海下雨了,心绪也变得低落,突然很想念宿舍的姐妹。毕业后就自作聪明地和她们失去了联系,今天去QQ群遛了一圈。虹结婚了,敏还是活得那么潇洒,笑也在努力地生活... 人生啊!总是在向前走,遇…

CreateRemoteThread函数

CreateRemoteThread函数 创建在另一个进程的虚拟地址空间中运行的线程。 使用CreateRemoteThreadEx函数创建在另一个进程的虚拟地址空间中运行的线程,并可选择指定扩展属性。 语法 HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRI…

防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件

虚拟机新装了一个CentOs7,然后做防火墙配置的时候找不到iptables文件,解决方法如下: 因为默认使用的是firewall作为防火墙,把他停掉装个iptable systemctl stop firewalld systemctl mask firewalld yum install -y iptables yum …

如果风 知道 ... 如果云 知道 ...

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 //《心灵之音》----- Bandari 来自酷狗。 一直很喜欢听歌: 喜欢默默的听、一个人安安静静的听、长长久久的听、听得忘乎所…

切记!这样洗头最伤身

各种的忙碌已经成为了现代人生活中的一个标志,每天的加班,玩乐到深夜,游戏等,都让不少的人的洗澡时间都只能在临睡前,而女人洗头也只能在晚上临睡之前洗。如果可以有足够的时间,等待头发完全干透了之后&…

可以供MFC调用的,QT实现的DLL(qtwinmigrate实现)

MFC和QT的消息循环机制不同&#xff0c;所以&#xff0c;要让QT写的DLL可以供MFC调用&#xff0c;要做一点特殊的处理 #include <qmfcapp.h> #include <qwinwidget.h> #include <QtGui>#include <QtGui/QMessageBox> #include <windows.h> #incl…

离合器的操作技巧

学车其实不难&#xff0c;学车最基本的几个操作&#xff0c;打方向盘、踩离合、踩刹车、换档位都是学员需要必学的基本操作&#xff0c;在网络驾校上有学员反应&#xff0c;对离合器的操作比较难&#xff0c;经常错误操作造成熄火等现象&#xff0c;现在泸州驾校论坛小编整理了…

Linux 上 安装 nginx、 阿里云服务器上安装 nginx

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Docker 方式安装见另一文&#xff1a;Docker 方式安装 Nginx 、阿里云服务器上装 Ngnix 1. gcc 安装 安装 nginx 需要先将官网下载的源…

CSDN-markdown编辑器使用说明

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

本地Android源代码库下载源码

1. 安装repo 新建放置repo的bin目录 $ mkdir ~/bin $ echo "export PATH~/bin:\$PATH" >> ~/.bashrc$ source ~/.bashrc 获取repo并赋予可执行权限&#xff08;或者参考google官方网站&#xff09; $ curl https://storage.googleapis.com/git-repo-downloads/…

解决: Spring Boot报错 This application has no explicit mapping ... a fallback

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 启动spring boot然后访问页面的时候&#xff0c;出现如下错误&#xff1a; Whitelabel Error PageThis application has no explicit m…

三种钱非常奥妙 花越多就赚越多

世界上有三种钱非常奥妙&#xff0c;你花得越多就赚得越多。这是学校老师不会教的事&#xff0c;让我们看看&#xff1a; 第一种钱&#xff1a;投资自己&#xff0c;自我成长&#xff0c;学习的钱一定要花&#xff01; 如果我们把世界首富比尔.盖茨从美国抓到非洲&#xff0c…

#pragma once 与 #ifndef比较分析

为了避免同一个文件被include多次&#xff0c;C/C中有两种方式&#xff0c;一种是#ifndef方式&#xff0c;一种是#pragma once方式。在能够支持这两种方式的编译器上&#xff0c;二者并没有太大的区别&#xff0c;但是两者仍然还是有一些细微的区别。 方式一&#xff1a; #ifn…

中医:看脚十秒钟可知身体疾病

中医认为&#xff0c;自测疾病有很多方法&#xff0c;如通过身体部位可自测疾病&#xff0c;还可通过疼痛自测疾病等等。在这里&#xff0c;我们主要讲如何通过脚自测疾病。也许&#xff0c;许多人不太在意自己的脚部&#xff0c;是最不受“照顾”的一个身体部位。然而&#xf…

Springcloud 引导上下文

SpringCloud为我们提供了bootstrap.properties的属性文件&#xff0c;我们可以在该属性文件里做我们的服务配置。可是&#xff0c;我们知道SpringBoot已经为我们提供了做服务配置的属性文件application.properties&#xff0c;那么这两个配置文件有什么区别呢&#xff1f;在Spr…

Springboot 项目中过滤器的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 编写过滤器类&#xff1a; package gentle;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.se…

C++ 中 new 操作符内幕:new operator、operator new、placement new

一、new 操作符&#xff08;new operator&#xff09; 人们有时好像喜欢有意使C语言的术语难以理解。比方说new操作符&#xff08;new operator&#xff09;和operator new的差别。 当你写这种代码&#xff1a; string *ps new string("Memory Management");你使…

Flask-1-05-CookieSession

接下来我会演示一下设置Cookie 读取Cookie 删除Cookie&#xff0c;以及添加Cookie的原理 接下来我们分别定义3个视图为 set_cookie、get_cookie、del_cookie # coding:utf-8from flask import Flask, make_response, requestapp Flask(__name__)app.route("/set_cookie&q…

18个不可不知的有用潜规则

人情世故是我们日常生活中积累的约定俗成的行为规则&#xff0c;属于社会知识的范畴。这些知识大半来源于与不同人群的社会交际&#xff0c;也来源于社会冲突与社会发展。在有专业知识与技能的情况下&#xff0c;人情世故能够帮助我们个人缓和与其他人之间的紧张度&#xff0c;…

解决跨域问题:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;如果遇到 这个问题 Request header field Content-Type is not allowed by Access-Control-Allow-Headers&#xff0c;解…