整个RPC功能已经都贴出来了,代码没有做过整理,没有把序列化/反序列代码抽象,协议部分也没做抽象,只是想写的快点,能够在短时间内写出来和标题十分钟对应上,所以可能代码难看点,不过整体已经展示出来了,关键代码是不需要使用任何第三方框架和工具包的。欢迎大家进行拍砖。另外打个广告吧,本人写了一个稍微复杂点的RPC放在github上,有木有同学想一起进行写着玩的的,赶紧约起啊,代码地址是https://github.com/shocklee6315/simpleRpcServer
至此整个框架部分已经完成,暂时还没有做常见的rpc客户端api包装,比如包装成从某个容器里面根据接口取出一个远程对象,直接调用远程对象的方法。最后贴个测试类和接口
最后是客户端传输和协议处理代码
其次是请求对象的处理部分
互联网时代,各种RPC框架盛行,细看各种框架,应用层面有各种变化,但是万变不离其宗,RPC最核心的部分基本都是一致的。那就是跟远程的服务器进行通信,像调用本地服务一样调用远程服务。然后在这些基础上可能会附加一些诸如,服务自动注册和发现,负载均衡,就近路由,调用链路记录,远程mock等等功能。今天想给大家分享的是,如果不考虑性能,API易用性,服务发现,负载均衡,环境隔离等其他因素,其实做一个基本功能的RPC框架,几分钟就能搞定。个人认为RPC功能的基石有下面几个 一、序列化协议 二、远程通信报文协议 三、协议报文处理实现。序列化协议JDK为我们提供了一套自带的序列化协议,虽然不能跨语言,压缩率不高,不过我们只为展示RPC技术,没有考虑其他,如果觉得不好可以使用Hessian ,protobuf,甚至是诸如fastjson这些json序列化的开源框架。远程通信JDK有一套socket和输入输出流,虽然是同步的,性能不怎么样,但是只为展示RPC技术原理,不考虑其他,为了性能和吞吐量我们可以选择netty进行改造。通信协议,我只做了一个简单的 MAGIC_NUM+两个字节报文长+序列化对象字节流 的协议,协议上可以增加很多东西,比如版本号,心跳包,状态码,可扩展的报文头等等,不过同样的,这里只为展示RPC原理,不考虑其他的。协议报文处理部分只是通过报文体里面携带的 类名 方法名,方法参数,做了个简单的反射处理,这部分其实可以扩展的部分很多,比如预先做方法缓存,方法签名使用短命名注册等等,或者想更快还能通过字节码注入的方式自动生成一些模板代码的方式,将反射变成直接的方法调用。下面直接展示代码吧首先是传输的对象都是java可序列化对象:
来源: https://yq.aliyun.com/articles/66167