• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

牛逼哄哄的 RPC 框架,底层到底什么原理?

互联网 diligentman 6天前 9次浏览

作者:_Yasin
blog.csdn.net/u013592964/article/details/80441205

1. RPC框架的概念

RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。

使用RPC可以解耦系统,方便维护,同时增加系统处理请求的能力。

牛逼哄哄的 RPC 框架,底层到底什么原理?

上面是一个简单的软件系统结构,我们拆分出来用户系统和订单系统做为服务存在,让不同的站点去调用。

只需要引入各个服务的接口包,在代码中调用RPC服务就跟调用本地方法一样,我刚接触到这种调用方式的时候颇为惊奇,我明明调用的就是java语言方法啊(已java为例,现在RPC框架一般都支持多语言),怎么就调用了远程的服务了呢??

2. RPC框架的原理解析

最近自己写了一个简单的RPC框架KRPC,本文原理分析结合中代码,均为该框架源码,RPC与RMI的区别看这篇文章《Java RMI 和 RPC 的区别》。

2.1 流程纵览

牛逼哄哄的 RPC 框架,底层到底什么原理?

如上图所示,我将一个RPC调用流程概括为上图中5个流程,左边3个为客户端流程,右边两个为服务端流程。

下面就各流程进行解析

2.2 客户端调用

服务调用方在调用服务时,一般进行相关初始化,通过配置文件/配置中心 获取服务端地址用户调用。

// 用户服务接口public interface UserService { public User genericUser(Integer id,String name,Long phone);}//调用方//服务初始化KRPC.init("D:\krpc\service\demo\conf\client.

一开始接触RPC调用方法肯定就有疑惑,它不是一个接口吗,直接调用应该没啥效果啊,我也没有引入实现包。

带着这个疑惑,我们就进入下一个知识点,动态代理。

牛逼哄哄的 RPC 框架,底层到底什么原理?

2.3 动态代理

动态代理这东西意如其名,它代理你帮你做事情,动态代理看这篇文章《详解 Java 中的三种代理模式》。

上面我们不说道直接调用一个接口中的方法,并且没有用该接口的实现类调用,那么方法是怎么生效的呢?

可以看到这个用户服务这个service是由ProxyFactory代理工程创造的,在该ProxyFactory#create()方法中就跟一个代理处理器绑定在一起了。

@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    //构造请求request    Request request = new Request();    ....    return RequestHandler.request(serviceName, request,returnClass);}

这个类实现了InvocationHandler接口(JDK提供的动态代理技术),每次去调用接口方法,最终都交由该handler进行处理。

这个环节一般会获取方法的一些信息,例如方法名,方法参数类型,方法参数值,返回对象类型。

同时这个环节会提供序列化功能,一般的RPC网络传输使用TCP(哪怕使用HTTP)传输,这里也要将这些参数进行封装成我们定义的数据接口进行传输。

2.4 网络传输

我们通过将方法参数进行处理后,就要使用发起网络请求,使用tcp传输的就利用socket通信进行传输,这一块我开源项目中使用的同步堵塞的方案进行请求,也可以使用一些非堵塞方案进行请求,效率会更高一些。

2.5 服务端数据接受

这一.........


喜欢 (0)