RPC是什么?
RPC(Remote Procedure Call Protocal) 远程过程调用协议。协议!这是个协议哦。具体的实现依赖框架,有很多成熟的框架:gRPC、Thrift、Dubbo、SpringCloud等等。
调用流程
server对client隐藏具体函数实现。调用方只需要知道调用需要的方法就好,其他的实现都交给server完成。接下来会详细介绍每一个部分。
- client调用stub
- stub调用OS
- client OS send to server OS
- server OS receive 放入对应进程
- server 调用stub
- server封装result后wait
- server OS send to client OS
- client OS receive 放入对应进程
- client 调用stub
- client stub 解包结果
- client 获取结果
实现
上面的大致流程可以看出有几个部分需要框架来实现。
序列化
这部分是为了确定一个序列化成字节的方式,毕竟最终要在网络中传输,这部分会影响性能。
- Hessian
- Kryo
- MessagePack
- FST
- FastJson2
- Protobuf
- Avro
有许许多多的序列化方式可供选择,根据使用的语言、可读性、压缩需求等来决定
代理形式
- jdk 动态代理
- cglib 动态代理
- javassist 动态代理
- ASM 字节码
- javassist 字节码
动态代理相较于字节码来说更普遍且简单,字节码就需要开发者有一定理解,二者的性能也存在一定差距,不过除非想自己开发,不然不必太在意这些细节。
除了javassist以外,其他基本都依赖ASM,jdk一般性能稍差于其他。不过真用起来还得考虑方不方便才行。
传输方式
这里不仅仅是指的是网络协议的选择,而且也是包括是否阻塞IO,同步还是异步等等。
网络协议
这部分各个框架都不一样,一般都会支持很多种,例如gRPC是基于HTTP/2,Dubbo的话有自己的Dubbo协议。一般来说传输层的协议会性能更好,网络层的则开发难度较低,但是其实框架基本都屏蔽掉了,不用太在意。
IO模式
这部分和上一部分协议一半是绑定的,简单介绍一下有什么区别。
先说结论,适合的才是最好的!
阻塞?非阻塞?同步?异步?
这几个概念容易混淆,简单解释一下。
同步和异步的选择去结余接下来的处理是否在乎调用的结果和实时性。
阻塞非阻塞描述的是线程等待结果时的状态,影响的是并发度。
服务注册和发现
serve需要注册后才能被client调用到,client也必须连接注册中心才能知道server的存在和告知自己的存在。不过多阐述名词,详细可以自行动手查询。
一般有这几种可供选择Zookeeper、Eureka、etcd、Consul。
总结
RPC(远程过程调用协议)是一种用于分布式系统的协议,有多种成熟的框架如gRPC、Thrift、Dubbo和Spring Cloud。调用流程涉及序列化、代理形式和传输方式。序列化方式包括Hessian、Kryo、Protobuf等,影响语言和性能选择。代理形式可采用jdk动态代理、cglib、javassist、ASM等,影响性能和开发便利性。传输方式包括网络协议和IO模式,框架一般屏蔽这些细节。服务注册和发现是RPC的重要组成部分,常用工具有Zookeeper、Eureka等。总体而言,RPC通过隐藏实现细节、提供灵活的序列化和代理机制,以及结合服务注册和发现,实现了分布式系统中的高效远程调用。
这里大概描述一下开发流程:编写过程代码,然后框架会实现client和server的代码,其中包括了协议中需要的网络传输和序列化/反序列化。