Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Network - RPC #24

Open
tomoya06 opened this issue Sep 29, 2020 · 0 comments
Open

Network - RPC #24

tomoya06 opened this issue Sep 29, 2020 · 0 comments

Comments

@tomoya06
Copy link
Owner

tomoya06 commented Sep 29, 2020

RPC

Remote Procedure Call Protocol aka. RPC aka. 远程过程调用协议

定义:一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员就像调用本地程序一样,无需关注细节。

WHY RPC?

根据RPC概念提出者的说法,RPC有以下特点:

  1. 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
  2. 高效:过程调用看起来十分简单而且高效。
  3. 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。

通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们把 RPC 作成和本地调用完全类似,那么就更容易被接受,使用起来毫无障碍。

RPC结构

本节参考博客

RPC的程序包括以下5个部分:

  1. User
  2. User-stub
  3. RPCRuntime
  4. Server-stub
  5. Server

关系如图:

image

流程如下:

  1. 这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。
  2. user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码,并通过本地的 RPCRuntime 实例传输到远端的实例。
  3. 远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。

RESTful / HTTP vs RPC

本节参考掘金博客

严格意义上两者并不在同一层级上,更有甚者,gRPC已经是建立在HTTP协议上实现的RPC框架。但两者都作为远程数据交互的实现协议,故经常一起对比。

接口调用通常包含两个部分:序列化协议和通信协议

通信协议

RESTful,全称 Representational State Transfer aka. 表述性状态传递,是一种软件架构风格,典型应用是HTTP,所以一般都认为RESTful就是HTTP协议。

RPC也是基于TCP/IP协议簇实现的通信协议。gRPC是基于HTTP2.0协议实现

序列化协议

序列化和反序列化更多介绍,参考美团技术博客

常用的序列化协议包括:json / xml / protobuf / thrift / bytes等

  • RESTful常用的序列化协议是JSON或XML;
  • RPC常用的有json-rpc / xml-rpc / protobuf / thrift等

使用方法

  • HTTP只关注服务提供方,不关心调用方;调用方不知道具体实现的方法,只关心要获取的资源,通过URI调用
  • RPC要求客户端和服务端在具体方法、数据类型都保持一致,实现客户端像调用本地方法一样调用

面向对象

RESTful面向资源;RPC面向方法。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant