远程服务调用(RPC)高频面试题!(有RPC项目必看!)

之前给大家推荐过手写RPC的项目,项目资源来自慕课

除此之外,比如Guide哥牛客的声哥等,也都出过对应的教程。

几年前香饽饽的项目,如今变得烂大街。

周日小白在帮大家修改简历的时候,发现很多简历上都有RPC。

  • 那么大家对于RPC真正了解多少呢?
  • 是否去阅读过经典RPC框架源码呢?
  • 那么面试又会有哪些比较高频的问题呢?

今天小白就给大家盘点一些高频关于远程服务调用的面试题。

1.微服务之间如何进行通信?

参考答案

  • 单体项目时:一次服务调用发生在同一台机器上的同一个进程内部,也就是说调用发生在本机内部,因此也被叫作本地方法调用。

  • 微服务项目时:服务提供者服务消费者运行在两台不同物理机上的不同进程内,它们之间的调用相比于本地方法调用,可称之为远程方法调用,简称 RPC

2.RPC了解多少?都有哪些?

参考答案:RPC全称称: Remote Procedure Calls 远程服务调用,是进行服务之间相互调用的。

受限语言的开源 RPC 框架

跨语言平台的开源 RPC 框架主要有以下几种。

  • GRPCGoogle 2015 年开源,支持多种语言。(官方文档:https://grpc.io/docs/)
  • Thrift:最初Facebook 开发的内部框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。
    Dubbo架构

3.RPC包含哪些部分?

参考答案:一个RPC框架要包含

  • 客户端和服务端建立网络连接模块( server模块、client模块 )
  • 服务端处理请求模块
  • 协议模块
  • 序列化反序列模块。

4.设计一个RPC会考虑哪些问题?

参考答案:设计一个RPC框架,可以从PRC包含的几个模块去考虑,对每一个模块分别进行设计。

  • 客户端服务端如何建立网络连接
  • 服务端如何处理请求
  • 数据传输采用什么协议
  • 数据该如何序列化反序列化

gRPC架构

5.服务端如何处理请求?有哪些方式?

参考答案:服务端接收到客户端的请求后,常见的处理方式有三种,分别是BIO、NIO和AIO。

  • 同步阻塞方式(BIO):客户端发一次请求,服务端生成一个对应线程去处理。当客户端同时发起的请求很多时,服务端需要创建多个线程去处理每一个请求,当达到了系统最大的线程数时,新来的请求就无法处理了。
  • 同步非阻塞方式 (NIO):客户端发一次请求,服务端并不是每次都创建一个新线程来处理,而是通过 I/O 多路复用技术进行处理。就是把多个 I/O 的阻塞复用到同一个 select 的阻塞上,从而使系统在单线程的情况下可以同时处理多个客户端请求。这种方式的优势是开销小,不用为每个请求创建一个线程,可以节省系统开销。
  • 异步非阻塞方式(AIO):客户端发起一个 I/O 操作然后立即返回,等 I/O 操作真正完成以后,客户端会得到 I/O 操作完成的通知,此时客户端只需要对数据进行处理就好了,不需要进行实际的 I/O 读写操作,因为真正的 I/O 读取或者写入操作已经由内核完成了。这种方式的优势是客户端无需等待,不存在阻塞等待问题。

使用场景
BIO 适用于连接数比较小的业务场景,这样的话不至于系统中没有可用线程去处理请求。这种方式写的程序也比较简单直观,易于理解。

NIO 适用于连接数比较多并且请求消耗比较轻的业务场景,比如聊天服务器。这种方式相比 BIO,相对来说编程比较复杂。

AIO 适用于连接数比较多而且请求消耗比较重的业务场景,比如涉及 I/O 操作的相册服务器。这种方式相比另外两种,编程难度最大,程序也不易于理解。 【来自网络

SpringCloud架构

6.序列化与反序列的方式有哪些?

参考答案: 常用的序列化方式分为两类

  • 文本类如 XML/JSON 等
  • 二进制类如 PB/Thrift 等

7.有哪些序列化协议?

参考答案

8.为什么要进行序列化和反序列化?

参考答案:为什么需要序列化和反序列化,有下面几点原因。

  • 解决内存中数据结构字节序列的映射过程中,如何保留各个结构和字段间的关系而生的技术 。
  • 解决异构系统的数据传输,比如大小端、远端的持久存储;
  • 压缩数据,加快网络传输。【 网络传输耗时一方面取决于网络带宽大小,另一方面取决于数据传输量。想加快网络传输,要么提高带宽,要么减小数据传输量,而对数据进行编码的主要目的就是减小数据传输量。比如一部高清电影原始大小为 30GB,如果经过特殊编码格式处理,可以减小到 3GB,同样是 100MB/s 的网速,下载时间可以从 300s 减小到 30s。 】

Thrift架构

总结

在分布式微服务系统中,服务之间的调用需要通过RPC远程调用的方式。

远程调用的过程中会涉及到建立网络链接(http、socket)、进行网络通信(开放协议、私有协议)、进行数据传输(序列化和反序列化)。

  • 通信框架解决客户端和服务端如何建立连接、管理连接以及服务端如何处理请求的问题。
  • 通信协议解决客户端和服务端采用哪种数据传输协议的问题。
  • 序列化和反序列化解决客户端和服务端采用哪种数据编解码的问题。

在实际的开发中,选择RPC框架也是一个技术活,很多大公司都会根据开源的框架进行自研。

如果对开源的RPC框架有一定的研究,对面试一定是一个加分项

之前推荐的RPC项目,其实还可以进行进一步的优化,可以参考开源框架进行改进!

公众号:代码界的小白,会更新互联网消息、动态、高频八股、实战项目等。

本文正在参与【内行知多少】 征文活动,一起来聊聊内行人才懂的那些事吧,高额牛币和百元京东卡等你来领~

#搞技术你要知道#
全部评论
RPC造轮子现在还吃香吗...
点赞 回复 分享
发布于 2022-09-06 16:50 黑龙江
请问简历上写了rpc项目需要去被dubbo的源码吗
点赞 回复 分享
发布于 2022-07-29 00:50
但愿我面试能问到这些啊
点赞 回复 分享
发布于 2022-06-11 22:23

相关推荐

05-17 18:01
复旦大学 Java
Q1. Lamda表达式A1: Lamda表达式更简洁,创建匿名函数。简化函数式接口。只有一个表达式时,表达式的结果直接作为返回值;多个表达式,需要大括号,return语句作为返回值。lamda表达式使JAVA支持函数式编程,允许函数作为参数传递;结合Stream API处理集合操作如过滤。Q2. 为什么有包装类 Integer和int的区别A2. 集合,泛型只能使用引用类型,不能使用基本数据类型。集合需要支持动态内存分配、垃圾回收等特性,而这些机制都依赖于对象。int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是null,所以Integer能区分出0和null的情况。基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后才可以赋值。我自己想的是 集合如Set需要hashCode和equals方法来判断元素是否已经存在,所以集合必须用封装类Q3: 项目架构 选型 原因Q4: 微服务间调用方式、通信协议,为何这样选Dubbo 是阿里巴巴开源的高性能 Java RPC 框架,广泛应用于微服务架构中,其核心优势在于高效的远程调用能力、丰富的服务治理机制以及灵活的多协议支持。以下是关于 Dubbo 的微服务调用方式、支持的通信协议及选择 Dubbo 的原因的详细解析:---### **一、Dubbo 的微服务调用方式**Dubbo 的微服务间调用主要基于 **RPC(远程过程调用)** 实现,通过以下核心机制完成服务交互:1. **服务注册与发现**     - 服务提供者启动时,将自身信息(如服务名、地址、端口)注册到注册中心(如 Zookeeper、Nacos),消费者通过注册中心动态获取可用服务列表。   - 支持多种负载均衡策略(随机、轮询、最少活跃调用等),自动选择最优服务实例进行调用。2. **RPC 调用流程**     - **接口定义与共享**:服务提供者和消费者需共享相同的服务接口定义(如 Java Interface),通过代理机制屏蔽底层通信细节。   - **序列化与传输**:调用参数和返回结果通过序列化(如 Hessian、Protobuf)转换为二进制数据,通过 TCP 或 HTTP 协议传输。3. **服务治理机制**     - **容错策略**:提供 6 种容错模式(如失败自动切换、快速失败、广播调用),应对不同场景的异常处理需求。   - **动态配置**:通过配置中心(如 Nacos)实现参数动态更新,无需重启服务。---### **二、Dubbo 支持的通信协议**Dubbo 支持多种通信协议,开发者可根据场景灵活选择:| **协议**       | **特点**                                                                 | **适用场景**                                                                 ||----------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------|| **Dubbo 协议** | 默认协议,基于 TCP 长连接与二进制传输,性能高、延迟低,但跨语言支持有限。 | 高并发、低延迟的 Java 微服务间调用。                                           || **Triple 协议** | 基于 HTTP/2 和 Protobuf,兼容 gRPC,支持流式通信和 TLS 加密,穿透性强。 | 云原生环境、跨语言调用(如与 Go/Python 交互)或需要网关代理的场景。             || **HTTP/REST**  | 基于 HTTP 的 RESTful 风格,兼容性强,但性能较低。                   | 跨语言 Web 服务集成或对外提供开放 API。                                        || **gRPC**       | 基于 HTTP/2 的高效协议,支持双向流式通信,需依赖 Protobuf 定义服务。 | 需要强类型约束、跨语言且对性能要求较高的场景。                                 || **Hessian**    | 二进制协议,跨语言支持较好,但性能略逊于 Dubbo 协议。                          | Java 与非 Java 系统(如 PHP)间的轻量级集成。                                  |---### **三、选择 Dubbo 的核心原因**1. **高性能与低延迟**     - Dubbo 协议采用单一长连接和异步非阻塞通信(基于 Netty),在高并发场景下性能显著优于 HTTP/REST,例如在阿里巴巴双十一中支持万亿级调用。   - 序列化优化(如 Dubbo3 的 Triple 协议性能较 gRPC 提升 40%)。2. **完善的服务治理**     - **负载均衡**:支持随机、轮询、一致性哈希等策略,自适应算法可动态感知服务端负载。   - **容错与熔断**:内置多种容错模式(如 Failover、Failfast),支持服务降级和熔断机制,保障系统稳定性。   - **动态扩展**:服务实例可动态注册/注销,支持水平扩展与灰度发布。3. **多协议与生态兼容性**     - 支持 Dubbo、Triple、gRPC 等多种协议,可无缝集成 Spring Cloud、Kubernetes 等生态。   - 提供统一的服务治理能力(如监控、链路追踪),适用于混合技术栈环境。4. **生产级可靠性验证**     - 历经阿里巴巴大规模电商场景验证,支持百万级节点集群和智能流量调度,具备高可用性。---### **四、总结**Dubbo 通过高效的 RPC 调用机制、灵活的多协议支持以及强大的服务治理能力,成为构建高性能微服务系统的首选框架。其优势尤其体现在 **高并发场景下的性能表现**、**跨语言与云原生适配能力** 以及 **企业级服务治理功能**。若需进一步优化性能或扩展功能,可结合具体场景选择 Triple、gRPC 等协议,或通过第三方工具(如 Prometheus、Zipkin)增强监控能力。
招商银行AI面6人在聊 查看4道真题和解析
点赞 评论 收藏
分享
04-26 17:12
已编辑
门头沟学院 前端工程师
3.4正式投递,官网有投递渠道的投了四五十家,面了20+场,所有能想起来名字的小中大厂基本都投过了,没有的要么简历挂要么没约面要么oc后约面。以下是有面试联系的,只有测评和笔试的没整理,阿里系除了饿了么和大文娱全部简历挂:大部分都写了面经,具体可看主页,timeline如下:腾讯IEG: 1.8一面,腾讯PCG QQ: 2.17一面,腾讯CGD: 3.13一面,腾讯PCG 生态合作: 3.20一面(拒),腾讯职能线: 3.28一面,腾讯PCG QQ: 4.11一面,4.17二面,饿了么: 3.25测评,3.7笔试,3.28一面,4.13二面,4.18HR面,4.21意向,携程: 3.6测评,3.27笔试,4.7一面,字节: 3.11一面(拒),4.16一面,快手: 3.24一面,美团一站: 3.15笔试,3.18一面,3.26二面,美团二战: 3.15笔试,4.2一面,4.7二面,美团三战: 3.15笔试,4.15一面,4.17二面,4.21意向,作业帮: 3.18笔试,3.27一面,B站直播: 3.25一面,安恒信息: 3.23测评,3.25一面(电话offer),华为: 4.15测评,免机试,4.28一面(拒),海康威视: 4.11测评,4.15笔试,4.21一面(拒),荣耀: 4.18笔试,4.23一面(拒)最终选择了美团今年真的是太忙太不容易了,一月做项目实验和平台,发了专利,二月寒假纯玩导致后续悲剧,三月发小论文,开始投实习,四月项目结项。因为太菜要做的事太多,中间心态崩了好多次,有的时候背着背着八股就开始恍惚自闭怀疑自己,天天在实验室熬到一两点最后一个走,回宿舍路上都在背八股,半夜三点多躺在床上焦虑到睡不着,做梦都在面试被提问,基本每天都睡不到6小时,因为准备实习一直搁置项目,oc后又熬大夜三天肝了100+页5w多字图文并茂结项报告……在找暑期实习路上面了20+次真的成为了传奇耐面王与耐挂王,因为本人敏感内耗玻璃心,每次面试的尬尴与沉默、面试官的质疑与淡淡的不屑等,还时不时突然想起来刺痛一下。这期间默默崩溃了无数次,又硬挺着坚持下来。迄今为止终于各个任务都完成取得了还不错的结果,接下来是应付导师偷溜去实习了。这段时间混牛客还混到了高级领航员,要有自己的牛客荣誉奖章了,这怎么不算起号成功了呢()谢谢大家这段时间的交流与送花,也感谢很多友友的鼓励与祝福,祝大家都能拿到自己满意的offer,实习秋招工作顺利!😋    
找工作小泡泡:大佬太强了
点赞 评论 收藏
分享
评论
38
520
分享

创作者周榜

更多
牛客网
牛客企业服务