cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...

前言

平常我们在构建分布式系统的时候,一般都是基于 Dubbo 技术栈或者是SpringCloud 技术栈来做。早期其实最先比较流行的是Dubbo,我记得我们当时有个部分的老大就是用的是Dubbo 来构建的一个系统,到后面才出来的 SpringCloud,由于它是基于 Spring 生态建立起来的,提供了一整套微服务组件,功能齐全,大受中小型公司开发者的青睐。

但是现在还是有不少公司没有换成 SpringCloud 来做微服务的东西,还是基于 Dubbo,面试的时候不管是 SpringCloud 也好,Dubbo 也罢,基本上都会提到这两个框架的底层原理。你想尝试一下高级的职位,基本上跑不脱这个问题。

OK,今儿我们就大概聊聊 Dubbo 的底层架构原理吧。

服务注册中心

分布式系统里面这个是必备的,服务提供者跟服务消费者都在启动的时候都会注册到服务注册中心来。服务注册中心会记录。

动态代理层 Proxy

通常这些框架大多数采用的思想都是通过对你的方法,接口生成一个代理对象,然后在这个代理对象里面去写它的功能。

所以这里我们需要每个服务都需要提供接口出来,在发起服务调用执勤,会创建一个动态代理对象,在我们的消费者中只有一个接口,我们可以认为动态代理类相当于为这个接口动态的创建一个实体类出来,然后用动态带来对象进行接口调用。

Cluster 集群层

我们准备好了要去调用了远程服务的接口,那么现在问题是我们的服务提供者会部署多台机器,那么我们到底去调用哪台机器呢?怎么选择?

此时动态代理对象回去找一个叫 Cluster 这层的东西,这层就负责具体要调用哪一台机器。

那么 Cluster 层就必须得拿到有哪些机器对不对,不然怎么选呢。那么这个过程就叫做动态感知。

Cluster 里面有很多组件,比如 Directory、Router 还有LoadBalance ,此时就会使用负载均衡组件 LoadBlance 挑选一台机器。到这里,机器就选好了。

protocol 协议层

这层主要就是选择一种协议来组织我们的请求。

Dubbo支持的协议很多,包括:dubbo、rmi、hessian、http、webservice、thrift、memcached、redis等。默认使用dubbo 协议。

Exchange 信息交换层

这层最主要的目的就是把我们的请求数据包装成 Request 或者 Response 。

Transport 网络通信层

现在我们挑选好了机器,也把请求按照协议进行组织好了,并且封装好了请求。那么这个请求怎么发送到服务提供者的哪台机器呢?

此时我们就需要选择一个网络通信的框架。由他来负责把你的请求通过网络发送过去。比如比较常见的 netty、mina 等。

在发送过去之前,还得对请求进行序列化。序列化有多种方式可以选择,比如Json、Protobuf、Protostuff、Hessian、Kryo等、Java序列化等等。

服务消费者接受到请求后的处理

那么服务提供者怎么才能收到这个请求呢?此时服务提供者里面也得需要一个网络通信框架,他去监听你开放的某个端口,比如就启动一个 netty 去监听消费者发送过来的请求。

接受到请求过后,然后进行反序列化,然后,前面我们发过来的是 通过 Exchange 层包装的 Request 请求,那么这里也需要 这层来对 请求进行解析。解析的时候,也需要根据一种协议来进行解析。

实际上 解析完成请求以后,还会创建一个动态代理对象,再去调用我们的服务提供者接口,最后返回数据。

整个调用流程图

希望你在面试的时候,能够给面试官画出来这个图。

f6d6ac172c24f40b6e2229b5318eac5a.png

参考资料

可能面试的时候还会有更多的细节,那么根据上面大体的几层,一层一层的了解各自的细节。这样子可能会更有把握一些。

dubbo 中文文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

Dubbo 实现原理及架构详解:http://crazyfzw.github.io/2018/06/10/dubbo-architecture/[1]

把上面的图了解了,再去看官方的,我认为会更好一些。

关注我的头条号并在后台私信我:555,即可(获取Java高级架构资料)。

不知道怎么私信的朋友可以关注公众号:Java耕耘者。(点击小助理获取)

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

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

相关文章

包含对流环热,热流边界,等温边界的稳态热传导方程的FEM求解。

以下面的问题为例:对于如图所示的平面传热问题, 若上端有给定的热流-2W/m2,即从下往上传输热量,结构下端有确定的温度100,周围介质温度为20,在两侧有换热,换热系数为α100W/㎡/K,热导…

php安装扩展步骤,PHP扩展安装方法步骤解析

php扩展安装方法极简单. 也遵循3大步.但多出一个phpize的步骤.1.pecl.php.net 在右上解的输入框 中输入需要的扩展 比如 redis2.搜索完成后会看到两个蓝色的框 . 下方有个表格. 表格内容如 search results (1 of 1) 再下面有一行不起眼的结果. 其中就有一个redis(搜索什么显示什…

python生成动态二维码实例_python生成动态个性二维码(示例代码)

1 安装工具 2 生成普通二维码 3 带图片的二维码 4 动态 GIF 二维码 5 在Python程序中使用 一、安装 首先在python环境下运行, 打开cmd进入python27 进入scripts 然后在scripts输入命令:pip install myqr二、 生成普通二维码 安装了 myqr 之后&#xff0c…

MFC取消菜单栏

在CMainFrame的OnCreate()中添加如下代码://去掉标题栏及其他样式SetWindowLong(this->m_hWnd,GWL_STYLE,0);//去掉边框及其他样式SetWindowLong(this->m_hWnd,GWL_EXSTYLE,0);//取消菜单栏this->SetMenu(NULL); 在CView中的OnCreate()中也去掉边框 //去掉…

php的cookie变量作用,PHP语言中cookie的作用

PHP语言中cookie的作用时间:2015-11-9Cookie的概念最早是由Netscape在1994年提出来的,它是保存在浏览器中的小信息包,更确切地说,Cookie是保存在客户端硬盘里的,由字符串组成的小文本文件.文本文件的命令格式如下;用户名网站地址[数字].txt举个例子,如果用户在系统盘…

如何查看Linux版本号(内核版本号和发行版本号)

首先,要分清内核版本号和发行版本号的区别。 因为所有linux都是使用kernel.org上来的内核来作为发行版的基础的,所以内核版本号的高低大致能体现该linux版本的新旧。 而发行版本的版本号完全是各发行商自己定义的,不能用来和其它发行版本的版…

matlab武汉理工大学数值分析线性函数拟合实验_「首席架构师推荐」数值计算库精选...

这是一个著名的数值库列表,这些库用于软件开发中执行数值计算。它不是一个完整的列表,而是一个包含Wikipedia上文章的数字库列表,很少有例外。典型库的选择取决于一系列不同的需求,例如:期望的特性(例如:大维线性代数、并行计算、…

DCE和DTE的区别

DCE(数据通信设备或者数据电路终端设备):该设备和其与通信网络的连接构成了网络终端的用户网络接口。它提供了到网络的一条物理连接、转发业务量,并且提供了一个用于同步DCE设备和DTE设备之间数据传输的时钟信号。调制解调器和接口…

php 弹出保存对话框,如何在不将页面留在PHP中的情况下强制保存为对话框?

当使用StijnvanBael的代码时,请小心,它会使您面临一些严重的安全漏洞攻击。尝试以下方法:--- download.php ---$allowed_files array(file.pdf, otherfile.pdf);if (isset($_REQUEST[file]) && in_array($_REQUEST[file], $allowed_files)){$filename $_REQUEST[file…

JSONP跨域原理和jQuery.getJSON用法

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。本文主要介绍JSONP跨域原理,一起来看。 JSONP是一个非官方的协议&…

window10安装python2.7_window10下python2.7安装pip报错

get-pip.py 文件内容来源于(将网页内容保存) https://bootstrap.pypa.io/get-pip.py 报错信息 D:\softs\python\Python27>python get-pip.py DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 wont…

DAHDI与Zaptel

1、DAHDI是什么? DAHDI表示DigiumAsterisk Hardware Device Interface,Zaptel是"ZapataTelephony"的缩写。 2、DAHDI的由来 Kevin Fleming是这样介绍DAHDI的来由的:“大约2006年,ZapTel商标的持有人找上我们&#x…

php判断桌面宽度,js获取页面宽度高度及屏幕分辨率

网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offsetWidth (包括边线的宽);网页可见区域高: document.body.offsetHeight (包括边线的宽);网页正文全…

串口输出5v电压_为什么RS485比串口速度快距离远?--谈单端信号与差分信号之差异...

嵌入式系统中,串口、RS485、CAN、网络和USB等都是非常常用的通信方式。但是串口通信速度慢,距离近,为什么转换成RS485后,通信距离和速度都大幅提高了呢?USB也是近距离,为什么速度可以这么快?原因…

IIS7.0站点/虚拟目录中访问共享

目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上) 准备工作1.运行组策略编辑器(gpedit.msc);找到本地安全策略-本地策略-安…

易语言操作php文本文件,易语言对文本操作的步骤教学

在易语言编程中,我们往往需要对一些文字进行截取或分割出来,如何准确、快速的实现这一目标呢?下面笔者来为大家演示1、首先,我们打开易语言编程软件,点击左上角,新建一个文件,如图所示2、我们点…

Asterisk入门系列

什么是asterisk?开源电话平台 Asterisk 通过了电话的开源平台。基本上就是一个软件的PBX。 最初是Digium 公司的Mark Spencer编写的,这个公司就是他创立的,专门生产并销售Asterisk使用的硬件。Asterisk简直就是一场电话的革命。 为什么使用Asterisk&…

xxl-job 执行结果是空_xxljob dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量…

两千内给力的大屏手机(二)

一看标题就知道哈,这是接着上次来说的呢,上次介绍了四款手机,这次介绍剩下的四款,大家看好了啊 1、HTC T329t双核 你还没有忘记新渴望 VT这款产品吧,作为HTC和移动推出的性价比大众智能产品,新渴望 VT在上市…

php5.4 windows2003,PHP实战:Windows2003下php5.4安装配置教程(IIS)

《PHP实战:Windows2003下php5.4安装配置教程(IIS)》要点:本文介绍了PHP实战:Windows2003下php5.4安装配置教程(IIS),希望对您有用。如果有疑问,可以联系我们。PHP教程一、在Windows2003安装IISPHP教程1、首先打开Windo…