定义:
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。(RPC : 是一种技术思想。或者说是一种架构。)
历史:
RPC:1997年2月19日,Sun公司发布了JDK 1.1,Java技术的一些最基础的支撑点(如JDBC等)都是在JDK 1.1版本中发布的,JDK 1.1版的技术代表有:JAR文件格式、JDBC、JavaBeans、RMI。Java语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。 (RMI 就是 RPC的一种实现)
HTTP :1997年1月,HTTP/1.1 版本发布,场景是用于web架构,而不是分布式系统间通信。
从时间上看的出都已经存在了很久并不是什么新技术,近年来RPC被重视,只是硬件升级 处理器 内存的升级。及互联网大爆发导致现在微服务的流行,RPC及解决内部跨服务调用。而现在一个优秀的RPC要解决的早已不是当年简单的要求。更多的是在微服务的环境下。服务发现治理,熔断,限流,重试,负载 ,低响应,高可能等一系列问题。
RPC核心功能组成:
一个 RPC 的核心功能主要有 5 个部分组成
1)client code:客户端代码调用的实现,负责发起RPC调用,为调用方提供提供API;
2)序列号与反序列化:一般RPC网络传输的内容有文本和二进制两大类。文本:xml和json。二进制:java原生的序列化与反序列化,以及Hession、protobuf、Thrift、Avro、Kryo、MessagePack;
3)stub Proxy:存根,可以看做一种代理对象,屏蔽了RPC调用的复杂网络处理,使得RPC调用透明化。
4)Transport:作为RPC底层的通讯模块,一般使用Socket使得客户端与服务端之间传递请求与应答。
5)service code:服务端服务业务逻辑具体的实现
总结:主要包括了:接口规范+序列化反序列化规范+通信协议等。
--最为关键影响RPC性能框架的两个因素:序列化和通讯模块。--
RPC调用过程
调用方调用的是接口,要使用动态代理。
动态代理接收到调用后,应该想办法调用远程的实际实现。
识别具体要调用的远程方法的IP、端口
将调用方法的入参进行序列化
通过通信将请求发送到远程的方法中
远程的服务就接收到了调用方的请求。
反序列化各个调用参数
定位到实际要调用的方法,然后输入参数,执行方法
按照调用的路径返回调用的结果
常见的RPC架构:
java RMI Motan Apache Trift Grpc Dubbo
对RPC理解有误的相关问题:
问题1:既然有 HTTP 请求,为什么不直接用http。而去使用RPC。
回答1:HTTP和RPC不是对等的概念。HTTP只是一个通信协议,是RPC架构中可选择的一种通信协议,是PRC架构中的组成成份。