RPC概述

  RPC(Remote Procedure Call),即远程过程调用,是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议,实现调用远程主机上的方法就像调用本地方法一样。RPC协议在分布式系统中发挥重要的作用。

RPC涉及的技术

                                                  图片摘自http://blog.csdn.net/yinwenjie/article/details/49453303

  

  RPC是典型的C/S模型,可以逻辑上由下到上划分为Transfer/Network Protocol、Message Protocol、Selector/Processor(Server端)和Stub/Proxy(Client端)等层次。

  Transfer/Network Protocol层

    主要负责不同主机之间数据的传输,主要包括采用的网络传输协议和网络I/O模型。

    传输协议(Transport Protocol)

      大多数RPC是建立在TCP协议(传输层协议)之上,因为TCP具有面向连接的、全双工、可靠传输(按序、不重、不丢、容错)、流量控制(滑动窗口)等特点。当然也可以使用http协议、UDP协议等。

    I/O模型(I/O Model)

      阻塞式同步IO(bloking IO)、非阻塞式同步IO(non-blocking IO)、多路复用IO(multiplexing IO)、异步IO(asynchronous IO)

      具体特点见I/O随笔。

  Message Protocol层

    主要负责传输数据的识别,主要包括协议结构(Wire Protocol)和序列化(Serialization),经过I/O只能在不同主机之间传输二进制数据,协议结构和序列化则是解决如何识别这些二进制数据。。

    协议结构(Wire Protocol)

      TCP粘包和半包问题

        如下图,发送端发送ABC、DEF、GHI三个Frame,而接收端可能收到四个Frame。

        

        TCP只保证将数据可靠有序的传输,但接收端收到的Frame和发送端发送的Frame可能并不一致,这就是TCP粘包和半包问题,其中AB、H、I为半包,CDEFG为粘包。

      TCP粘包和半包发生的原因

        1)应用层:应用程序write写入的字节大小大于套接口发送的缓冲区大小;

        2)TCP层:大于MSS(maximum segment size,最大报文段长度,即TCP层报文段的最大长度)的TCP分段;

        3)IP层:以太网帧大于MTU(maximum transmission unit,最大传输单元)的IP分片。

        关于MSS和MTU的相关知识可参考:http://blog.csdn.net/feng1072218457/article/details/51219251

      TCP粘包和半包的解决方法

        1)采用分隔符,例如:在消息结尾增加回车换行符(\r\n)进行分割,典型的是FTP协议。

        2)消息定长,例如:将消息分为消息头和消息体,即header+payload的方式,消息头中含有消息总长度或消息体长度,典型的是http协议。

      协议结构解决的就是TCP粘包和半包问题,它能够从二进制数据流中识别并分割出具有应用层语义的消息。

    序列化(Serialization)

      从二进制数据流中取出应用层语义的消息后,就需要将该消息转换成本地可识别的数据(例如对象或结构体等),这个过程称为序列化和反序列化技术。

      常见的序列化技术有:Protocol Buffers,Thrift,XML,JSON,MessagePack,Hessian,Protostuff,Java Native Serialize,FST等

  IDL(Interface description language,接口定义语言)

    IDL是RPC框架实现跨语言的基础,定义了一种各语言能够理解的消息结构、接口定义的描述形式。

  Stub/Proxy

    客户端通过代理实现对远程接口的调用,RPC框架Proxy负责消息格式、传输协议实现。

  Selector/Processor

    负责接收客户端的请求并执行服务端对接口的实现,主要包括:管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在内的各种工作。

常见的RPC框架

  Thrift:来自Facebook的开源项目,有自己的IDL,支持跨语言,基于TCP协议,支持多种消息格式(二进制、JSON等)、支持阻塞I/O模型和多路复用I/O模型,性能优秀。http://thrift.apache.org/

  GRPC:来自Google的开源项目,有自己的IDL,支持跨语言,基于HTTP/2协议,只支持Protocol Buffers序列化。https://github.com/grpc/grpc

  Dubbo:来自阿里的开源分布式服务框架,除了集成RPC的规范外,Dubbo还在RPC的上层搭建服务层功能、配置层功能、服务路由功能。http://dubbo.io/

  

参考资料

  体系化认识RPC

  架构设计:系统间通信(10)——RPC的基本概念

  MSS and MTU

RPC-整体概念的更多相关文章

  1. .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记

    演化与完善整体概念 ASP .NET Core 整体概念推演 整体概念推演到具体的形式 ASP .NET Core 整体概念推演 ASP .NET Core 其实就是通过 web framework ...

  2. ETCD相关介绍--整体概念及原理方面

    etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点. 简单:基于HTTP+JSON的API让你用curl就可以轻松使用. 安全:可选SSL ...

  3. 一 JAVA整体概念以及安装部署

    JAVA 基本概念  JVM(JAVA virtual machine)java虚拟机,是java的能跨平台的核心,java的跨平台实现,就是在各种系统中布置JVM,然后java应用运行在JVM中,相 ...

  4. MIT 6.824学习笔记2 RPC/Thread

    本节内容:Lect 2   RPC and Threads 线程:Threads allow one program to (logically) execute many things at onc ...

  5. 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

    文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...

  6. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

  7. Hadoop系列番外篇之一文搞懂Hadoop RPC框架及细节实现

    @ 目录 Hadoop RPC 框架解析 1.Hadoop RPC框架概述 1.1 RPC框架特点 1.2 Hadoop RPC框架 2.Java基础知识回顾 2.1 Java反射机制与动态代理 2. ...

  8. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  9. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  10. 一个轻量级分布式RPC框架--NettyRpc

    1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...

随机推荐

  1. Android系统自带样式

    android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式  android:theme="@andr ...

  2. 在Android上Kotlin的单元测试(KAD22)

    作者:Antonio Leiva 时间:Apr 25, 2017 原文链接:https://antonioleiva.com/unit-tests-android-kotlin/ 当然,Kotlin也 ...

  3. linux学习笔记---学习总结②

    table ----> 展示数据 table --->表格 border cellspacing cellpadding width height tr --->行 align th ...

  4. Android之 GPS学习笔记

    ========================================GPS:全球定位系统 GPS由三部分组成:GPS卫星组成的空间部分,若干地面组成的控制站,用户手中的接收机.Androi ...

  5. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  6. c++知识点总结--函数模板

    通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void ...

  7. [leetcode-636-Exclusive Time of Functions]

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...

  8. 父窗体和子窗体的显示,show&showdialog方法

    showdialog(): 子窗体弹出后,不能对父窗体进行操作.show()可以. 具体原理: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行  2.在调用Form.ShowDi ...

  9. java中使用POI+excel 实现数据的批量导入和导出

    java web中使用POI实现excel文件的导入和导出 文件导出 //导入excle表 public String exportXls() throws IOException{ //1.查询所有 ...

  10. STL Allocator

    从上面这个程序可以看出,我们这里手动使用了分配器,分配器有很多种类,有std::,还有非std::,也就是上面的__gnu_cxx下面的,我们在使用容器的时候不关心我们使用什么分配器,也不关心我们如何 ...