zoukankan      html  css  js  c++  java
  • 简单理解 RPC(转载)

    原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html

    RPC(Remote Procedure Call Protocol)—— 远程过程调用协议。这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。

    RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

    RPC 的几个特点

    1. 简单地说,RPC 就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果;
    2. RPC 会隐藏底层的通讯细节(不需要直接处理 Socket 通讯或 Http 通讯);
    3. RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于 Http 的工作方式);
    4. RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

    RPC 常用数据序列话协议

    1. Json
    2. Xml
    3. PHP serialize
    4. 二进制,如 Protobuf、msgpack

    RPC 常用通信协议

    1. Http
    2. Tcp
    3. Socket
    4. Websocket

    看一个 PHP 的客户端调用例子

    RpcClient::serv('User')->handler('UserInfo')->getUserInfoById($id);

    Rpc 流程图

    rpc状态图.jpg

    1. 调用客户端句柄;执行传送参数
    2. 调用本地系统内核发送网络消息
    3. 消息传送到远程主机
    4. 服务器句柄得到消息并取得参数
    5. 执行远程过程
    6. 执行的过程将结果返回服务器句柄
    7. 服务器句柄返回结果,调用远程系统内核
    8. 消息传回本地主机
    9. 客户句柄由内核接收消息
    10. 客户接收句柄返回的数据

    常见的 RPC 框架:

    1. Thrift
    2. gRpc
    3. Yar
    4. hprose
    5. dubbo

    二、Protobuf 和 Thrift 介绍

    Protobuf

    Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.

    Protobuf 是一种二进制数据序列化协议,相对 xml、json 这些协议来说,它具有更小、性能更好、效率更快的优势。同样因为是二进制协议也就带来了可读性更差问题。目前还没有官方支持的 php 扩展,但有比如 php-protobuf 这样的开源扩展。Protobuf 对数据序列化后可用于 RPC 框架的数据传输交互。

    Thrift

    Thrift 最初由 facebook 开发用做系统内各语言之间的 RPC 通信,它提供了全套的 RPC 解决方案,包括序列化机制、传输层、并发处理框架等。

    Thrift通过一个中间语言(IDL, 接口定义语言)来定义 RPC 的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持 C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 和 OCaml),并由生成的代码负责 RPC 协议层和传输层的实现。
    Thrift 实际上是实现了 C/S 模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在 Thirft 描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中 protocol(协议层, 定义数据传输格式,可以为二进制或者 XML 等)和 transport(传输层,定义数据传输方式,可以为 TCP/IP 传输,内存共享或者文件共享等)被用作运行时库。

    Thrift 支持多种协议格式的序列化和反序列化,如二进制,json 格式。这让用户可以更加灵活的选择协议的具体形式。更完美的是,协议是可自由扩展的,新版本的协议,完全兼容老的版本!

    四、参考

      1. http://baike.baidu.com/link?url=3b4Gnihli1pE0_o5z19CQQSNms3wM7d2m92DGagukwFsqzTUx9RI_fOBgMKOzGsJHAC_Qch-ivoFFSMNfP7c88zjJGpKb0-yrwmqOmmYnxppSHVtkt_RG__cbgf6vW1UDXpP4xQIi_FNVRgiSG7MkdQkHotrJEvxJfuMtNAP9gwPUYTmurwqCwHOqVgN5UFjfnOU7VPD6f7PP4ep6dII7q
      2. http://blog.csdn.net/tantexian/article/details/48196453
  • 相关阅读:
    python 连接sql server 解决中文乱码 及配置使用 web 服务使用
    Android调用.net的webservice服务器接收参数为空的情况
    好题推荐
    算法中一些trick和细节
    洛谷P2181 对角线
    新的开始
    文化课倒计时80天
    Electron-vue实现后台多进程(三. 自动化测试篇)
    工作感受月记202107月
    工作感受月记202106月
  • 原文地址:https://www.cnblogs.com/draem0507/p/9364734.html
Copyright © 2011-2022 走看看