面试官:为什么RPC框架数十年还在造轮子?EJB骨灰都快找不到了!
ccwgpt 2024-10-15 08:58 24 浏览 0 评论
本文源自一次面试官的提问:说说你对于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的实现通常包括以下关键组件:
定义接口:RPC通过定义接口描述远程服务的方法和参数,通常使用IDL(Interface Definition Language)来定义接口规范,例如使用Protocol Buffers、Thrift或gRPC等。
序列化与反序列化:在远程调用过程中,需要将方法参数和返回值序列化为字节流进行传输,然后在对端进行反序列化。这样可以确保跨网络传输的数据能够被正确地重建和解析。
通信协议:RPC使用不同的通信协议进行数据传输,如HTTP、TCP、UDP等。通信协议负责在客户端和服务器之间建立连接,并进行数据的可靠传输。
远程调用管理:RPC框架通常提供远程调用的管理功能,包括请求的路由、负载均衡、故障恢复等。这些功能确保请求能够被正确地路由到相应的服务节点,并能够应对节点故障或网络中断的情况。
安全性和认证:由于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年代,主要分为以下阶段:
早期阶段: 在早期阶段,RPC的概念开始出现并得到了实践。最早的RPC实现包括Sun Microsystems的NFS(Network File System)和Apollo Systems的NCS(Network Computing System),它们都是为了在分布式系统中实现远程调用而设计的,这个阶段是分布式技术的萌芽时期。
基于传统协议的RPC出现: 随着网络技术的发展,RPC的概念开始在不同的领域得到应用。许多基于传统协议的RPC实现出现,如DCE RPC(Distributed Computing Environment RPC)和CORBA(Common Object Request Broker Architecture)。这些实现使用了自定义的IDL(Interface Definition Language)和协议,以实现跨平台、跨语言的远程调用,这个时期的RPC协议应用还不广泛,性能存在较大的问题。
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,后来也渐渐淘汰了。
REST和Web API时代: 随着Web的演进,基于REST(Representational State Transfer)的Web API成为了一种更简洁、轻量级的远程调用方式。RESTful API使用HTTP协议,通过URL和HTTP方法(如GET、POST、PUT、DELETE)来表达资源的操作。RESTful API的普及使得基于HTTP的RPC变得更加流行,并广泛应用于Web开发和移动应用程序。
现代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框架出来的话,我想编程能力至少应该能算是登堂入室了。
相关推荐
- RACI矩阵:项目管理中的角色与责任分配利器
-
作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...
- 在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」
-
慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...
- Scrum模式:每日站会(Daily Scrum)
-
定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...
- 大家都在谈论的敏捷开发&Scrum,到底是什么?
-
敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...
- 敏捷与Scrum是什么?(scrum敏捷开发是什么)
-
敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...
- 敏捷项目管理与敏捷:Scrum流程图一览
-
敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...
- Mockito 的最佳实践(mock方法)
-
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
- EffectiveJava-5-枚举和注解(java枚举的作用与好处)
-
用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...
- Java单元测试框架PowerMock学习(java单元测试是什么意思)
-
前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...
- Spring框架基础知识-第六节内容(Spring高级话题)
-
Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...
- Java单元测试浅析(JUnit+Mockito)
-
作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...
- 揭秘Java代码背后的质检双侠:JUnit与Mockito!
-
你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...
- 单元测试框架哪家强?Junit来帮忙!
-
大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)