一、什么是RPC

RPC的全称是Remote Process Call,即远程过程调用,它应用广泛,实现方式也很多,拥有RMI、WebService、Hessian等诸多成熟的方案,在业界得到了广泛的使用。

RPC将原本的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了极大的提升,也是实现分布式计算的基础。

RPC的实现包括客户端和服务端,即服务的调用方和服务的提供方。服务调用方发送RPC请求到服务器提供方,服务提供方根据调用方提供的参数执行请求方法,将执行结果返回给调用方,一次RPC调用完成。

二、为什么需要rpc

基于未来微服务发展的趋势,以及分布式应用框架的考虑,微服务之间存在大量的业务交流和数据交换,如果需要采用http、tcp、io等方式来进行,接口业务之间的交换 无疑是非常麻烦且冗余的,这个时候rpc框架就应运而生,可以向微服务提供就像调用基础方法一样调用远程方法,大幅度的减轻了微服务之间业务交互的压力及开发压力

三、RPC需要考虑哪些问题?

1、 客户端远程调用

可以通过代理模式实现在客户端创建一个远端服务器上真正对象的代理对象;调用方法的时候,代理对象去找真正的对象来提供服务。代理模式又毫无疑问选用的是动态代理,可以在运行时创建代理。动态代理常用的方式有两种,JDK动态代理和CGLIB动态代理

2、 服务端方法调用

目前常用的稳定机制有 javassist、methodHandle、reflection,三者相比较而言javassist的性能最为卓越,基本可以与直接调用的性能相媲美

3、 序列化及反序列化

序列化与反序列化的成熟方案有很多,主要分为二进制和文本传输两种

a、文本传输类似于常见的json、xml等格式,像jackson、fastjson等,但是相较于2进制传输方式而言,性能相比之下较为低下

b、二进制传输方案有hessian、proto buffers、kryo、fst等,其中hessian性能相比较弱,但是比起java内置序列化方案来说是较为快速的

4、 网络传输

Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服

务器和客户端。封装了JDK的NIO,简化了nio复杂的代码开发流程

5、 服务注册

解决分布式架构中,一个服务势必会有多个实例,如何获取实例的问题。

可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。

6、 缓存

Redis缓存,可以将服务与实例,实例与方法的映射关系存入到redis缓存中,加快相关函数及方法的调用,但是要注意redis中与服务注册中心中的数据同步的问题,其次甚至可以使用redis来进行数据的缓存

7、 异步调用

如果面临服务端处理数据缓慢,耗时长久的场景时,可以使用异步调用AIO

AIO作为异步非阻塞io模型,AIO发起ip操作之后,通知服务器去完成函数操作,这个时间客户端可以去做其他的事情。等到服务器完成操作是,就会调用客户端接口,返回结果数据。

8、 线程池

针对高并发的客户端请求,服务端可以维护一个线程池,针对每次的客户端的请求,可以直接从线程池中拿出一个线程,直接去执行客户端的任务,省去了每次创建线程的开销,同时提高了服务端的响应速度。

四、手动编写一个简单的rpc框架

建议参考如下两篇博客中 大佬针对几种形式的rpc设计思路进行了 简单rpc框架的搭建