什么是 RPC 框架?

Python07

什么是 RPC 框架?,第1张

RPC(Remote Procedure Call,即远程过程调用)是建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用)。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法。

由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。对于RPC架构来说,应用越底层,代码越复杂、灵活性越高、效率越高;应用越上层,抽象封装的越好、代码越简单、效率越差。

RPC 框架注意事项

RPC 的调用通常为了方便使用,会被伪装成普通方法调用的形式。但实际二者之间存在巨大的差异,进程内的方法调用的时间量级是 ns(纳秒),而进程间的 RPC 方法调用时间量级通常是 ms(毫秒),它们之间差着 10 的六次方。

因此,微服务架构下,内部主服务链之间的 RPC 调用需要异步化,服务之间的调用请求和等待结果相互之间解耦。

简单的介绍RPC是什么,RPC整个调用流程是什么,包含了什么组件。然后实际编写一个RPC实例,模拟100个线程调用以验证RPC的可用性,稳定性等。最后总结自己编写的RPC框架存在哪些问题,可以去完善的,一个优秀的RPC框架应该必备的功能点。

RPC(Remote Procedure Call),远程过程调用,可通过网络调用其他机器的服务请求。RPC是一种规范,和TCP、UDP都没有关系,RCP可以采用TCP协议完成数据传输,甚至可以使用HTTP应用协议。RCP是C端模式,包含了服务端(服务提供方)、客户端(服务使用方),采用特定的网络传输协议,把数据按照特定的协议包装后进行传输操作等操作。先来了解下一个具体的RPC调用请求的执行过程

本图来自网络

这就是一个完整的RPC调用过程,对使用方而言就 只暴露了本地代理对象 ,剩下的数据解析、运输等都被包装了,从服务提供方的角度看还有 服务暴露 ,如下图DUBBO的架构图。

学习写RPC之前必须先了解 动态代理 反射 这两个知识点,如不了解先自行了解,本学习笔记不涉及到此内容的介绍。

文件夹目录

可以很清楚的看到convert方法就是从一个输入流中读取出类名称、方法名等数据,组成一个MethodParameter对象,也就是上面所说的Request

服务暴露存储了一个 Map<String, Object>objectMap 对象,所有可对外提供服务的都必须添加到该容器中,以便于收到网络数据后能找到对应的服务,然后采用反射invoke调用,返回得到的结果。

简单的BIO模型,开启了一个ServerSocket后,接收到数据后就把套接字丢给一个新的线程处理,ServerSocketRunnable接受一个socket后,解析出MethodParameter这个请求对象,然后调用服务暴露的invoke方法,再写回到socket传输给客户端

服务使用方需要使用register进行服务的注册,会生成对应的本地代理对象,后续只需要通过本地代理对象。

代理对象被调用后生成一个MethodParameter对象,通过此IOClient把数据传输到服务端,并且返回对应的数据。

服务端

客户端

测试服务

运行效果

这只是一个非常简单的RPC实践,包含了服务暴露、服务注册(Proxy生成)、BIO模型进行网络传输,java默认的序列化方法, 对RPC有一个初步的认识和了解,知道RPC必须包含的模块

不过还是有很多需要优化的点以改进。

还有例如服务统计、优雅下线、负载均衡等也都是一个成熟的RPC框架必须要考虑到的点。

本人微信公众号(搜索jwfy)欢迎关注