RPC的基本概念

1、概述

经过了详细的信息格式、网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热。从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC。在后续的几篇文章中,我们首先讲解RPC的基本概念,一个具体的RPC实现会有哪些基本要素构成,然后我们详细介绍一款典型的RPC框架:Apache Thrift。接下来我们聊聊服务治理和DUBBO服务框架。最后总结一下如何在实际工作中选择合适的RPC框架。

2、RPC概述

2-1、什么是RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。那么我们至少从这样的描述中挖掘出几个要点:

  • RPC是协议:既然是协议就只是一套规范,那么就需要有人遵循这套规范来进行实现。目前典型的RPC实现包括:Dubbo、Thrift、GRPC、Hetty等。这里要说明一下,目前技术的发展趋势来看,实现了RPC协议的应用工具往往都会附加其他重要功能,例如Dubbo还包括了服务管理、访问权限管理等功能。

  • 网络协议和网络IO模型对其透明:既然RPC的客户端认为自己是在调用本地对象。那么传输层使用的是TCP/UDP还是HTTP协议,又或者是一些其他的网络协议它就不需要关心了。既然网络协议对其透明,那么调用过程中,使用的是哪一种网络IO模型调用者也不需要关心。

  • 信息格式对其透明:我们知道在本地应用程序中,对于某个对象的调用需要传递一些参数,并且会返回一个调用结果。至于被调用的对象内部是如何使用这些参数,并计算出处理结果的,调用方是不需要关心的。那么对于远程调用来说,这些参数会以某种信息格式传递给网络上的另外一台计算机,这个信息格式是怎样构成的,调用方是不需要关心的

  • 应该有跨语言能力:为什么这样说呢?因为调用方实际上也不清楚远程服务器的应用程序是使用什么语言运行的。那么对于调用方来说,无论服务器方使用的是什么语言,本次调用都应该成功,并且返回值也应该按照调用方程序语言所能理解的形式进行描述

那么上面的描述情况可以用下图表示:

这里写图片描述

2-2、RPC要素

当然,上图是作为RPC的调用者所观察到的现象(而实际情况是客户端或多或少的还是需要知道一些调用RPC的细节)。但是我们是要讲解RPC的基本概念,所以RPC协议内部是怎么回事就要说清楚:

这里写图片描述

  • Client:RPC协议的调用方。就像上文所描述的那样,最理想的情况是RPC Client在完全不知道有RPC框架存在的情况下发起对远程服务的调用。但实际情况来说Client或多或少的都需要指定RPC框架的一些细节。

  • Server:在RPC规范中,这个Server并不是提供RPC服务器IP、端口监听的模块。而是远程服务方法的具体实现(在JAVA中就是RPC服务接口的具体实现)。其中的代码是最普通的和业务相关的代码,甚至其接口实现类本身都不知道将被某一个RPC远程客户端调用

  • Stub/Proxy:RPC代理存在于客户端,因为要实现客户端对RPC框架“透明”调用,那么客户端不可能自行去管理消息格式、不可能自己去管理网络传输协议,也不可能自己去判断调用过程是否有异常。这一切工作在客户端都是交给RPC框架中的“代理”层来处理的。

  • Message Protocol:在上文我们已经说到,一次完整的client-server的交互肯定是携带某种两端都能识别的,共同约定的消息格式。RPC的消息管理层专门对网络传输所承载的消息信息进行编号和解码操作。目前流行的技术趋势是不同的RPC实现,为了加强自身框架的效率都有一套(或者几套)私有的消息格式。例如前文所讲到的RMI框架使用的消息协议为JRMP;后文我们将详细讲解的RPC框架Thrift也有私有的消息协议,“- Transfer/Network Protocol”(当然它还支持一些通用的消息格式,如JSON)。

  • Transfer/Network Protocol:传输协议层负责管理RPC框架所使用的网络协议、网络IO模型。例如Hessian的传输协议基于HTTP(应用层协议);而Thrift的传输协议基于TCP(传输层协议)。传输层还需要统一RPC客户端和RPC服务端所使用的IO模型;常用的IO模型在之前已经详细讲解过了(可参见我之前的博文《架构设计:系统间通信(3)——IO通信模型和JAVA实践 上篇》)

  • Selector/Processor:存在于RPC服务端,由于服务器端某一个RPC接口的实现的特性(它并不知道自己是一个将要被RPC提供给第三方系统调用的服务)。所以在RPC框架中应该有一种“负责执行RPC接口实现”的角色。它负责了包括:管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在内的各种工作。

  • IDL:实际上IDL(接口定义语言)并不是RPC实现中所必须的。但是需要跨语言的RPC框架一定会有IDL部分的存在。这是因为要找到一个各种语言能够理解的消息结构、接口定义的描述形式。如果您的RPC实现没有考虑跨语言性,那么IDL部分就不需要包括,例如JAVA RMI因为就是为了在JAVA语言间进行使用,所以JAVA RMI就没有相应的IDL。

  • 一定要说明一点,不同的RPC框架实现都有一定设计差异。例如生成Stub的方式不一样,IDL描述语言不一样、服务注册的管理方式不一样、运行服务实现的方式不一样、采用的消息格式封装不一样、采用的网络协议不一样。但是基本的思路都是一样的,上图中的所列出的要素也都是具有的。

2-3、典型的RPC框架介绍

  • JAVA RMI:是不是觉得前文中我们介绍RMI所提到几个关键概念在RPC中都找得到一些影子。是的,RPC最早就是由SUN提出,并在后来由IETF ONC修订。RMI就是一个典型的RPC实现,只不过RMI不支持跨语言性,所以RMI中也没有IDL存在的必要。但是RMI真心快,并且由于没有IDL的存在,在构建一套完整的RPC实现时要比其他RPC框架少了一些步骤,所以使用起来也比较简单。如果您的业务需求中并不存在跨语言的考虑,并且基本上主要系统都是用JAVA实现,那么RMI绝对是您一个可以考虑的方案。

  • GRPC:GRPC是一个高性能、通用的开源RPC框架,由Google主要面向移动应用开发并基于HTTP/2协议(注意是HTTP/2协议,不是我们常使用的HTTP 1_1。HTTP/2协议详细的介绍可以参见官方地址:https://http2.github.io/)标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。为了支持GRPC的跨语言性,GRPC有一套独立存在IDL语言。不过由于GRPC是Google的开源产品,在信息格式封装方面Google主要还是推广的自己的ProtoBuf,所以GPRC是不支持其他信息格式的(至少ProtoBuf效率是大家有目共睹的)。关于GRPC详细的使用介绍,可以参见官方地址:https://github.com/grpc/grpc

  • Thrift:Thrift是Facebook的一个开源项目,后来进入Apache进行孵化。Thrift也是支持跨语言的,所以它有自己的一套IDL。目前它支持几乎所有主流的编程语言:C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages。Thrift可以支持多种信息格式,除了Thrift私有的二进制编码规则和一种LVQ(类似于TLV消息格式)的消息格式,还有常规的JSON格式。Thrift的网络协议建立在TCP协议基础上,并且支持阻塞式IO模型和多路IO复用模型。我们将在后文详细讲解Apache Thrift的使用。Thrift也是目前最流行的RPC框架之一,从网络上各种性能测试情况开,Thrift的性能都是领先的。Thrift的官网地址为:http://thrift.apache.org/

  • Hetty:Hetty是一款构建于Netty和Hessian基础上的高性能的RPC框架。在前几篇文章中,我已经详细讲述了使用Netty进行网络处理和直接使用JAVA原生的IO模型进行网络处理所带来的好处(请参见我的另一篇博文《http://blog.csdn.net/yinwenjie/article/details/48969853》)。Hetty的网络协议基于HTTP,由于采用了Netty,所以Hetty支持阻塞式IO模型和多路IO复用模型。Hetty的消息格式采用私有的二进制流格式。

  • Dubbo:Dubbo是Alibaba开源的分布式服务框架。注意我说的是分布式服务框架,不是RPC框架(用比较严谨的词语概括,应该是“服务治理框架”)。除了集成RPC的规范外,Dubbo还在RPC的上层搭建服务层功能、配置层功能、服务路由功能(加上真正的RPC规范实现总共有10层)。在后文讲解“服务治理”时会重点讲解Dubbo的原理和使用。

  • 其他的RPC框架:除了上诉的RPC协议的实现外,还有:Wildfly、Hprose等等。Hprose是一款国人主导的RPC实现,感兴趣的读者可以去看看(http://www.hprose.com/)。另外基于RPC的定义,Xfire,CXF这些Web Service框架也属于RPC:WSDL描述文件就是他们的IDL,通过WSDL为不同的编程语言生成Stub、通过不同的Web服务器管理具体服务实现的运行过程、HTTP是它们的通信协议、XML是它们的消息格式。

3、RPC框架的性能依据

这里写图片描述

在物理服务器性能相同的情况下,以下几个因素会对一款RPC框架的性能产生直接影响:

  • 所支持的网络IO模型:您的RPC服务器可以只支持传统的阻塞式同步IO,也可以做一些改进让您的RPC服务器支持非阻塞式同步IO,或者在您的服务器上实现对多路IO模型的支持。这样的RPC服务器的性能在高并发状态下,会有很大的差别。特别是单位处理性能下对内存、CPU资源的使用率

  • 基于的网络协议:一般来说您可以选择让您的RPC使用应用层协议,例如HTTP或者之前我们提到的HTTP/2协议,或者使用TCP协议,让您的RPC框架工作在传输层。工作在哪一层网络上会对RPC框架的工作性能产生一定的影响,但是对RPC最终的性能影响并不大。但是至少从各种主流的RPC实现来看,没有采用UDP协议做为主要的传输协议的。

  • 选择的消息封装格式:选择或者定义一种消息格式的封装,要考虑的问题包括:消息的易读性、描述单位内容时的消息体大小、编码难度、解码难度、解决半包/粘包问题的难易度。当然如果您只是想定义一种RPC专用的消息格式,那么消息的易读性可能不是最需要考虑的。消息封装格式的设计是目前各种RPC框架性能差异的最重要原因,这就是为什么几乎所有主流的RPC框架都会设计私有的消息封装格式的原因。

  • 实现的服务处理管理方式:在高并发请求下,如何管理注册的服务也是一个性能影响点。您可以让RPC的Selector/Processor使用单个线程运行服务的具体实现(这意味着上一个客户端的请求没有处理完,下一个客户端的请求就需要等待)、您也可以为每一个RPC具体服务的实现开启一个独立的线程运行(可以一次处理多个请求,但是操作系统对于“可运行的最大线程数”是有限制的)、您也可以线程池来运行RPC具体的服务实现(目前看来,在单个服务节点的情况下,这种方式是比较好的)、您还可以通过注册代理的方式让多个服务节点来运行具体的RPC服务实现。

4、后文介绍

后文中,我会花一篇文章的篇幅介绍Apache Thrift RPC框架的使用和Thrift 框架区别于其他RPC框架的技术特点。然后我们谈谈在大型系统中,针对众多RPC服务这种情况,如何有效的对RPC服务进行管理。我们首先谈谈解决思路,然后试着自己解决一下这个问题。最后我们介绍Dubbo分布式服务框架,看看Dubbo是如何解决这个问题的。

版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http://blog.csdn.net/yinwenjie 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
介绍RCP的实现原理 目录 1. 前言 2 2. 基本概念 3 2.1. IDL 3 2.2. 代理(Proxy) 3 2.3. 存根(Stub) 4 3. 三要素 4 3.1. 网络通讯 4 3.2. 消息编解码 5 3.3. IDL编译器 5 4. flex和bison 5 4.1. 准备概念 5 4.1.1. 正则表达式(regex/regexp) 6 4.1.2. 符号∈ 6 4.1.3. 终结符/非终结符/产生式 6 4.1.4. 记号(Token) 6 4.1.5. 形式文法 7 4.1.6. 上下文无关文法(CFG) 7 4.1.7. BNF 8 4.1.8. 推导 8 4.1.9. 语法树 8 4.1.10. LL(k) 9 4.1.11. LR(k) 9 4.1.12. LALR(k) 9 4.1.13. GLR 9 4.1.14. 移进/归约 9 4.2. flex和bison文件格式 9 4.2.1. 定义部分 10 4.2.2. 规则部分 10 4.2.3. 用户子例程部分 10 4.3. flex基础 10 4.3.1. flex文件格式 11 4.3.2. 选项 11 4.3.3. 名字定义 11 4.3.4. 词法规则 12 4.3.5. 匹配规则 12 4.3.6. %option 13 4.3.7. 全局变量yytext 13 4.3.8. 全局变量yyval 13 4.3.9. 全局变量yyleng 13 4.3.10. 全局函数yylex 13 4.3.11. 全局函数yywrap 13 4.4. bison基础 14 4.4.1. bison文件格式 14 4.4.2. %union 14 4.4.3. %token 15 4.4.4. 全局函数yyerror() 15 4.4.5. 全局函数yyparse() 15 4.5. 例1:单词计数 15 4.5.1. 目的 15 4.5.2. flex词法文件wc.l 16 4.5.3. Makefile 16 4.6. 例2:表达式 17 4.6.1. 目的 17 4.6.2. flex词法exp.l 17 4.6.3. bison语法exp.y 17 4.6.4. Makefile 19 4.6.5. 代码集成 19 4.7. 例3:函数 20 4.7.1. 目的 20 4.7.2. func.h 20 4.7.3. func.c 21 4.7.4. IDL代码func.idl 22 4.7.5. flex词法func.l 22 4.7.6. bison语法func.y 24 4.7.7. Makefile 27 5. 进阶 27 5.1. 客户端函数实现 27 5.2. 服务端函数实现 28 5.2.1. Stub部分实现 28 5.2.2. 用户部分实现 29 6. 参考资料 29
### 回答1: RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许在不同的计算机之间进行远程通信和调用远程程序。RPC 8211是一份中文手册,用于指导开发人员如何使用RPC 8211协议进行远程过程调用。下面是关于该手册的简要说明: RPC 8211中文手册包含了如何使用RPC 8211进行远程过程调用的详细说明。它提供了关于如何配置、部署和使用RPC框架的详细指导。手册中还包括了一些示例代码,以帮助开发人员更好地理解和应用RPC 8211协议。 手册首先介绍了RPC基本概念和原理,包括远程过程调用的基本流程和通信模型。然后,它详细说明了如何在不同的编程语言和操作系统中实现RPC 8211协议。针对每种语言和操作系统,手册提供了具体的配置和使用方法。 此外,手册还介绍了RPC 8211协议的安全性和可靠性相关的内容。它提供了一些安全和认证的机制,以确保通信过程中的数据安全和防止恶意攻击。同时,手册还介绍了一些错误处理和故障恢复的策略,以增加系统的可靠性和稳定性。 总的来说,RPC 8211中文手册是一份详尽的指南,提供了使用RPC 8211协议进行远程过程调用的完整解决方案。它对RPC基本概念、配置和使用方法以及安全性和可靠性等方面进行了全面的讲解。对于需要开发远程通信应用的开发人员来说,该手册将是一份宝贵的参考资料。 ### 回答2: RPC-8211是一款通信协议,它允许计算机系统之间进行远程过程调用(Remote Procedure Call)。这种协议的设计旨在实现多台计算机之间的分布式计算,使得各个计算机系统能够共享资源并协同工作。 RPC-8211的中文手册提供了对该协议的详细说明和使用指南。手册首先介绍了RPC-8211的背景和基本原理,包括如何建立连接、请求与响应的数据格式等。随后,手册详细介绍了如何使用该协议进行远程过程调用的编程操作。 手册中解释了远程过程调用的概念,即通过发送请求消息到远程计算机,然后在远端执行该请求对应的过程,并将结果返回给本地计算机。手册列出了使用RPC-8211时需要遵循的规则和步骤,包括如何定义函数接口、传递参数和处理异常等。 此外,手册还提供了一些示例代码和常见问题的解答,帮助开发人员更好地理解和应用RPC-8211协议。手册对于初学者来说非常友好,详细解释了每个概念和步骤,并配有清晰的图示来进一步说明。 总之,RPC-8211中文手册是一个对这一通信协议进行详细说明和使用指南的文档。它帮助开发人员了解如何使用RPC-8211协议进行远程过程调用,提供了示例代码和常见问题解答,为开发人员提供了便利和指导。无论是初学者还是有经验的开发人员,都可以从中受益并更好地使用RPC-8211协议进行分布式计算。 ### 回答3: RPC8211是一本中文手册,旨在介绍和解释有关RPC(Remote Procedure Call,远程过程调用)的相关概念和原理。该手册是为开发人员和系统管理员提供的参考资料,以帮助他们更好地了解和使用RPC技术。 手册中首先介绍了RPC基本概念和工作原理。它解释了RPC是一种用于不同计算机之间进行通信和交互的技术,允许远程计算机之间执行函数或过程。手册详细描述了RPC的工作流程,包括客户端调用远程过程,数据在网络上传输,远程过程在服务器端执行并返回结果给客户端。 接着,手册详细讲解了RPC的实现和使用方法。它介绍了RPC框架和协议的选择,例如常用的RPC框架有gRPC和Apache Thrift等。手册还提供了使用RPC的实际示例和代码,以帮助读者更好地理解如何在自己的项目中应用RPC技术。 除了基本概念和使用方法,手册还包含了一些关于RPC的高级主题。它涵盖了安全性和认证方面的内容,以及在分布式系统中使用RPC的注意事项和最佳实践。手册还介绍了如何进行性能优化和故障排除,以确保RPC在实际应用中的稳定性和可靠性。 最后,手册还提供了常见问题解答和附录部分,方便读者进一步深入学习和了解RPC技术。同时,手册还提供了一些相关资源的引用,如书籍、网站和论坛等,以帮助读者获取更多关于RPC的资料和支持。 总之,RPC8211中文手册是一本全面介绍RPC技术的参考资料,它涵盖了从基本概念到高级主题的内容,帮助开发人员和系统管理员更好地使用和理解RPC,在分布式系统中实现更好的通信和协作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值