当发起远程调用的时候,涉及五个部分:
1、user(调用方) 2、user-stub(调用方本地存根) 3、RPCRuntime(RPC通信者) 4、server-stub(服务方本地存根) 5、server(服务方)
调用者的机器上:调用方,调用方本地存根,RPC通信包 服务者的机器上:服务方,服务方本地存根,RPC通信包
本地存根:
为什么要有本地存根?
RPC具有地址空间被隔离的问题,在远程调用的过程中,consumer端的地址空间中任何一个内存地址在Provider端都是没有意义的。除了内存地址无法匹配,在不同的机器上还可能出现位宽不同、编译环境导致的结构体内存布局不同、字符串编码不同等情况,这些情况都会导致在远程调用过程中consumer端的函数调用无法像本地调用一样正确匹配到真实的函数实现,从而导致函数调用失败。所以在远程调用的过程中,consumer端发起的函数调用让provider端精确地知道自己应该执行哪个函数就是必须要解决的问题,而Stub的存在就是为了让远程调用像本地调用一样直接进行函数调用,无需关心地址空间隔离、函数不匹配等问题。 Stub的职责就是进行类型和参数转化。如果把c和p端比作两个不同语种的人,那么stub就类似翻译员,虽然c和p端语言不同,但是经过stub处理后,两端还是能够正常地传达信息并进行沟通。
本地存根做了什么?
服务调用方的本地存根会接受consumer的函数调用,本地存根会解析函数调用的函数名、参数等信息,整理并且组装这些数据,然后将这些数据按照定义好的协议进行序列化,打包成可传输的消息,交给RPCRuntime。还会处理服务提供方返回的结果。它会将RPCRuntime返回的数据包序列化成服务调用方所需要的数据结果并传递给服务调用方。 Stub隐藏了远程调用的实现细节,就像是远程服务的一个代理对象,可以让服务消费方感觉调用远程服务方法就像调用本地方法一样。服务提供方的本地存根与服务提供方都属于Provider端,它们存在于同一台机器上。当Provider端的RPCRuntime收到请求后,交由服务提供方的本地存根进行参数等数据的转化。服务提供方的本地存根会重新转换客户端传递的数据,以便在Provider端的机器上找到对应的函数,传递正确的参数数据,最终正确地执行真实函数的调用。调用完,返回结果给服务提供方的本地存根,由本地存根再将结果数据序列化、打包,最后交给RPCRuntim。服务提供方与调用方的本地存根都充当了翻译员的角色。
问题:
java系统调c代码系统,这个c的本地存根都怎么搞呢?