从实现一个RPC来分析其原理及用途
1 基本介绍
1.1 什么是RPC
RPC(Remote Procedure Call)——远程过程调用,是一种通过网络从远程计算机程序请求服务,而不需要了解底层网络技术的协议。
解决的问题是:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
1.2 RPC简要原理
- 服务消费方(
client
)调用以本地调用方式调用服务; client stub
接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;client stub
找到服务地址,并将消息发送到服务端;server stub
收到消息后进行解码;server stub
根据解码结果调用本地的服务;- 本地服务执行并将结果返回给
server stub
; server stub
将返回结果打包成消息并发送至消费方;client stub
接收到消息,并进行解码;- 服务消费方得到最终结果。
1.3 为什么用RPC,而不用HTTP
首先,这两个并不是一种概念,RPC是一种设计,用于解决不同服务之间的调用问题,RPC实现一般会包含传输协议和序列化协议两个。
而HTTP是一种传输协议,RPC可以使用HTTP作为传输协议,也可以直接使用TCP,不同的协议对应不同的场景
通常,使用TCP的RPC效率比使用HTTP更高
传输效率
- TCP,通常自定义上层协议,请求报文体积更小
- HTTP,请求中会包含很多无用的内容
性能消耗
- TCP,可以基于各种序列化框架进行,效率比较高
- HTTP,大部分通过json实现,字节大小和序列化耗时都更消耗性能
跨平台
- TCP:通常要求客户端和服务端为统一平台
- HTTP:可以在各种异构平台运行
总结
RPC 的 TCP 方式主要用于系统内部的服务调用,性能消耗低,传输效率高。而且封装了“服务发现”,“负载均衡”,“熔断降级”一类面向服务的高级特性
HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
将通俗点,就是RPC就像地区方言(有些方言可能就是普通话),只有内部知道,双方都需要知道方言,不然没法沟通;HTTP就是普通话,基本都能懂,也会说
2 如何设计一个RPC
RPC的设计一般都会包含五个模块:协议模块,序列化模块,网络模块,服务端模块和客户端模块。
协议模块一般是指:请求和响应参数的封装,服务的描述等
序列化模块:提供将对象通过某种方法把对象以字节序列的形式保存起来的API
网络传输模块:定义网络传输协议,提供服务调用功能
以下结合netty传输来设计
2.1
参考
(近)万字总结,RPC 项目相关问题及解答_技术交流_牛客网 (nowcoder.com)
(109条消息) java int转byte数组_Dan淡淡的心的博客-CSDN博客_int转byte数组
(25 封私信 / 1 条消息) 既然有 HTTP 请求,为什么还要用 RPC 调用? - 知乎 (zhihu.com)