RPC
# RPC
# 1 何为RPC
RPC(Remote Procedure Call) 即远程过程调用,通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。
目的:两个不同的服务器上的服务提供的方法不在一个内存空间,所以,需要通过网络编程才能传递方法调用所需要的参数。并且,方法调用的结果也需要通过网络编程来接收。但是,如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为,我们需要考虑底层传输方式(TCP 还是 UDP)、序列化方式等等方面。
作用: 简单来说,通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。并且!我们不需要了解底层网络编程的具体细节。
举个例子:两个不同的服务 A、B 部署在两台不同的机器上,服务 A 如果想要调用服务 B 中的某个方法的话就可以通过 RPC 来做。
一言蔽之:RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。
成熟的RPC框架可以提供“服务自动注册与发现”、“只能负载均衡”、”可视化的服务治理和运维“、”运行期流量调度“等待功能。
# 2 RPC的原理是什么
RPC的核心功能看作 5 部分:
- 客户端(服务消费端) :调用远程方法的一端。
- 客户端 Stub(桩) : 这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
- 网络传输 : 网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
- 服务端 Stub(桩) :这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去指定对应的方法然后返回结果给客户端的类。
- 服务端(服务提供端) :提供远程方法的一端。
时序图:
# 3 基本RPC框架思路
![image-20220321113502660](https://raw.githubusercontent.com/zouquchen/Images/main/imgs/RPC framework.png)
- 注册中心:负责服务地址的注册与查找,相当于目录服务。服务端启动的时候将服务名称及其对应的地址(ip+port)注册到注册中心,服务消费端根据服务名称找到对应的服务地址。有了服务地址之后,服务消费端就可以通过网络请求服务端了。(推荐Zookeeper)
- 网络传输:既然调用远程的方法就要发请求,请求中至少要包含调用的类名、方法名以及相关参数。(推荐Netty)
- 序列化:既然涉及到网络传输就一定涉及到序列化,不可能用JDK自带的序列化,JDK自带的序列化效率低并且有安全漏洞。所以血药考虑使用哪种序列化协议。(常用的有hession2、kyro、protostuff)
- 动态代理:RPC的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节,比如网络传输。也就时说当你调用远程方法的时候,实际会通过代理对象来传输网络请求。
- 负载均衡:将服务部署在多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。负载均衡可以避免单个服务器响应同一请求,造成服务器宕机、崩溃等问题。
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52