RPC 技术原理
       RPC ( Remote Procedure Call Protocol,远程过程调用协议 ): 客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样 。

1.RPC要点

RPC 是协议 : 既然是协议就只是一套规范规则,也就需要有人遵循这套规范来进行实现 。 目前典型的 RPC 实现包括 : dubbo (注意是小写的,不是大写的 DUBBO 服务治理框架〉 、 Apache Thrift、 GRPC 、 Hetty等 。

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

信息格式对其透明 : 这些调用与返回的参数会以某种信息格式传递给网络上的另外一台计算机,这个信息格式是怎样构成的,调用方就不需要关心了 ,

RPC 框架都应该有跨语言能力:当然,现实情况下由于一些 RPC 框架的特殊工作场景 ,也没有强行要求其提供跨语言能力,例如只工作在 Java 语言下的 RMI 就是这样一套 RPC 框架。

2.RPC要素

•  Client: RPC 协议的调用者。最理想的情况是 RPC 调用者在完全不知道有 RPC 框架存在的情况下发起对远程服务的调用。但实际情况来说 Client 或多或少都需要指定RPC框架的一些细节。
     • Server : 在 RPC 规范中 , 这个 Server 并不是提供 RPC 服务器 IP、端口监昕的模块 。 而是远程服务上业务逻辑的具体实现(在 Java 中就体现为 RPC 服务接口的具体实现) 。其中的代码是最普通的和业务相关的代码,甚至其接口实现类本身都不知道将被某一个 RPC 远程客户端调用。
     • Proxy: RPC 代理存在于客户端 , 因为要实现客户端对 RPC 框架“透明”调用,那么客户端就不可能自行去管理消息格式 , 不可能自己去管理网络传输协议,也不可能自己去判断调用过程是否有异常。这一切工作在客户端都是交给RPC框架中的“代理”层来处理的。
     • Message Protocol : 一次完整的 RPC Client-Server 的交互肯定要携带某种两端都能识别的,共同约定的消息格式。 RPC 的消息管理层专门对网络传输所承载的信息进行编号和解码操作。目前流行的技术趋势是不同 的 RPC 实现,为了加强自身框架的效率都有一套(或者几套)私有 的 消息格式 。例如后文我们将讲解的 一套 RPC 框架 Apache Thrift , 就 拥 有私有 化的 消息 协 议。当然 Ap ache Thri位 还支持通用的消息格式,如JSON )。
     • Transfer/Network Protocol : 传输协议层负责管理 RPC 框架所使用的网络协议、网络I/O模型 。 例如 Hessian 的传输协议基于 Http (应用层协议) : 再例如 Apache Thrift的传输协议基于 TCP (传输层协议)。传输层还需要统一 RPC 客户端和 RPC 服务端所使用的网络I/O模型 。
     • Processor:存在于 RPC 服务端,由于服务器端某一个 RPC 接口的实现特性(它并不知道自己是一个将要被 RPC 提供给第三方系统调用的服务)。所以在 RPC 框架中应该有一种“负责执行 RPC 接口实现”的角色。它的职责包括管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在 内的各种工作 。
     • IDL :虽然 IDL (接口定义语言)并不是 RPC 实现中所必须的。但是需要跨语言的RPC 框架一定会有 IDL 部分的存在。这是因为要找到一个各种语言能够理解的消息结构、接口定义的描述形式 。 如果你的 RPC 实现没有考虑跨语言性,那么 IDL 部分就不需要。例如 Java RMI 就是一种专门在 Java 语言间进行使用的特殊的 RPC 框架,它设计之初就没有要求要有跨语言执行特性,所以 Java RMI 没有相应的 IDL 。
     • 不同的 RPC 实现都有一定设计差异。例如生成 Proxy 的方式不一样 、 IDL 描述语言的语法不一样、服务注册的管理方式不一样、运行服务实现的方式不一样 、 采用的消息格式封装不一样、采用的网络协议不一样,等等。


3.典型的 RPC 框架介绍

     1)Java RMI : Java RPC , Java Serializable, TCP,        java
     2)GRPC     : Google,    ProtoBuf,          HTTP/2,     众多语言
     3)Thrift   :FaceBook,  Thrift(私有二进制,LVQ,JSON),  TCP,        众多语言
     4)Hetty    :Netty/Hessian, 私有二进制,   HTTP,       众多语言
     5)WebService: XFire/CXF, XML,              HTTP,       众多语言

RPC簡介的更多相关文章

  1. Scripting Languages 簡介

    Scripting Languages 簡介 何謂 Scripting? 命令稿語言 scripting language 是什麼? 很難給一個嚴格的定義; 不妨看看最具代表性的幾個例子: perl, ...

  2. Source Tree 簡介

    Table of Contents 1. 什麼是 Source Tree ? 1.1. 下載 1.2. SourceTree 介面簡介 1.3. git 指令/狀態圖 2. SourceTrees 超 ...

  3. 一起來玩鳥 Starling Framework 簡介

    開場 Starling Framework是一套Flash 2D遊戲開發"工具",是使用Flash最新的Stage3D API建構出來的一套Framework.最大優點在於使用GP ...

  4. SQL Server 的 Statistics 簡介

    當你要清空「資料表(table)」,或倒入大量「資料(data;record)」,或公司「資料庫(database)」改用新版本要資料大搬家…等情形,不只是要重建「索引(index)」,還應要重建或更 ...

  5. 網站SSL加密原理簡介(2张图,握手有9个步骤,解释的很清楚)

    Secure Socket Layer說明 SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸.最早是Netscape公司所提出,SSL的目 ...

  6. COB (Chip On Board) 製程介紹/簡介/注意事項 I

    COB (Chip On Board)在電子製造業並不是一項新鮮的技術,但最近我卻常常被問到相關的問題及資料索取.也許真的是產品越來越小了,而較進階的技術又太貴,所以又有人回過頭來考慮COB的製程. ...

  7. Vue簡介

    vue使用由下向上的增量開發模型: vue是javascript的漸進框架: vue的目標是盡量使用簡單的API實現響應的數據綁定和組合的視圖組件.

  8. jQuery 簡介

    jQuery:是一個js庫,可以極大地簡化編程,“寫得少做得多”. jquery的作用: 挑選元素.操作屬性.事件函數.動畫和效果.ajax: jQuery庫:google和microsoft都支持, ...

  9. 第一章 Linux內核簡介

    1. Linux是類Unix系統,但他不是Unix. 儘管Linux借鑑了Unix的許多設計並且實現了Unix的API(由Posix標準和其他Single Unix Specification定義的) ...

随机推荐

  1. 使用win10自带邮件应用发送文件

    之前的电脑装过邮件客户端,想发送文件给别人时,只需要“右键文件——发送到邮件”,就能把文件作为附件发送给对方.新电脑win10系统自带邮件客户端,所以就想直接用.但是右键发送到邮件没有关联上,用不了. ...

  2. git问题--Push rejected: Push to origin/master was rejected

    解决git问题 Push rejected: Push to origin/master was rejected 意思是git拒绝合并两个不相干的东西 此时你需要在打开Git Bash,然后进入相应 ...

  3. Go语言学习笔记(2)——变量、常量

    1. 变量(变量由字母.数字和下划线组成,且不能以数字开头!)      1.1 第一种 var name type // 未赋值时使用默认值 name = value 1.2 第二种: 根据所赋的值 ...

  4. 【bzoj2422】 Times 前缀和

    本来想练一下树状数组的,看到网上某人的blog后点了进来. 第一眼发现不会,出去上了个厕所发现离散化后不是一道简单前缀和题吗. 考虑到每一个人出现且仅出现一次,且出现的时间是在一个连续的区间内. 那么 ...

  5. Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)

    大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...

  6. Java之IO(十四)IO包中其它类

    转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...

  7. SpringMVC路径匹配规则AntPathMatcher

    前言 本文是基于Spring Framework 4.3.3分析. 正文 SpringMVC的路径匹配规则是依照Ant的来的. 实际上不只是SpringMVC,整个Spring框架的路径解析都是按照A ...

  8. pthread和semaphore的简单应用以及四个典型的多线程问题

    pthread和semaphore的简单应用以及四个典型的多线程问题 pthread常用函数简单介绍 创建线程 int  pthread_create(pthread_t  *  thread, pt ...

  9. 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比

    本文出自 “抚琴煮酒” 博客,出处http://andrewyu.blog.51cto.com/1604432/697466   现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶 ...

  10. Node.js数据流Stream之Duplex流和Transform流

    Duplex流一个很好的例子是TCP套接字连接.需要实现_read(size)和_Write(data,encoding,callback)方法. var stream = require('stre ...