RPC原理分析和架构设计要点.docx

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? RPC原理分析和架构设计要点 ? ? 一、基础概念 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。 RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC。会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化。 但rpc在实际项目中基于http协议的webService使用的更多。 对于远程调用的基于restful的webservice主要有以下几种实现方式 1.org.springframework.web.client.RestTemplate 2.mons.httpclient.HttpClient 可以使用这些组件来进行远程调用,就像是在浏览器或者postman等工具上调用一样的效果。 二、RPC原理 由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle(开源)等。 要让网络通信细节对使用者透明,我们需要对通信细节进行封装,我们先看下一个RPC调用的流程涉及到哪些通信细节: 2.1 RPC调用的流程 1.服务消费方(client)调用以本地调用方式调用服务; 2.client stub接收到调用后负责将方法、参数等按照协议组装成能够进行网络传输的消息体,即进行编码和系列化。 3.client stub找到服务地址,并将消息发送到服务端; 4.server stub收到消息后进行解码和反系列化 5.server stub根据解码结果调用本地的服务; 6.本地服务执行并将结果返回给server stub; 7.server stub将返回结果打包成消息并发送至消费方; 8.client stub接收到消息,并进行解码; 9.服务消费方得到最终结果。 RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。 三、架构设计 在一个典型RPC的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中RPC协议就指明了程序如何进行网络传输和序列化 。 3.1 rpc协议基本组成 3.1.1 http协议报文 请求消息Request 请求行:用来说明请求类型,要访问的资源以及所使用的HTTP版本. 请求头:紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息。 从第二行起为请求头部,HOST将指出请求的目的地. User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等 空行:请求头部后面的空行是必须的 请求body:数据也叫主体,可以添加任意的其他数据。 响应消息Response 状态:,由HTTP协议版本号, 状态码, 状态消息 三部分组成。 消息报头:用来说明客户端要使用的一些附加信息 空行:消息报头后面的空行是必须的 响应body:服务器返回给客户端的文本信息。 3.1.2 Dubbo 协议报文 通过查看dubbo控制台事列如下: provider节点: consumer节点: 其实质dubbo协议就是仿造http协议规范而进行自定义的。 Dubbo协议的编解码过程 dubbo在编码或解码的过程中就会对参数或结果进行序列化。 3.2 技术选型 1.序列化 什么是序列化?序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。 什么是反序列化?将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。 为什么需要序列化?转换为二进制串后才好进行网络传输嘛! 为什么需要反序列化?将二进制转换为对象才好进行后续处理! Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架, 比如:Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能。 2.网路传输 为了支持高并发,传统

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地重庆
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档