第1章大型互联网公司的基础架构——1.6 RPC服务
你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务,两者的定位不一样。一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务;而HTTP服务强调的是与用户请求的交互,它做的主要工作一般比较简单,比如校验用户请求、打包响应数据,而用户请求真正的处理逻辑会被HTTP服务通过RPC请求交给RPC服务来执行,HTTP服务更像是业务服务层的“网关”。RPC服务对后台内部暴露RPC协议,而HTTP服务对后台外部暴露HTTP。
为什么后台内部要专门使用RPC协议来通信,而不直接使用HTTP?这就要从RPC的概念说起了。
RPC ( Remote Procedure Call,远程过程调用)的目标就是屏蔽网络编程的细节,能够像调用本地方法一样调用远程方法,让开发者更专注于业务逻辑本身。如图1-22所示,在一个单体应用内,假设有一个Calculator接口以及这个接口的实现类Calculatorlmpl,那么要调用Calculator的add方法执行相加运算就可以直接调用,这是因为Calculatorlmpl实现类和Calculator接口在同一个进程地址空间内。这种调用形式就是本地过程调用。

现在将单体应用改为分布式应用,接口调用和实现分别在两个服务中,其中Service 1只有Calculator接口而没有Calculatorlmpl实现类,那么Service 1怎样才能调用到Service 2提供的Calculatorlmpl实现类的add方法呢?显然应该通过网络通信形式,如图1-23所示。
- Service 2可以作为一台TCP服务器,Service 1向其发送请求并接收响应,当它收到指定的数据包时将调用add方法并将运算结果回传;
- Service 2也可以作为一台HTTP服务器,对外提供Restful API,Service 1发起HTTP请求调用此Restful API获取运算结果。
Service 1发起远程过程调用来执行Service 2的add方法,这样做已经很接近RPC了, 不过每次Service 1调用add方法时,都不得不编写一大段TCP或者HTTP收发请求的代码。这里是否可以简化,让服务调用者就像调用一个本地方法一样进行远程过程调用,即感知不到网络通信的存在?这就是RPC要做的事情。RPC框架通过代理模式将网络通信屏蔽,服务调用者仅需像本地过程调用一样调用一个RPC方法就能执行远程方法。
接下来介绍RPC通信流程。RPC实质上就是调用方将调用方法和参数发送到被调用方,被调用方处理后将结果返回给调用方的过程。由于RPC底层实际上是网络通信,所以这里主要包括两个方面的工作。
-
方法的输入参数、输出参数都是对象,这些对象和二进制数据可以相互转化。这个过程被称为序列化。
-
被调用方收到数据包,需要知道指定的方法名是什么,以及输入参数在数据包中的起始位置等,于是需要根据我们约定的协议格式对数据包解码,二进制数据与数据包可以相互转化。这个过程被称为编解码。
下面是RPC通信流程:
- 调用方先将输入参数序列化,再将其编码为所约定的协议格式的数据包,然后通过网络发送给被调用方;
- 被调用方先将数据包解码,得到指定的方法名和序列化的输入参数,然后将输入参数反序列化,执行方法,最后通过与调用方调用相同的流程将结果返回给调用方。
完整的RPC通信流程如图1-24所示:

由于RPC通信流程相对固定,gRPC、Thrift等RPC框架都可以利用所约定的协议定义文件生成脚手架代码,使用者只需要将具体的方法处理代码完成后就能实现RPC通信了。
从上述介绍我们可以看出,RPC只是一种用于屏蔽远程过程调用的设计,它与HTTP不是对立的,因为两者不是一个层面的概念。RPC底层的网络通信可以使用TCP实现(如 Thrift),也可以使用HTTP实现(如gRPC),其本身并无限制。我们将业务服务层拆分为HTTP服务和RPC服务,更想强调的是前者服务于后台外部,而后者服务于后台内部,即后台服务之间的通信使用RPC形式。所谓的RPC协议只是表示RPC网络调用形式,而RPC服务的意思是该服务是基于gRPC、Thrift或其他RPC框架生成的,后台内部可以通过RPC形式与其通信。
这里给出一个RPC服务的例子:一个支持加法、减法、乘法、除法4个接口的计算器RPC服务,可以使用如下Thrift协议文件生成。
namespace go calculatorstruct BinaryReq {1: required i64 Operatoriz,2: required i64 Operators,
}struct Response {1: required i64 Result,
}service CalculatorService {Response Add(1: BinaryReq req) // 加法接口Response Sub(1: BinaryReq req) // 减法接口Response Multiply(1: BinaryReq req) // 乘法接口Response Division(1: BinaryReq req) // 除法接口
}
通过服务注册中心,HTTP服务能够得知RPC服务的可用地址列表。当HTTP服务接收到来自Nginx转发的用户请求后,就可以选择某个可用地址并通过RPC协议与RPC服务通信,完成对RPC服务的调用,最后将用户请求交给RPC服务处理。
总结
业务服务层一般包含哪些业务?
- HTTP服务
- RPC服务
HTTP服务和RPC服务的区别?
-
一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务
-
而HTTP服务强调的是与用户请求的交互,它做的主要工作一般比较简单,比如校验用户请求、打包响应数据,而用户请求真正的处理逻辑会被HTTP服务通过RPC请求交给RPC服务来执行,HTTP服务更像是业务服务层的“网关”
-
RPC服务对后台内部暴露RPC协议,而HTTP服务对后台外部暴露HTTP。
RPC的目标?
- RPC ( Remote Procedure Call,远程过程调用)的目标就是屏蔽网络编程的细节,能够像调用本地方法一样调用远程方法,让开发者更专注于业务逻辑本身。
RPC需要做的两个准备工作?
- 序列化和反序列化:方法的输入参数、输出参数都是对象,这些对象和二进制数据可以相互转化。这个过程被称为序列化。
- 编解码:被调用方收到数据包,需要知道指定的方法名是什么,以及输入参数在数据包中的起始位置等,于是需要根据我们约定的协议格式对数据包解码,二进制数据与数据包可以相互转化。这个过程被称为编解码。
RPC的通信流程?
- 调用方先将输入参数序列化,再将其编码为所约定的协议格式的数据包,然后通过网络发送给被调用方;
- 被调用方先将数据包解码,得到指定的方法名和序列化的输入参数,然后将输入参数反序列化,执行方法,最后通过与调用方调用相同的流程将结果返回给调用方。
RPC底层的网络通信有哪些实现方法?
- TPC实现,比如Thrift
- HTTP实现,比如gRPC
相关文章:
第1章大型互联网公司的基础架构——1.6 RPC服务
你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务,两者的定位不一样。一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务;而HTTP服…...
今日AI和商界事件(2025-02-15)
根据2025年2月15日的科技动态,以下是今日AI领域的重要事件及相关进展总结: 1. DeepSeek日活突破3000万,开源生态加速AI普惠 里程碑意义:开源大模型DeepSeek宣布日活跃用户数突破3000万,其R1模型凭借开源策略和低成本优…...
算法题(69):搜索插入位置
审题: 需要我们在有序数组中找到等于target值的元素的下标若没有则返回target按顺序会插入的位置的索引 思路 : 我们可以使用二分查找的方法 方法一:二分查找 和普通的二分查找不同,本题若没有找到就需要返回它按顺序插入的位置的…...
在 Linux 系统中,tc(Traffic Control) QoS 常用命令简介
在 Linux 系统中,tc(Traffic Control)命令是一个强大的工具,用于配置和管理网络流量控制。以下是 tc 命令的常用功能和基本用法: 1. 查看当前队列规则 使用以下命令查看指定网络接口上的队列规则: tc qd…...
如何画产品功能图、结构图
功能图的类型 常见的功能图包括数据流图、用例图、活动图、状态图、类图、组件图、部署图等等,不同的应用场景和目标下,需要确定不同的功能图类型。 数据流图 用例图 状态图 类图 组件图 组件图是由软件系统、组件和组件之间的关系组成的图形…...
4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享
引言: 最近,DeepSeek-R1在完全开源的背景下,与OpenAI的O1推理模型展开了激烈竞争,引发了广泛关注。为了让更多本地用户能够运行DeepSeek,我们成功将R1 671B参数模型从720GB压缩至131GB,减少了80%ÿ…...
SpringBoot速成(12)文章分类P15-P19
1.新增文章分类 1.Postman登录不上,可以从头registe->login一个新的成员:注意,跳转多个url时,post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功: 但表中不更新:细节有问题: c是…...
C++17中的clamp函数
一、std::clamp() 其实在前面简单介绍过这个函数,但当时只是一个集中的说明,为了更好的理解std::clamp的应用,本篇再详细进行阐述一次。std::clamp在C17中其定义的方式为: template< class T > constexpr const T& cl…...
配置Open-R1,评测第三方蒸馏模型的性能1
年前DeepSeek不温不火,问题的响应极。一回车,就看模型如口吐莲花般,先是输出思维过程,虽然中间绕来绕去,但是输出回答时还是准确而简洁的。比如,用它来读当时出来的几篇文章,确实大大提升了效率…...
Chrome插件开发流程
Chrome插件开发流程可以分为以下几个主要步骤: ### 1. 确定插件功能和目标 在开始开发之前,首先需要明确插件的功能和目标。这包括: - **功能定义**:确定插件要解决的问题或提供的功能。 - **市场分析**:了解目标用户群…...
物联网行业通识:从入门到深度解析
物联网行业通识:从入门到深度解析 (图1:物联网生态示意图) 一、引言:万物互联时代的到来 根据IDC最新预测,到2025年全球物联网设备连接数将突破410亿,市场规模达1.1万亿美元。物联网ÿ…...
【做一个微信小程序】校园事件页面实现
前言 为了进一步扩展校园事件页面的功能,我们可以添加 搜索、分类筛选 和 渐变卡片色 等特性。以下是详细的方案和源码实现。 扩展功能设计 1. 搜索功能 在页面顶部添加搜索框,用户输入关键词后,筛选出匹配的事件。2. 分类筛选 在页面顶部添加分类标签(如“全部”、“活动…...
C++基础系列【14】继承与多态
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
DeepSeek-R1 大模型本地部署指南
文章目录 一、系统要求硬件要求软件环境 二、部署流程1. 环境准备2. 模型获取3. 推理代码配置4. 启动推理服务 三、优化方案1. 显存优化技术2. 性能加速方案 四、部署验证健康检查脚本预期输出特征 五、常见问题解决1. CUDA内存不足2. 分词器警告处理3. 多GPU部署 六、安全合规…...
在conda环境下,安装Pytorch和CUDA
系统 : Ubuntu20.04 显卡:NVIDIA GTX1650 显卡驱动已经装好(命令 nvidia-smi 查看显卡配置) (主要看一下第一行的参数,最大支持的CUDA版本为12.4 ) Aanconda 版本(安装指南)(似乎…...
Java里int和Integer的区别?
大家好,我是锋哥。今天分享关于【Java里int和Integer的区别?】面试题。希望对大家有帮助; Java里int和Integer的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Java 中,int 和 Integer 都是用来表…...
【第13章:自监督学习与少样本学习—13.4 自监督学习与少样本学习的未来研究方向与挑战】
凌晨三点的实验室里,博士生小张盯着屏幕上的训练曲线——他设计的跨模态少样本学习模型在医疗影像诊断任务上突然出现了诡异的性能断崖。前一秒还在92%的准确率高位运行,下一秒就暴跌到47%。这个看似灾难性的现象,却意外揭开了自监督学习与少样本学习技术深藏的核心挑战… 一…...
【NLP】文本预处理
目录 一、文本处理的基本方法 1.1 分词 1.2 命名体实体识别 1.3 词性标注 二、文本张量的表示形式 2.1 one-hot编码 2.2 word2vec 模型 2.2.1 CBOW模式 2.2.2 skipgram模式 2.3 词嵌入word embedding 三、文本数据分析 3.1 标签数量分布 3.2 句子长度分布 3.3 词…...
deepseek r1从零搭建本地知识库10:嵌入模型和知识库建设
一、嵌入模型(Embedding Model)是什么? 1. 定义 嵌入模型是一种将文本、图像、音频等非结构化数据转化为**低维稠密向量(Dense Vector)**的算法模型,这些向量(通常几百到几千维)能够…...
Linux-文件IO
1.open函数 【1】基本概念和使用 #include <fcntl.h> int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 f…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
