这是我参与「第五届青训营 」伴学笔记创作活动的第 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
}
我们来看这段代码,显然它在内存中进行了以下操作:
- 将 a 和 b 的值压栈
- 通过函数指针找到 calculate 函数,进入函数取出栈中的值 2 和 3,将其赋予 x 和 y
- 计算 x * y,并将结果存在 z
- 将 z 的值压栈,然后从 calculate 返回
- 从栈中取出 z 返回值,并赋值给 result
远程函数调用(RPC)
需要解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
RPC实际流程
理论过程
我们来看这样一个远程函数调用的流程,实际上远程调用由调用端将数据压缩打包交给RPC-RunTime传输给远程端RPC-RunTime,然后交给远程端解压并传参调用,再将结果同理返回给调用端,而这个传输实际上走的是成熟的网络传输TCP/UDP(这俩都有可能)。
优点
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
缺点
- 服务宕机,对方应该如何处理?
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
RPC框架解决了RPC带来的问题,使得RPC的好处放大
那么既然使用了框架,自然就有约束,包括以下:
- 语言特定格式 序列化,许多编程语言都提供了序列化方式,比如Java的java.io.Serializable(SpringBoot提供了注解)
- 文本格式 JSON、XML、CSV等文本格式,具有人类可读性
- 二进制编码 具有跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol、Protobuf 等
今天的笔记就到此,最近诸事繁多,希望以后自己看到此文时能够深入研究