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. ARM cache 工作方式

    综述 现在的CPU的速度远远高于现代存储器的速度所以出现了cache.按和CPU距离分为L1级和L2级(SM)等.这里主要记录一下自己对cache的工作方式的学习理解. cache工作方式 cahe是 ...

  2. css3 & content & attr & data-*

    css3 & content & attr & data-* content: attr(data-value); https://github.com/oliviale/CS ...

  3. PM2 in depth

    PM2 in depth ecosystem.config.js module.exports = { apps : [{ name: "app", script: ". ...

  4. ffmpeg concat设置绝对路径

    https://superuser.com/questions/718027/ffmpeg-concat-doesnt-work-with-absolute-path/1551017#1551017 ...

  5. 百万SPC即将空投,3.0公链NGK有多“豪横”?

    在1月2日晚间,比特币强势突破3万美金,随后还在一路上涨,现在价格33431.64美金.仅用了不到一个月的时间,比特币就从2万美金涨到了3万美金,这充分展示了市场对于数字货币的强烈信心.没有了天花板的 ...

  6. 观点纠正,yarn和npm对比,今天yarn仍然比npm快吗

    yarn和npm的区别和对比,网上很多了,不多说了. 只纠正一个观点:yarn仍然比npm快吗?不. 2016年,yarn刚刚发布,速度确实比npm快,于是网络上出现了好多推荐yarn的文章. 于是很 ...

  7. HTTP状态响应码解析

    # HTTP响应状态码 ## 1xx:临时响应 #### 表示临时响应并需要请求者继续执行操作的状态代码. 100 **继续**请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等 ...

  8. Python算法_三种斐波那契数列算法

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列&qu ...

  9. fixed实现遮罩层,小程序

    css /** 分享微信,分享朋友圈 **/ .goods_share_mask { background-color: rgba(0, 0, 0, 0.3); position: fixed; to ...

  10. 开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(一)

    O2OA平台是一个企业办公类系统的低代码开发平台,更够方便的开发和部署协同办公.流程管理等应用,但它能做的远不止这些,今天这个案例就为大家介绍一下,O2OA可以做的更多. 最近对养鱼产生了浓厚的兴趣, ...