[RPC原理详解](https://blog.csdn.net/cbbbc/article/details/50675240)
[序列化的作用](https://blog.csdn.net/cbbbc/article/details/55214562)
*****
[Go RPC 开发指南](https://doc.rpcx.io/)
[用 rpc 实现远程过程调用](https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/15.9.md)
*****
RPC 是两个子系统之间进行的直接消息交互,它使用操作系统提供的套接字来作为消息的载体,以特定的消息格式来定义消息内容和边界。
RPC 的客户端通过文件描述符的读写 API (read & write) 来访问操作系统内核中的网络模块为当前套接字分配的发送 (send buffer) 和接收 (recv buffer) 缓存。
>户端进程写 RPC 指令消息到内核的发送缓存中,内核将发送缓存中的数据传送到物理硬件 NIC,也就是网络接口。NIC 负责将翻译出来的模拟信号通过网络硬件传递到服务器硬件的 NIC。服务器的 NIC, 再将模拟信号转成字节数据存放到内核为套接字分配的接收缓存中,最终服务器进程从接收缓存中读取数据即为源客户端进程传递过来的 RPC 指令消息。
>消息从用户进程流向物理硬件,又从物理硬件流向用户进程,中间还经过了一系列的路由网关节点。
**一次 RPC 过程如下图所示:**
![](https://img.kancloud.cn/65/f8/65f86f3e7e2ee8d8e53913533cd37871_811x432.png)
*****
**完整的 RPC 框架 **
在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化。
![](https://img.kancloud.cn/85/cc/85ccd491a28a66f3a1707ee7345ea3b2_1440x961.png)
**RPC 核心功能**
RPC 的核心功能是指实现一个 RPC 最重要的功能模块,就是上图中的”RPC 协议”部分:
![](https://img.kancloud.cn/96/58/965870d07dbc0448cb6cda021b0b1b4e_602x179.png)
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。
![](https://pic2.zhimg.com/80/v2-e1f83338420d6640a73a677eac81afb5_1440w.jpg)
下面分别介绍核心 RPC 框架的重要组成:
* **客户端(Client)** 服务调用方。
* **客户端存根(Client Stub)** :存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
* **服务端存根(Server Stub)** : 接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
* **服务端(Server):** 服务的真正提供者。
* **Network Service:** 底层传输,可以是 TCP 或 HTTP。
*****
## 深入理解 RPC 专题
阿里 **徐靖峰** 的原创文章,该系列文章由浅及深深入分析了 RPC 的核心原理。
* [简单了解RPC实现原理](http://cmsblogs.com/?p=3867)
* [深入理解RPC之序列化篇–Kryo](http://cmsblogs.com/?p=3869)
* [深入理解RPC之序列化篇](http://cmsblogs.com/?p=3871)
* [深入理解RPC之动态代理篇](http://cmsblogs.com/?p=3873)
* [深入理解RPC之传输篇](http://cmsblogs.com/?p=3875)
* [Motan中使用异步RPC接口](http://cmsblogs.com/?p=3877)
* [深入理解RPC之协议篇](http://cmsblogs.com/?p=3879)
* [深入理解RPC之服务注册与发现篇](http://cmsblogs.com/?p=3881)
* [深入理解RPC之集群篇](http://cmsblogs.com/?p=3883)
* [设计RPC接口时,你有考虑过这些吗?](http://cmsblogs.com/?p=3885)
- 前言
- 服务器开发设计
- Reactor模式
- 一种心跳,两种设计
- 聊聊 TCP 长连接和心跳那些事
- 学习TCP三次握手和四次挥手
- Linux基础
- Linux的inode的理解
- 异步IO模型介绍
- 20个最常用的GCC编译器参数
- epoll
- epoll精髓
- epoll原理详解及epoll反应堆模型
- epoll的坑
- epoll的本质
- socket的SO_REUSEADDR参数全面分析
- 服务器网络
- Protobuf
- Protobuf2 语法指南
- 一种自动反射消息类型的 Protobuf 网络传输方案
- 微服务
- RPC框架
- 什么是RPC
- 如何科学的解释RPC
- RPC 消息协议
- 实现一个极简版的RPC
- 一个基于protobuf的极简RPC
- 如何基于protobuf实现一个极简版的RPC
- 开源RPC框架
- thrift
- grpc
- brpc
- Dubbo
- 服务注册,发现,治理
- Redis
- Redis发布订阅
- Redis分布式锁
- 一致性哈希算法
- Redis常见问题
- Redis数据类型
- 缓存一致性
- LevelDB
- 高可用
- keepalived基本理解
- keepalived操做
- LVS 学习
- 性能优化
- Linux服务器程序性能优化方法
- SRS性能(CPU)、内存优化工具用法
- centos6的性能分析工具集合
- CentOS系统性能工具 sar 示例!
- Linux性能监控工具集sysstat
- gdb相关
- Linux 下如何产生core文件(core dump设置)