RPC简介
RPC的根本问题是耦合(远程调用框架)。RPC更偏向内部调用,REST更偏向外部调用。socket是RPC经常采用的通信手段之一,除了Socket,RPC还有其他的通信方法,比如:http、操作系统自带的管道等技术来实现对于远程程序的调用。微软的Windows系统中,RPC就是采用命名管道进行通信。
RPC优势
相比HTTP,用 RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西,头部有非常多冗余<对于 RPC 服务而言>),一般微服务之间内部通常利用RPC通信会比较好,其实RESTFUL API也算rpc的一种,只是这种rpc被规定为利用http协议传输。
RPC框架
1 | gRPC # 谷歌开源的rpc框架,支持多种流行语言(利用HTTP2作为传输层) |
2 | Netty # Netty框架不局限于RPC,更多的是作为一种网络协议的实现框架,比如HTTP,由于RPC需要高效的网络通信,就可能选择以Netty作为基础。 |
3 | brpc # 基于protobuf接口的RPC框架 |
4 | Dubbo # Alibaba开发的一个RPC框架,远程接口基于Java Interface, 依托于Spring框架。 |
5 | Thrift # 是Apache的一个项目,前身是Facebook开发的一个RPC框架,采用thrift作为IDL |
6 | jsonrpc |
JSON-RPC
JSON-RPC是一种序列化协议。JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
1
# 非常简单,方便,速度慢
2
相关Python包(直接集成到flask和django)
3
Flask-JSONRPC,django-json-rpc;jsonrpcserver,jsonrpcclient
thrift
Facebook开源的跨语言RPC框架。
gRPC
tensorflow分布式与tensorflow serving底层通信都是是用的grpc
序列化用protobuf,通信使用http2,支持 C, C++, Node.js, Python, Ruby, Objective-C,PHP, C#
RPC与HTTP区别
RPC 和 Web 的区别,其实是在谈论 2 个东西:序列化协议和传输协议。序列化协议比如常见的 XML,JSON 和比较现代的 Protocol Buffers、Thrift。 传输协议比如 TCP、UDP 以及更高层的 HTTP 1.1、HTTP 2.0。
- HTTP 是面向浏览器设计的应用层协议,操作的核心在资源。我们更多的用 Web 服务在做网站。
- RPC 是为了在像在本地调用一个函数那样调用远程的代码而设计的,所以更关注减少本地调用和远程调用的差异,像 SOAP(简单对象访问协议) 这种东西是可以把对象当参数传的。
1 | ''' |
2 | HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。 |
3 | HTTP/2的主要目标是通过启用完整请求和响应复用来减少延迟,通过有效压缩HTTP头字段来最大限度地降低协议开销,并添加对请求优先级和服务器推送的支持;多路复用(同一tcp,多个流),头部压缩,服务推送。 |
4 | ''' |
5 | HTTP2协议 |
6 | |
7 | ''' |
8 | Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。 |
9 | 同 XML 相比, Protobuf 的主要优点在于性能高。它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍。 |
10 | ''' |
11 | Protobuf协议 |