RPC 框架设计

初识 RPC

服务化有什么好处?

  • 防止代码拷贝
  • 防止底层复杂性的扩散
  • 防止公共库的耦合
  • 保证 SQL 的质量,能够解除数据库的耦合

什么是 RPC

RPC:Remote Procedure Call Protocol,远程过程调用协议,像调用本地函数一样,去调用一个远端服务。

相比“同一个进程”的“本地”函数调用,有没有办法,调用一个“跨进程”的“远程”函数呢?

Socket 通讯,只能传递连续的字节流,如何将 “入参/函数” 放到连续的字节流里呢?需要设计“应用层报文(协议)”

“跨进程”“远程”调用的过程

RPC 框架的架构职责

上述跨进程调用远端的服务,存在的问题是没有将通用操作抽离出来。

RPC框架职责:

  1. 让调用端,像调用本地函数一样,便捷的调用远程的服务
  2. 让服务端,像提供本地函数一样,便捷的提供远程的服务

向调用方屏蔽各种复杂性,向服务方也屏蔽各种复杂性,让调用方感觉上就是在调用本地函数一样,来调用一个远端的服务;让服务方就像实现一个本地函数一样,便捷地提供远端服务。

序列化与反序列化

为什么需要序列化?

需要将对象等数据进行二进制转储。

所谓序列化,是将“对象”形态的数据转化为“连续空间二进制字节流”形态数据的过程。

如何进行序列化?

如何将一个 class User 的内存实体 u1 转化为二进制字节流?

  • 方案一:自描述

    自描述的标记性语言 (XML/JSON),来进行转换。规定好转换规则。

  • 方案二:序列化协议

    序号 | key 长度 | key 值 | value 长度 | value 值

序列化协议设计,要考虑什么因素?

  1. 解析效率
  2. 压缩率,传输有效性
  3. 扩展性,兼容性
  4. 可读性,可调试性
  5. 跨语言
  6. 通用性

常见的序列化方法(协议)

  1. xml/json
  2. protobuf
  3. Avro
  4. CORBA
  5. mc_pack

字节流发送 + 字节流接收

同步 RPC 系统架构,核心流程

RPC-server:IO线程,中间是一个队列,工作线程处理结果,返回。

连接池组件

异步 RPC 系统架构,核心流程

调用方调用,生成上下文,编程报文,放入队列;调用结束

异步架构,上下文管理器

  1. 为什么需要上下文管理器?
  2. 如何将请求-响应-回调等信息匹配起来?

一条连接,异步请求、响应报文如何匹配? 可以通过“请求ID”关联!!!

通过“请求ID”关联 请求-响应-回调

异步架构,超时管理器

RPC-Server

监听一个端口,收发线程收发数据库包,中间一个包队列,工作线程来处理,整个 RPC-Server 就是一个比较简单的生产者-消费者。

总结

  1. 什么是 RPC?

    像调用本地函数一样,去调用一个远端服务

  2. 为什么需要 RPC 框架?

    用来屏蔽 rpc 调用过程中,跟业务代码无关的底层技术细节

  3. 什么是序列化?为什么需要序列化?

    将对象转换为二进制流的过程

  4. 同步 RPC-Client 的核心组件是什么?

    序列化/反序列化、连接池

  5. 异步 RPC-Client 的核心组件是什么?

    收发队列(用于解耦)、工作线程、上下文管理器

RPC 框架设计的更多相关文章

  1. 房产基于Swoole的PHP RPC框架设计

    房产基于Swoole的PHP RPC框架设计 https://mp.weixin.qq.com/s/XSrKEQ-0q4DvjOGTIwYYzg

  2. Netty自娱自乐之类Dubbo RPC 框架设计构想 【上篇】

    之前在前一篇的<Netty自娱自乐之协议栈设计>,菜鸟我已经自娱自乐了设计协议栈,gitHub地址为https://github.com/vOoT/ncustomer-protocal.先 ...

  3. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  4. 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...

  5. rpc框架之HA/负载均衡构架设计

    thrift.avro.grpc之类的rpc框架默认都没有提供负载均衡的实现,生产环境中如果server只有一台,显然不靠谱,于是有了下面的设计,这其实是前一阵跟北京一个朋友在qq群里交流的结果,分享 ...

  6. 基于 SOA 概念 RPC 框架 的 消息中心 云部署 设计 漫谈

    一.背景 假设有一个系统的最大并发量有2000TPS左右.同时该系统有闲时和忙时,希望可以随时进行拓展和削减服务能力,以节省服务器费用开销. 该系统能提供站内消息.短信.app消息.邮箱的一个消息系统 ...

  7. 设计一个分布式RPC框架

    0 前言 提前先祝大家春节快乐!好了,先简单聊聊. 我从事的是大数据开发相关的工作,主要负责的是大数据计算这块的内容.最近Hive集群跑任务总是会出现Thrift连接HS2相关问题,研究了解了下内部原 ...

  8. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    在过去持续分享的几十期阿里Java面试题中,几乎每次都会问到Dubbo相关问题,比如:“如何从0到1设计一个Dubbo的RPC框架”,这个问题主要考察以下几个方面: 你对RPC框架的底层原理掌握程度. ...

  9. 8.如何自己设计一个类似 Dubbo 的 RPC 框架?

    作者:中华石杉 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个: 你有没有对某个 rpc 框架 ...

随机推荐

  1. R语言学习2:绘图

    本系列是一个新的系列,在此系列中,我将和大家共同学习R语言.由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成. 参考教材:<R语言实战>第二版(Robert I.Kaba ...

  2. Android vs iOS vs Web

    Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...

  3. holy shit CSDN

    holy shit CSDN 垃圾 CSDN 到处都是垃圾文章, 无人子弟 到处都是垃圾广告,看的恶心 毫无底线,窃取别人的知识成果,毫无版权意识 垃圾爬虫,垃圾小号 ...等等 Google Sea ...

  4. ES6 & Classes & Interface

    ES6 & Classes & Interface what's the difference between javascript Classes & Interface ? ...

  5. news of javascript

    news of javascript https://javascriptweekly.com/ https://javascriptweekly.com/issues https://www.inf ...

  6. Google can't be accessed again, today is shit day

    Google can't be accessed again, today is shit day 2019.11.28 12:00~20:56 holy shit (pile of poop) Go ...

  7. js 增加数组的嵌套层数

    class A {} const proxy = new Proxy(new A(), { get(o, k) { if (!/\d+/.test(k.toString())) return o[k] ...

  8. 「NGK每日快讯」11.18日NGK公链第15期官方快讯

  9. ROS 安装完成后运行小乌龟示例程序

    安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令: $ roscore 新开一个terminal,运行以下命令,打开小乌龟窗口: $ ...

  10. C++算法代码——笨小猴

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1163 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了 ...