分享

UC头条:RPC实现原理(Java简单实现一个RPC)

 学而生之 2020-04-24

RPC简介

RPC(Remote Procedure Call)即为远程过程调用。RPC是一种通信协议,一个服务调用另一个服务就像调用本地服务一样,而不用关注网络通信的细节。这个两个应用可以在同一个机器,也可以在不同的机器上。RPC的实现有RMI、Hessian、Http 等。

RPC的执行过程如下所示:

执行过程

1、客户端发起远程调用,把请求发送给被调用方,客户端等待远程执行的结果。

2、服务方接受请求,执行完把结果返回给客户端,此时客户端收到结果继续执行余下逻辑。

RPC的底层调用过程:

RPC调用原理

调用步骤如下:

客户端调用客户端存根的方法

客户端存根组装请求发送给传输层,把数据通过网络发给服务方

服务器的传输层接收到数据,把请求转到服务器存根,服务器存根进行普通的方法调用,最后把结果通过传输层发送到客户端

客户端收到结果,通过客户端存根解析结果,最后把结果返回给调用者。

Java实现RPC技术和架构

上面简单说了RPC的核心原理,我们现在用Java实现一个简单的RPC调用。

实现技术:

采用Socket通信、Java动态代理、反射与Java序列化。

实现架构:

·1、服务端提供一个接口,并在服务端实现接口;在服务端启动一个Server Socket ,等待客户端连接和发送数据;收到客户的请求数据并解析,最后通过反射调用本地服务,把结果通过socket传输给客户端。

2、服务消费者依赖服务器接口,客户端通过动态代理,生产一个接口的代理类;客户端调用代理方法时会把请求数据通过Socket把请求发送给服务器并等待服务器返回结果。

3、注册中心,服务端注册到服务到注册中心,客户端从注册中心获取服务的连接信息。

Java实现RPC

1、服务端提供一个接口HelloService,有两方法,一个是无返回值,一个有返回值。

HelloService接口

2、服务端实现这个接口:

HelloService的实现类

3、核心包中定义两个公共接口Request和Resonse。

Request和Response

4,定义一个注册中心Registry,注册服务是提供一下信息:

服务端IP地址

服务器端口

Registry

5、服务端定义一个服务提供者Provider,在启动服务的前先把服务注册到注册中心,之后启动一个Server Socket。等待客户的数据,读取到数据后转换成请求对象Request对象,最后通过反射调用本地方法,最后通过Socket把结果写回客户端。

Provider

6、客户端定义一个Transport类,通过Socket和服务器传输数据,把数据通过Socket把请求发送给Server Socket并等待服务端返回结果。

Transport

7、定义一个Consumer,通过动态代理,为接口提供一个代理类,如果不熟悉可以看下Java的动态代理。在InvocationHandler的invoke中不是通过反射调用,而是通过socket调用服务端的方法。

Consumer

8,执行结果,在Consumer中调用了HelloService的两个方法,我们启动下程序看看执行结果。先启动服务端的Provider,在启动客户端的Consumer。

输出结果

本文就从实现原理上简单实现了RPC的调用,本程序只是一个演示,还有很多不足的地方,比如注册中心,序列化协议,负载均衡,传输协议等。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多