| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> DUBBO源码应用总结十三---服务调用过程 -> 正文阅读 |
|
[网络协议]DUBBO源码应用总结十三---服务调用过程 |
"2021SC@SDUSC" 1. 什么是远程过程调用在讲述 Dubbo 的服务调用过程之前,让我们先来了解一下什么是远程过程调用。 远程过程调用即 举个最简单的栗子,假设现在有一个电商系统,其中有着用户服务,优惠券服务,订单服务等服务模块,这些不同的服务并不是运行在同一个 JVM 中,而是分开运行在不同的 JVM 中。因此,当订单服务想要调用优惠券服务时,就不能像以前的单体应用一样,直接向对应服务发起本地调用,只能够通过网络来发起调用。 那么,一个最简单的远程过程调用是怎么样的呢?来看下面这张图。 也就是说,一次最简单的 RPC 调用,无非就是调用方通过网络,将调用的参数传送到服务方,服务方收到调用请求后,根据参数完成本地调用,并且将结果通过网络传送回调用方。 在这个过程中,像参数的封装,网络传输等细节会由 RPC 框架来完成,把上面的图片完善一下,一个完整的 RPC 调用的流程是这样的:
2. Dubbo 的远程调用过程
在上一节内容中,我们已经对服务调用的过程有了一定的了解。实际上,Dubbo 在实现远程调用的时候,核心流程和上面的图片是完全一样的,只不过 Dubbo 在此基础上增加了一些额外的流程,例如集群容错、负载均衡、过滤器链等。 本篇文章只分析核心的调用流程,其它的额外流程可以自行了解。 在讲解 Dubbo 的调用过程之前,我们先来了解一下 Dubbo 的一些概念。
2.1 远程调用的开端 —— 动态代理在了解以上基本概念后,我们开始来跟踪 Dubbo 的远程调用流程。在 RPC 框架中,想要实现远程调用,代理对象是不可或缺的,因为它可以帮我们屏蔽很多底层细节,使得我们对远程调用无感知。 如果用过 JDK 的动态代理或者是 CGLIB 的动态代理,那么应该都知道每个代理对象都会有对应的一个处理器,用于处理动态代理时的增强,例如 JDK 使用的 下面分别是使用 javasisst 和使用 JDK 动态代理时对代理类进行反编译后的结果。 从上面可以看出, 2.2 客户端的调用链路在了解客户端的调用链路之前,我们需要先看一下 Dubbo 的整体设计,下图是来自于 Dubbo 官网的一张框架设计图,很好地展示了整个框架的结构。 为了容易理解,我把上图中的 如下图所示, Dubbo 的 因此,当 这个具体的
拿到具体的 可以看到,Dubbo 对于调用方式做了一些区分,分别为同步调用,异步调用以及单次调用。 首先有一点要明确的是,同步调用也好,异步调用也好,这都是站在用户的角度来看的,但是在网络这一层面的话,所有的交互都是异步的,网络框架只负责将数据发送出去,或者将收到的数据向上传递,网络框架并不知道本次发送出去的二进制数据和收到的二进制的数据是否是一一对应的。 因此,当用户选择同步调用的时候,为了将底层的异步通信转化为同步操作,这里 Dubbo 需要调用某个阻塞操作,使用户线程阻塞在这里,直到本次调用的结果返回。 2.3 远程调用的基石 —— 网络层在上一小节的 从前面出现过的架构图中可以看到,远程通信模块共分为三层,从上到下分别是 从最底层的 往上则是 再往上就是 了解完远程通信模块的分层结构后,我们再来看一下该模块中的核心概念。 Dubbo 在这个模块中抽取出了一个端点 同时,为了在语义上对端点进行区分,Dubbo 将发起请求的端点抽象为客户端
对于客户端来说,一个 为了体现了请求/响应的交互模式,在 了解完网络层的相关概念后,让我们看回 可以看到,其实 这里值得注意的是 保存映射的目的是因为在异步情况下,请求和响应并不是一一对应的。为了使得后面接收到的响应可以正确被处理,Dubbo 会在响应中带上对应的请求 ID,当接收到响应后,根据其中的请求 ID 就可以找到对应的 整个过程可以抽象为下面的时序图。 当 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:50:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |