RPC是什么?10分钟掌握。

定义:

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架构中的组成成份。




问题2:为什么要使用自定义 tcp 协议的 rpc 做后端进程通信

回答2:通用定义的http1.1协议的tcp报文包含太多废信息 (http2 协议 已经优化了tcp报文数据,GRpc 使用的是HTTP2协议)

优秀的RPC 自定义报文的tcp协议.

优秀的RPC框架相对简单的http容器,更多的是封装了“服务发现”,"负载均衡",“熔断降级”一类面向服务的高级特性。更好的为了是面向服务的更高级的封装。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容