RPC简介
Posted Java关发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC简介相关的知识,希望对你有一定的参考价值。
持之以恒,贵在坚持,每天进步一点点!
前文提示
阅读本文,需要你忘记之前知道的一切关于rpc的知识。需要具备socket编程知识。
一. 进程通信
抛开RPC,先看看进程间通信的几种方式。
1.管道
管道通信在日常开发经常使用,比如查日志时候使用的 cat app.log |grep “userId”中的|就是一种管道。管道通信本质就是在内核空间创建一段缓冲,一端写数据一端读取数据。所以两个进程要通过管道方式通信,就必须持有同一个管道,我们知道通过fork
创建的子进程会拷贝父进行的资源,由此父子进程就持有了同一个管道从而进行通信。
2.消息队列
管道方式使用范围有限,只能父子进程通信。消息队列是在内核中注册两个进行对应的队列,并且一个队列只能进行单工通信,如果要进行双工,需要创建了两个队列。
3.共享内存
4.信号
当某个进程陷入死循环,比如写了一段Java代码并运行。
while(true){
}
此时Java进程就处于死循环的异常状态。此时可以用信号给进程发送指令让其退出。比如发送kill -9 pid可以给进程发送异步的SIGINT指令,让其退出。
5.socket
上面的通信方式都只适用于进程运行在同一台电脑,当进程运行在不同电脑上,需要用socket进行通信。比如你使用你的电脑的QQ进程给我的电脑的QQ进程发送消息,就需要使用到socket通信。
二. RPC过程
看了上面五种进程通信方式,其实RPC就是socket的进行通信方式。而socket通信传输的数据是二进制数据。对应到RPC通信中传输的是什么呢?那就是对象。我们称二进制到对象为反序列化,对象到二进制称为序列化。再看RPC调用,我们应该如何发起调用呢?我熟悉Java,那么能否发起调用跟一个方法一样呢?我想没有比这再要简单的方式了。比如在使用时,我定义一个接口,生成代理类,通过代理类调用方法,在通过socket通信填入要传输的对象。从而发起了rpc的调用。我想在Java里没有比这更优雅的方式了!
此图为单向通信的过程图。
文章末尾
常用的序列化方式有:
JDK原生序列化
protobuf
fastjson
fst
gson
常用的通信方式有:
JDK原生BIO、NIO、AIO通信方式
netty框架
mina框架
在序列化和通信中有如此多的实现,那么我们如何选择?没错,需要通过真实数据的测试才能做出最佳选择。为了便于测试,我们在代码编写时需要做以下事情:
定义好序列化以及通信的抽象(定义抽象接口)
如何选择某个接口使用哪个实现(JVM启动前定义好接口实现)
如何动态选择某个接口使用哪个实现(JVM启动后选择接口实现)
欲知后事如何,请见下文分享。
以上是关于RPC简介的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段
#yyds干货盘点# Python网络爬虫之js逆向之远程调用(rpc)免去抠代码补环境简介