面试官:为什么RPC框架历经数十年还在造轮子?同时期的EJB骨灰都快找不到了!

news2024/11/26 20:48:15

文章目录

      • 再谈谈RPC的理解
      • RPC的发展史
      • RPC历经数十年而不衰的原因?
          • 1、分布式系统的需求
          • 2、RPC相关技术的演进
          • 3、多语言的支持

本文源自一次面试官的提问:说说你对于RPC框架的了解,你知道哪些RPC框架,以及为什么RPC历经几十年还能不断推出新的框架。

我觉得这个问题很有意思。在IT界RPC真的是一个“奇葩”,奇葩在每过一段时间都会有新的RPC框架出现,网络上仍然在不断争论哪个RPC框架更好,而这些RPC框架还有很多还是大厂的杰作,大厂们仿佛乐此不疲。

要知道RPC的历史可以追溯到1990年代初期,那时候“开放软件基金会”(Open Software Foundation,OSF)和业界主流的计算机厂商一期指定了名为分布式计算环境(Distributed Computing Environment)的分布式技术体系,当时就定出了一个远程服务调用的规范(Remote Procedure Call,RPC),这个规定被称为DCE/RPC,后来Sun公司又开发出来一个ONC RPC,在这个时期基本上确定了RPC的很多概念和技术关注点,其中有很多解决思路,即使到了今天仍然有巨大的借鉴意义。

和RPC同期的很多技术或者框架很多都已经淹没在历史之中了,连当初盛极一时的EJB,现在已经几乎没人使用了,但是RPC却焕发了新的活力。

为什么历经三十多年,RPC还能不断推陈出新,被抽推崇呢?我认真思考这个问题的原因,有了一些不知是否成熟的想法,于是便记录下来。

再谈谈RPC的理解

RPC(Remote Procedure Call,远程过程调用),是一种通信协议,用于不同计算机之间的远程通信。它允许应用程序通过网络调用远程计算机上的服务或函数,并获取返回结果。RPC隐藏了底层网络通信的细节,使得远程调用就像本地调用一样简单和透明。

在RPC中,通常有一个客户端和一个服务器端。客户端发起远程调用请求,服务器端接收请求并执行相应的操作,然后将结果返回给客户端。RPC可以跨越不同的编程语言和操作系统,使得分布式系统中的不同组件能够进行相互通信和协作。

RPC的实现通常包括以下关键组件:

  1. **定义接口:**RPC通过定义接口描述远程服务的方法和参数,通常使用IDL(Interface Definition Language)来定义接口规范,例如使用Protocol Buffers、Thrift或gRPC等。
  2. **序列化与反序列化:**在远程调用过程中,需要将方法参数和返回值序列化为字节流进行传输,然后在对端进行反序列化。这样可以确保跨网络传输的数据能够被正确地重建和解析。
  3. **通信协议:**RPC使用不同的通信协议进行数据传输,如HTTP、TCP、UDP等。通信协议负责在客户端和服务器之间建立连接,并进行数据的可靠传输。
  4. **远程调用管理:**RPC框架通常提供远程调用的管理功能,包括请求的路由、负载均衡、故障恢复等。这些功能确保请求能够被正确地路由到相应的服务节点,并能够应对节点故障或网络中断的情况。
  5. **安全性和认证:**由于RPC涉及跨网络通信,安全性和认证是重要考虑因素。RPC框架通常提供身份验证、加密传输和访问控制等机制,以保护数据的机密性和完整性。

于是乎,你可以看到接口定义的方式可以不同、序列化和反序列化的机制可以不同、通信的协议可以不同、路由和安全方面的建设可以不同,这就给了各类RPC框架有非常大的想象空间,每个RPC框架都可以有自己独特的方面。

所以我们看到有各种各样我们所熟知的框架出现:

  • CORBA(Common Object Request Broker Architecture,OMG)
  • Java RMI(Sun/Oracle)
  • Thrift(Facebook/Apache)
  • Dubbo(阿里巴巴/Apache)
  • gRPC(Google)
  • Motan1/2(新浪)
  • Finagle(Twitter)
  • brpc(百度/Apache)
  • .NET Remoting(微软)
  • Arvo(Hadoop)

他们有的主要支持C++,有的主要支持Java,有的支持各类语言,有的以简单见长,有的则以性能取胜,各有特色。

要深入了解RPC,需要追溯一下RPC的发展史。

RPC的发展史

RPC的发展历史可以追溯到上世纪80年代,主要分为以下阶段:

  1. 早期阶段: 在早期阶段,RPC的概念开始出现并得到了实践。最早的RPC实现包括Sun Microsystems的NFS(Network File System)和Apollo Systems的NCS(Network Computing System),它们都是为了在分布式系统中实现远程调用而设计的,这个阶段是分布式技术的萌芽时期
  2. 基于传统协议的RPC出现: 随着网络技术的发展,RPC的概念开始在不同的领域得到应用。许多基于传统协议的RPC实现出现,如DCE RPC(Distributed Computing Environment RPC)和CORBA(Common Object Request Broker Architecture)。这些实现使用了自定义的IDL(Interface Definition Language)和协议,以实现跨平台、跨语言的远程调用,这个时期的RPC协议应用还不广泛性能存在较大的问题
  3. Web服务和SOAP: 随着Web的兴起,RPC的关注点逐渐转向Web服务。Web服务使用SOAP(Simple Object Access Protocol)作为通信协议,通过XML进行数据传输。SOAP基于HTTP和XML,使得跨网络的远程调用更加方便。SOAP提供了基于WSDL(Web Services Description Language)的接口定义和基于UDDI(Universal Description, Discovery, and Integration)的服务发现,SOAP可以认为是RPC的一种案例,这阶段还出现了XML-RPC,后来也渐渐淘汰了。
  4. REST和Web API时代: 随着Web的演进,基于REST(Representational State Transfer)的Web API成为了一种更简洁、轻量级的远程调用方式。RESTful API使用HTTP协议,通过URL和HTTP方法(如GET、POST、PUT、DELETE)来表达资源的操作。RESTful API的普及使得基于HTTP的RPC变得更加流行,并广泛应用于Web开发和移动应用程序。
  5. 现代RPC框架: 进入21世纪,出现了许多现代化的RPC框架,如gRPC、Apache Thrift、Apache Dubbo等。这些框架提供了更高效、更强大的RPC能力,并支持多种编程语言和平台。它们通常采用二进制协议(如Protocol Buffers)和高性能的网络通信技术(如HTTP/2、TCP)来提升性能和效率。

随着技术的不断演进和需求的变化,RPC的发展也在不断推进,协议在变化,通信网络技术也在变化,发展到现代RPC框架则提供了更多的功能和特性,使得分布式系统的开发更加便捷和高效。

RPC历经数十年而不衰的原因?

现在可以尝试回答这个问题了,首先第一点我觉得应该是分布式系统的需求。

1、分布式系统的需求

单体应用时代,摩尔定律盛行,单个应用就能大部分解决业务需求,压根不涉及RPC,随着互联网的迅速发展和应用的扩大,单体应用无法满足业务需要,对于分布式系统的需求越来越强烈。

分布式系统中的各个组件需要进行跨网络的通信和协作,RPC作为一种重要的通信协议,能够满足分布式系统的需求,提供高效、可靠的远程调用机制。随着分布式系统规模的不断扩大和复杂性的增加,新的RPC框架不断涌现,以满足不同场景下的需求。

SOA、微服务、service mesh这些技术相继出现,这些分布式架构都少不了RPC这个重要的组件,于是产生了各种各样,适配不同场景的RPC框架。

2、RPC相关技术的演进

随着计算机技术和网络技术的不断进步,RPC的实现方式和性能也在不断提升。新的RPC框架往往借鉴和采用了先进的技术,如高性能的网络通信协议(如HTTP/2、gRPC的基于HTTP/2的传输),高效的序列化和反序列化机制(如Protocol Buffers),以及负载均衡、故障恢复等机制的优化。这些新技术的应用使得RPC框架更加高效、可靠,并具备更好的可扩展性和弹性。

一旦协议、网络、安全、故障恢复能机制有新的进展,势必就会带来RPC框架的更新。

3、多语言的支持

RPC框架通常支持多种编程语言,使得不同语言编写的应用程序能够进行跨语言的远程调用。这对于大型分布式系统的开发非常重要,因为不同的团队和组织可能使用不同的编程语言开发各自的组件,新的RPC框架通常会扩展语言支持,以满足多样化的开发需求。

我们发现每个时代都会迸发出一些新的开发语言,比如现在云原生时代,Go和Rust语言就大受欢迎,那么支持Go语言和Rust语言的RPC框架就会出现,这也是RPC的一个活力源头所在。

4、不同场景的需求

不同的应用场景对RPC框架提出了各种需求,例如高并发、低延迟、可扩展性、安全性等。新的RPC框架通常会根据不同场景的需求进行针对性的优化和功能扩展,以满足特定的应用需求。

特别是一些大厂,内部业务复杂,对于RPC有一些独特的需求,另外也需要匹配内部的技术栈,这样子就常常造出了新轮子。

其实RPC确实挺有意思的,展现了技术的持久生命力,另外别看RPC就那几个组件,实际自己编写一个就知道了,需要注意的技术细节实在是太多了,也是一个非常锻炼人的活计,如果能够自己独立写一个功能比较丰富、高性能的RPC框架出来的话,我想编程能力至少应该能算是登堂入室了。

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

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

相关文章

船舶中压配电板应用弧光保护,可解决母排故障短路问题,对于提高船舶电站的安全性、稳定性,降低经济损失具有重要意义。-安科瑞黄安南

摘要:船舶中压配电板弧光故障导致的设备损坏和停电事故,不仅会造成较大的经济损失,而且严重影响船舶电站的安全稳定运行,威胁船舶电站操作人员的安全。弧光保护是基于电力系统开关柜发生弧光故障时而设计的一套母线保护系统&#…

中国立体地图(超高清)

声明:来源网络,仅供学习!

计算机视觉---flask框架封装目标检测,应用线程提高程序运行效率

1.前言 上一篇文章flask部署 目标检测算法中讲到可以将检测算法封装到flask框架中进行web端展示,但在实际应用中发现一些问题并进行了解决,在本文中进行补充。 2.利用线程,提高flask程序运行效率 flask web端访问时,每次都会从…

RUST腐蚀基因种植

RUST腐蚀基因种植 试验地址:www.xiaocao.cloud RUST基因: RUST基因计算器,腐蚀基因计算器,前后端分离架构,前端目录/resouce/ui/rust,欢迎大佬评价,

全网最牛,接口测试mock详细总结,彻底打通接口测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是mock&#…

uni-data-picker修改成自定义样式

想使用uni-data-picker,并修改成自己自定义的颜色和样式。 1:修改样式前后样式对比 图1为原本样式,图2,3为修改后的样式 2:两种使用方法 直接使用uni-data-picker组件,会先显示请选择区域的下拉框&#…

python pandas库导出数据到excel

利用pandas库导出数据到excel,代码如下 import pandas as pd# 数据格式1,字典形式 mydic {姓名: [张三, 李四, 王五],年龄: [18, 20, 22]}# 数据格式2,列表形式 mylist [{"姓名": "张三","年龄": "11&…

el-progress组件使用,样式修改,自定义文字

正常的el-progress显示是这样的 修改后 自动计算percentage&#xff0c;format自定义显示文字 <template><div><div class"content-view"><div v-for"(item, index) in progressList" class"item-view"><el-prog…

【Java项目实战-牛客社区】--idea创建springboot工程

①. 创建springboot工程&#xff0c;并勾选web开发相关依赖。 。配置Maven ②. 定义Controller类&#xff0c;添加方法 hello。 ③. 运行测试1 使用Spring Initializr方式构建Spring Boot项目 Spring Initializr是一个Web应用&#xff0c;它提供了一个基本的项目结构&#xff…

《遗留系统现代化》读书笔记(模式篇-开篇)

文章目录 遗留系统现代化的五种策略&#xff1a;重构还是重写&#xff1f;这是一个问题遗留系统现代化的五种策略EncapsulateReplatformRehostRefactor/RearchitectRebuild/Replace其他策略 你应该选择什么样的策略&#xff1f;小结 本文地址&#xff1a; 《遗留系统现代化》读…

软件测试工程师最常用的web测试-浏览器兼容性测试

如今&#xff0c;市面上的浏览器种类越来越多&#xff08;尤其是在平板和移动设备上&#xff09;&#xff0c;这就意味着你所测试的站点需要在这些你声称支持浏览器上都能很好的工作。 同时&#xff0c;主流浏览器&#xff08;IE&#xff0c;Firefox&#xff0c;Chrome&#x…

上门家政小程序|上门家政小程序源码|上门家政系统开发

上门家政小程序的开发适合以下几个行业&#xff0c;下面将对其进行介绍并探讨其应用场景。   一、家庭保洁行业   家庭保洁是现代家庭生活中常见的需求之一&#xff0c;上门家政小程序可以为家庭保洁公司提供一个在线预约和管理平台。用户可以通过小程序方便地预约家庭保洁…

OV7670摄像头模块的使用

OV7670摄像头模块介绍 OV7670 CAMERACHIPTM 图像传感器&#xff0c;体积小、 工作电压低&#xff0c;提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制&#xff0c;可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影响数据。该产 品 VGA 图像最高达到 30…

基于SSM的汽车配件销售业绩管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SpringBoot整合SpringCloudStream3.1+版本Kafka

SpringBoot整合SpringCloudStream3.1版本Kafka 下一节直通车 SpringBoot整合SpringCloudStream3.1版本的Kafka死信队列 为什么用SpringCloudStream3.1 Springcloud架构提供&#xff0c;基于spring生态能够快速切换市面上常见的MQ产品3.1后使用配置文件的形式定义channel&am…

Python接口自动化测试之详解post请求

前言 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

C#线性插值,三角插值

什么是插值&#xff1f; 是什么&#xff1f;很简单&#xff01; 已知两点&#xff0c;推断中间的每一点的过程。 有什么用&#xff1f; 很简单&#xff01;位置从30到40耗时3秒求每一时刻的位置&#xff01; 1.线性插值 设v是结果&#xff0c;start是开始&#xff0c;end是结…

【贪心算法part02】| 122.买卖股票的最佳时机||、55.跳跃游戏、45.跳跃游戏||

目录 &#x1f388;LeetCode122.买卖股票的最佳时机|| &#x1f388;LeetCode55.跳跃游戏 &#x1f388;LeetCode45.跳跃游戏|| &#x1f388;LeetCode122.买卖股票的最佳时机|| 链接&#xff1a;122.买卖股票的最佳时机|| 给你一个整数数组 prices &#xff0c;其中 price…

Day 61-62 决策树(ID3)

代码&#xff1a; package dl;import java.io.FileReader; import java.util.Arrays; import weka.core.*;/*** The ID3 decision tree inductive algorithm.*/ public class ID3 {/*** The data.*/Instances dataset;/*** Is this dataset pure (only one label)?*/boolean …

Revit中如何创建水的效果及基坑?

一、Revit中如何创建水的效果? 我们在创建建筑的时候会遇上小池塘啊小池子之类的装饰景观&#xff0c;Revit又不像专业的3D软件那样可以有非常真实的水的效果&#xff0c;那么我们该如何简单创建水呢?下面来看步骤&#xff1a; 1、 在水池位置创建一块楼板&#xff0c;并将该…