1. 什么是RPC

RPC:(Romote Procedure Call)远程过程调用;
RPC框架的作用:使得调用远程方法就像调用本地方法一样

远程调用的目的:数据交换

2. 开源 RPC 框架

跟语言平台绑定的开源 RPC 框架主要有下面几种。

  • Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
  • Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。
  • Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
  • Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言

而跨语言平台的开源 RPC 框架主要有以下几种。

  • gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
  • Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为
    Apache 开源项目之一,支持多种语言。
  • hprose:一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言:nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP,
    Python, Ruby, Perl, Golang 。
3. 服务之间的通信

若没有以上所说的RPC框架,我们服务与服务之间是怎么通信的呢?
假设我们是两个java应用,java中是使用Socket/ServerSocket进行通信的,套接字可以在java层面构建一个监听,这个监听可以是基于TCP也可以基于UDP的。
早在我们的tomcat6及之前也是基于socket,NIO的一个实现。

OpenHarmony RPC 跨设备连接_java

如图所示:假设App1想要调用App2的sayHello方法,怎么调?
我们不可能直接new HelloClass,因为HelloClass这个类不在App1这个虚拟机里面,所以…

使用过Dubbo的同学就知道,我们在远程调用的时候只需要加一个@Reference注解就好了,

@Reference
private HelloClass helloClass;

那么这个helloClass肯定是一个代理类,为什么要加一个代理类,因为它要代理我们的请求,所以我们肯定使用了动态代理技术,这个请求是我们远程通信的请求,通过这个代理类代理到我们的sayHello,然后它需要进行一个数据的传递。

需要传递哪些数据?
这些是必须的(协议 + ip + 端口 + uri),除此之外:
1.调用哪个类
2.调用哪个方法
3.传递的参数
4.参数的类型

App2得到了这些数据之后就可以通过反射去初始化,进行调用。

那么数据怎么进行网络传输? 在java中可以进行序列化。

调用完之后将结果返回给App1,至此就完成了远程通信了。

4. RPC通信的技术点

序列化:xml/json/java原生序列化/protobuf/avro/kryo/protostuff/hessian2(改造过的序列化)

区别:性能(序列化的性能)、序列化后的报文大小、是否跨平台、跨语言 | 开源 、社区活跃度、技术支持

通信(BIO/NIO):高性能通信框架:Netty4(mina)(Java NIO(new IO))

动态代理:java里面的Proxy接口/javasisst(Dubbo)

反射:java反射

5. RPC通信步骤
  1. 组装数据报文
    调用的接口、调用的方法、方法的参数、参数的类型
  2. 建立网络通信
    通过socket来通信。
  3. 发起远程传输
    输出、输入数据