这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天.
今天的课程为RPC原理课,老师首先以函数调用进行举例,函数调用是两个函数在本地以通信的方式进行内存共享,所以调用速度非常快,而在RPC中两函数进行调用是以远程通信的方式去读取规定的协议文件。RPC需要解决的问题是关于函数的映射,找到两个相互调用的具体函数,然后再将数据转化为字节流,最后达到网络传输的目的。
其概念模型如上图,两函数由单机中的内存共享转化为通信。
随后老师讲解了关于RPC的一次详细的运行流程,首先由IDL文件来描述客户端和服务器之间的协议标准,函数命名统一,随后将IDL转化为对应的静态库文件,将生成的静态库文件进行编码,该编码通过特定的协议进行传输,传输到接收方后再利用该协议进行解码,最后接收方能得到所需要的数据。
RPC优势,有利于分工合作和运维开发,可扩展性强与隔离性强,相当于将函数之间的调用进行抽取,由单个函数完成单个服务,实现更好的扩展性。
但在可扩展性强的同时也会带来许多问题,存在当通信时大量丢包中断如何解决等问题。
所以Thrift协议实现一种分层架构,将利用IDL文件实现自动生成对应代码并且封装了编码逻辑。下层直接对该逻辑进行解码通信。
解码则是将二进制文件进行解析,每个协议都会存在特定的编码格式,如Thrift以特定结构体形式进行读取,1代表当前标签,可转化为底层00 01的信息,以此将整个二进制编码进行读取,当客户端与服务器双方都遵循该编码格式进行读取,则会生成对应格式文件达到双方通信。
在协议层,有的协议会以特殊字符进行结束标记,如分号,逗号,换行等。有的协议则是定长加上不定长的方式进行读取,以此能读取到想要的数据的位置。
所以需要构造协议,然后通过构造后的协议写对应的读取方式,以此保证客户端与服务端能够严格按照协议要求进行制定规则。最后老师讲了关于RPC最后一层通信层,以传统的TCP/IP协议进行通信传输。至此协议有关的信息结束。
在后面课程中老师讲解了关于kitex的一些机制以及传输可能遇到的问题,从软件程序到硬件问题,并讨论了关于RPC的关键指标,如稳定性,熔断,限流,超时等问题。整堂课清楚了协议是什么,底层的读取方式,如何制定自定义的协议等,所以可以尝试将各种协议进行查看并修改,以此完善一种更为稳定与空间节约的自定义协议。