远程服务调用(RPC)高频面试题!(有RPC项目必看!)
之前给大家推荐过手写RPC的项目,项目资源来自慕课。
除此之外,比如Guide哥、牛客的声哥等,也都出过对应的教程。
几年前香饽饽的项目,如今变得烂大街。
周日小白在帮大家修改简历的时候,发现很多简历上都有RPC。
- 那么大家对于RPC真正了解多少呢?
- 是否去阅读过经典RPC框架的源码呢?
- 那么面试又会有哪些比较高频的问题呢?
今天小白就给大家盘点一些高频关于远程服务调用的面试题。
1.微服务之间如何进行通信?
参考答案:
单体项目时:一次服务调用发生在同一台机器上的同一个进程内部,也就是说调用发生在本机内部,因此也被叫作本地方法调用。
微服务项目时:服务提供者和服务消费者运行在两台不同物理机上的不同进程内,它们之间的调用相比于本地方法调用,可称之为远程方法调用,简称 RPC
2.RPC了解多少?都有哪些?
参考答案:RPC全称称: Remote Procedure Calls 远程服务调用,是进行服务之间相互调用的。
受限语言的开源 RPC 框架
- Dubbo:阿里2011年开源,仅支持 Java 语言。(官方文档:https://dubbo.apache.org/zh/docs/)
- Motan:微博2016 年开源,仅支持 Java 语言。(Github地址:https://github.com/weibocom/motan)
- Tars:腾讯2017 年开源,仅支持 C++ 语言。(官方文档:https://tarscloud.github.io/TarsDocs/installation/source.html)
- Spring Cloud Feigh:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言(Github:https://github.com/OpenFeign/feign)【后面又出现了SpringCloud Alibaba, Spring-Cloud-Alibaba 项目由阿里巴巴的开源组件和多个阿里云产品组成,旨在实现和公开众所周知的 Spring 框架模式和抽象,为使用阿里巴巴产品的 Java 开发者带来 Spring-Boot 和 Spring-Cloud 的好处。 】
跨语言平台的开源 RPC 框架主要有以下几种。
- GRPC:Google 2015 年开源,支持多种语言。(官方文档:https://grpc.io/docs/)
- Thrift:最初Facebook 开发的内部框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。
3.RPC包含哪些部分?
参考答案:一个RPC框架要包含
- 客户端和服务端建立网络连接模块( server模块、client模块 )
- 服务端处理请求模块
- 协议模块
- 序列化和反序列模块。
4.设计一个RPC会考虑哪些问题?
参考答案:设计一个RPC框架,可以从PRC包含的几个模块去考虑,对每一个模块分别进行设计。
- 客户端和服务端如何建立网络连接?
- 服务端如何处理请求?
- 数据传输采用什么协议?
- 数据该如何序列化和反序列化?
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 操作的相册服务器。这种方式相比另外两种,编程难度最大,程序也不易于理解。 【来自网络】
6.序列化与反序列的方式有哪些?
参考答案: 常用的序列化方式分为两类
- 文本类如 XML/JSON 等
- 二进制类如 PB/Thrift 等
7.有哪些序列化协议?
8.为什么要进行序列化和反序列化?
参考答案:为什么需要序列化和反序列化,有下面几点原因。
- 解决内存中数据结构到字节序列的映射过程中,如何保留各个结构和字段间的关系而生的技术 。
- 解决异构系统的数据传输,比如大小端、远端的持久存储;
- 压缩数据,加快网络传输。【 网络传输耗时一方面取决于网络带宽大小,另一方面取决于数据传输量。想加快网络传输,要么提高带宽,要么减小数据传输量,而对数据进行编码的主要目的就是减小数据传输量。比如一部高清电影原始大小为 30GB,如果经过特殊编码格式处理,可以减小到 3GB,同样是 100MB/s 的网速,下载时间可以从 300s 减小到 30s。 】
总结
在分布式微服务系统中,服务之间的调用需要通过RPC远程调用的方式。
远程调用的过程中会涉及到建立网络链接(http、socket)、进行网络通信(开放协议、私有协议)、进行数据传输(序列化和反序列化)。
- 通信框架解决客户端和服务端如何建立连接、管理连接以及服务端如何处理请求的问题。
- 通信协议解决客户端和服务端采用哪种数据传输协议的问题。
- 序列化和反序列化解决客户端和服务端采用哪种数据编解码的问题。
在实际的开发中,选择RPC框架也是一个技术活,很多大公司都会根据开源的框架进行自研。
如果对开源的RPC框架有一定的研究,对面试一定是一个加分项!
之前推荐的RPC项目,其实还可以进行进一步的优化,可以参考开源框架进行改进!
公众号:代码界的小白,会更新互联网消息、动态、高频八股、实战项目等。
本文正在参与【内行知多少】 征文活动,一起来聊聊内行人才懂的那些事吧,高额牛币和百元京东卡等你来领~
#搞技术你要知道#