1 实现一个RPC框架v1

1 实现一个RPC框架v1

1.0 什么是RPC

RPC即远程过程调用,如有两台主机AB,A想要调用在B上的某个服务,此时就可以通过RPC来做

RPC可以分为一下六个部分:

①服务端client以本地调用的方式调用远程服务
②client stub将调用方法及参数等形成RpcRequest并序列化
③client stub将数据发送至远程服务端
④server stub将消息反序列化为RpcRequest
⑤server stub根据RpcRequest调用本地方法并将结果组合装为RpcResponse
⑥server stub将RpcResponse序列化并发送至客户端
⑦client stub收到消息并反序列化为Java对象

1.1 思路

根据上述分析,应该有客户端、服务端两个模块,模块之间需要远程通信,还需要序列化模块

1.2 具体实现

1.2.1 客户端

①首先实例化一个代理类,代理类都要实现InvocationHandler接口,重写invoke方法

在invoke方法中,实例化了一个RpcRequest,实例化语句比较特别和简洁,之后实例化RpcClient,里面只有一个方法就是发送RPC请求,采用的是Java自带的Serializable,将客户端发送请求的返回值作为返回值返回

②实例化了一个代理对象,代理类实例化了hello接口,然后代理对象将这一坨数据丢给RpcClientProxy处理(就是调用),HelloService helloService就好像实例化了一个接口一样,当我们想调用这个接口的方法的时候直接调用就好了,这就是代理的神奇之处:

动态代理把调用过程封装起来,于是客户端可以像调用接口一样调用远程服务。

③实例化了一个hello对象,将其作为参数传入hello.hello方法

1.2.2 服务端

服务端本地存储着Hello方法
①实例化服务接口类
②实例化RpcServer类

   首先根据port实例化了一个ServerSocket。客户端实现的是Socket。当建立好连接之后,从字节输入流中取到RpcRequest对象。调用方法得到返回结果,将返回结果写入输出流,传给客户端

③调用rpcServer.register方法,将服务和端口号传进去,第一版还没有专门的注册中心,因此在这里register方法就是负责开启服务端socket进行监听同时处理客户端的请求。

1.3 总结

这一版本的RPC,注册服务和获取服务信息功能完成得不好,但是完成了最基本的调用服务。

posted @ 2023-02-18 16:34  Jane'scodehouse  阅读(21)  评论(0)    收藏  举报