什么是RPC
即 Remote procedure call 远程过程调用
为什么会有RPC
在单机条件下,我们要调用某个类的某个方法,只需要通过如下模式即可:
Person person = new Person();
person.run();
但是在多台服务器的情况下,每台服务器提供不同的服务,不可能像单机条件下那样进行调用,于是就诞生了RPC。
RPC调用流程
如服务器A需要调用服务器B的服务
- A通过网络传输的方式通知B
- B收到A的调用请求之后,调用A要调用的方法
- B将将调用之后的结果通过网络传输返回给A
RPC调用需要解决的几个问题
-
服务器A连接上服务器B,如何连接?
通过Socket IO,这其中又涉及到BIO、NIO等连接模式,以及Netty等网络框架 -
如何定位B服务器上的服务?
方案一:采用IP+端口号的方法
弊端:服务挂掉如何处理?手工处理此类问题比较麻烦
方案二:采用注册中心,如zookeeper -
消息(如Java中的对象)如何在网络上传输?
将对象变成二进制数据在网络中进行传输,需要进行对象的序列化和反序列化。
A端: 对象 ----> 二进制(序列化)
网络: 二进制传输
B端: 二进制 ---> 对象(反序列化)
- 如何序列化与反序列化?
基础方式:实现Serializable接口,并提供一个serialVersionUID
这是Java中默认的序列化机制,但是
- 不能跨语言操作
- 性能比较低
目前对此的解决方案有:
- json
- xml
- kryo
- protocol buf
- hessian
- messagepack
- thrift
几种序列化方式的比较如下
以上信息参考了咕泡学院的公开课相关资料并进行了一些修改。如有错误,欢迎指正。