RPC框架分层设计 | 青训营笔记

69 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

本地调用

案例代码

func main() {
    var a = 2
    var b = 3
    result := calculate(a,b)
    fmt.Printlin(result)
    return
}

func calculate(x,y int) {
    z := x * y
    return z
}

我们来看这段代码,显然它在内存中进行了以下操作:

  1. 将 a 和 b 的值压栈
  2. 通过函数指针找到 calculate 函数,进入函数取出栈中的值 2 和 3,将其赋予 x 和 y
  3. 计算 x * y,并将结果存在 z
  4. 将 z 的值压栈,然后从 calculate 返回
  5. 从栈中取出 z 返回值,并赋值给 result

远程函数调用(RPC)

需要解决的问题:

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

RPC实际流程

image.png

理论过程

我们来看这样一个远程函数调用的流程,实际上远程调用由调用端将数据压缩打包交给RPC-RunTime传输给远程端RPC-RunTime,然后交给远程端解压并传参调用,再将结果同理返回给调用端,而这个传输实际上走的是成熟的网络传输TCP/UDP(这俩都有可能)。

优点

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

缺点

  1. 服务宕机,对方应该如何处理?
  2. 在调用过程中发生网络异常,如何保证消息的可达性?
  3. 请求量突增导致服务无法及时处理,有哪些应对措施?

RPC框架

RPC框架解决了RPC带来的问题,使得RPC的好处放大

那么既然使用了框架,自然就有约束,包括以下:

  1. 语言特定格式 序列化,许多编程语言都提供了序列化方式,比如Java的java.io.Serializable(SpringBoot提供了注解)
  2. 文本格式 JSON、XML、CSV等文本格式,具有人类可读性
  3. 二进制编码 具有跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol、Protobuf 等

今天的笔记就到此,最近诸事繁多,希望以后自己看到此文时能够深入研究