Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度愈来愈大,可是原理是基本不变的。因此沉下心看清代码本质很重要,此次给你们带来的是手写RPC框架。java
完整代码以及说明文档,点我跳跃~git
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。程序员
RPC框架有不少,比较知名的如阿里的Dubbo、google的gRPC、Go语言的rpcx、Apache的thrift,新浪的motan等等。固然了,你也能够说Dubbo是RPC框架的超集,此外对于Spring Cloud来讲,RPC也只是它的一个功能模块。(话说Dubbo已经晋升为Apache顶级项目了,还不一块儿动手学习下?)github
RPC要解决的两个问题:json
项目的基础框架,提供IoC功能。同时方便打成JAR包,便于测试。segmentfault
基于NIO的网络通讯框架。相比用java socket实现的BIO通讯,Netty不管是代码编写简洁仍是基于NIO异步非阻塞特性,都占尽了优点。后端
序列化、反序列化。RPC框架中通讯选择有不少:kyro/thift/json/hessian/protobuf/xml等等,为了快速实现RPC框架,节省生成桩函数的时间成本,因此本文采用了阿里的fastjson。缓存
提供服务的发现与注册。一个服务会有多个实例,因此咱们选用zookeeper做为注册中心,在调用时,从zookeeper获取服务的实例列表,再从中选择进行调用。服务器
在调用链路中断点,就能够同时了解RPC通讯原理和Netty的通讯原理了,代码每一个方法和类都作了注释~实践出真知,看代码赛过全部博客的文字介绍。
相比Dubbo这样成熟的RPC框架还有未实现的功能以下:微信
如何从多个实例里挑选一个出来,进行调用,这就要用到负载均衡了。负载均衡的策略确定不仅一种,要怎样把策略作成可配置的?又要如何实现这些策略?
每次调用查询接口时都要真的去Server端查询吗?是否是要考虑一下支持缓存?
服务端接口修改了,旧的接口怎么办?
客户端调用完接口以后,不想等待服务端返回,想去干点别的事,如何支持?
服务端要停机了,还没处理完的请求,如何优雅的处理?
最后,限于笔者经验水平有限,欢迎读者就文中的观点提出宝贵的建议和意见。若是想得到更多的学习资源或者想和更多的是技术爱好者一块儿交流,能够关注个人公众号『全菜工程师小辉』后台回复关键词领取学习资料、进入先后端技术交流群和程序员副业群。同时也能够加入程序员副业群Q群:735764906 一块儿交流。