如上图,OrderService(订单业务)和PaymentService(支付业务)是微服务中的两个业务模块,一个订单业务需要调用支付业务中的支付功能(方法),那么在微服务RPC中,他们是如何完成通信的呢?
1. 我们的编译工具通常会把PaymentService业务模块中它所能提供的函数编译生成一个stup桩文件,相当于一个静态函数库,这个函数库就会被OrderService的Client端引入,这样OrderService业务模块就实现了对PaymentService业务模块中函数的映射,相当于在OrderService业务模块本地就有了这么一个静态函数库,方便我们的OrderService后续的调用。
2. 我们知道,在网络底层所有的数据都是二进制数据,所以有一步就是我们需要把请求体序列化成一个二进制的数据,就是图中的第一步;
3. 然后经过第二步要约定好数据头,元数据,消息体等,保证请求与相应一一映射,对应图中的第二步;然后我们根据一些成熟的网络库去进行TCP或UDP的传输,在不同的公司也会有自定义的RPC协议。
4. 第四步第五步和第六步点高档于是反过来的一个过程,接收到消息之后。再根据协议把头数据,消息体等得到,再反序列化把二进制数据转化成语言可以识别的结构体。
5. 第七步第八步第九步再反过来,将查询到的结果数据或完成的动作序列化成二进制数据,规范头数据,数据体。
6. 之后,再通过网络传输给调用方,对应第十步。
7. 然后又是同样的操作,取出消息头消息体,再反序列化成语言可以识别的数据,将数据返回;对应图中的第11,12,13步。
当我们在面试过程中遇到时,可以遵循下面这幅图来回答,挑出重点来回答。