手写一个RPC框架来检验你的Spring和Netty基本功

4 篇文章 0 订阅
1 篇文章 0 订阅

1、序言

 

         在我早期的一篇博文Java反射机制的原理和用途中,文末我写到过:"如果你不做框架的话,基本上是用不到反射机制的,我们大多时候是使用框架的一方,而反射机制都已经在底层实现过了,因此,我们不必担心,我们会写那么复杂的代码。但是,我们必须要理解这种机制的存在!" 这篇文章作于2017年9月份,距离现在已经过了快4年了,曾经那个CRUD很⑥的少年如今已经发生了很大的变化;原来懂技术只是爱好,如今会技术却是饭碗。好在有大批优秀开源技术和好文的存在,使得我们这些平凡的人只要肯努力静下心来吃透技术,才有过上优质生活的可能。

                                                                                                                                                                                                                                                                      

GitHub: https://github.com/kobeyk/seven-rpc.git


Gitee:  https://gitee.com/appleyk/seven-rpc

       


 

1、是什么

 

          RPC(Remote Procedure Call)是什么,一搜一大堆,我就不说官方话了,拿生活中的例子直白点解释就是:你(客户端,服务消费者)现在突然想吃(请求)小龙虾(对象),但是你自己又不会做也不想做(客户端无需关心小龙虾在哪买,怎么清洗,怎么做,他只关心,我怎么吃到它),你只好拿起手机点开了某团的外卖APP(服务注册与发现中心),在搜索栏输入了"小龙虾",回车查询(查询服务中心服务节点)出来好多商家(服务端,服务的提供者),于是你随便点开了一家商家,发现里面有麻辣小龙虾、13香小龙虾、蒜蓉小龙虾(具体服务,接口多态实现)等,于是基于你自己的需求你选择了麻辣口味(就好比缓存实现的方式有很多种,可以基于内存、基于redis、基于mongodb或基于rocksdb等)的,你一顿操作,填写完数量、地址、备注信息后就下单了(netty客户端封装rpc请求,准备发送给netty服务端了),这时候商家那边就收到了订单信息(客户端rpc请求),随后订单被某一骑手(Netty#EventLoopGroup线程池中的某一个线程)抢到了... 省略取餐和送餐的过程后,最终,在商家和骑手的合作下,你得以顺利的吃到你心仪的麻辣小龙虾(响应结果,消费服务的产物)! 别忘了这一过程背后有一个容易被忽略的牛逼"人物",他就是平台,你的一举一动,包括商家的,可都在它的"监控"下呢,服务有哪些、哪些靠谱、用户什么时候消费了哪个商家的服务,服务被消费的次数等等在平台上可都是记录着呢(真实编码环境中,分布式服务协调器zookeeper可是相当的重要的)。

       上面只是举例说明,总结一下,👆就是:客户端调用服务端的服务,就像调用本地方法一样简单。(如何实现呢,那就是RPC框架要考虑的事情)

        

 


常见的RPC框架有:


Netty·RPC模型

 


部分截图,完整请点开上面的链接进行查看

 


 

2、为什么

 

             其实手写一个简版的RPC出来不难,前有dubbo,后有其他人开源的rpc,自己借鉴一下,稍微花点心思和时间就能简单的写出来一个,那为什么我还要搞一篇文章来说它呢?其实这是个人习惯问题,当我想写一篇博文的时候,一定是深思熟虑的,不是随便写写敷衍了事的;还有就是因为写代码和写博客是两码事,你能写出来,还能把事情讲清楚,就很不容易了,那既然不容易为什么还要写呢,原有很简单:那就是通过写博文,来检验自己对这项技术是否真正的理解了,通过写博文,来加强代码的记忆力!

            话说回来,我为什么要写个RPC框架呢? 是因为技术太过于碎片化,比如你会这个、会那个,但是他们结合起来能做什么,你心里肯定一时半会没有个谱。比如反射你会写,因为你经常看一些框架的源码,比如你对spring框架非常了解,阅读和调试过源码,对bean的生命周期了如指掌,不仅知道还知道怎么二次扩展使用;你也用过springboot,对其自动装配的原理非常清楚;你知道什么是bio、nio及他们之间的区别,不仅知道还会用其API编写一些小程序;也知道netty是封装在nio之上的可以快速编写高性能网络通信客户端和服务端的框架,对序列化和反序列化性能追求极致,对比过json和pbf的性能;你知道什么是分布式服务协调器zk,也知道怎么用..etc ,看,你会的技术可真不少,那你能串联他们做出来一个东西(组件、模块、工具、系统、框架..etc)吗,不,应该说是一个有用的东西吗?当然,我们有现成典型的例子,它就是RPC框架!

          当你完完整整的手写完一个rpc框架并跑通所有测试后,你会兴奋、喜悦、甚至是觉得自己巨帅无比,单当你静下心来时,请收起你的的"狂妄",是时候进行总结和梳理了。

          Netty·Reactor模型

部分截图,完整请点开上面的链接进行查看


             

3、怎么做

 

            做起来远比说起来“难”多了,不是说这项技术有多神秘、多复杂,而是说“做”这件事情难,就好比我总是说我要减肥,晚上不吃甚至少吃,可一旦晚上不吃心里就发慌,终究还是对抗不了美食的诱惑;话说这个rpc小框架早在几个月前就在gitee上建好了仓,一直没开工,直到最近才捡起来断断续续把功能代码给补全了,只是最近突然来兴趣了,就撸了撸,如果真要认真撸,只要spring和netty基本功扎实,最多不超过半天(4个小时内)就可以搞出来一个,不想相信那些什么说10分钟或者30分钟就能搞出来的,不亲自全程走一遍,你是体会不到写一个"框架"的不易的。

           回到正题,那在我们开撸之前,我们需要哪些技能点呢?我们写这个的思路又是什么呢? 


3.1 技能点

1、  java反射、jdk动态代理:知道、了解、熟练使用


2、 spring bean完整生命周期:了解,看过源码或相关博客,调试过且会简单应用,比如BeanFactoryPostProcessor有哪些,其和BeanPostProcessor有什么区别,怎么用...etc

ImportBeanDefinitionRegistrar#registerBeanDefinitions方法调用时机

部分截图,完整请点开上面的链接进行查看

 


Spring·Bean生命周期流程图

部分截图,完整请点开上面的链接进行查看

 

3、 netty: 可以基于API快速构建客户端和服务端,知道什么是通道(channel)、管道(pipeline)、怎么定义、编写和添加处理器(handler)等



Netty·编解码器

 

部分截图,完整请点开上面的链接进行查看

 


4、zookeeper:对curator框架了解和会使用,并能够编写zk常用的API,基于API封装成工具类


 

3.2 思路

 

直接看图吧

 

 


 

4、怎么用

 

4.1  启动rpc-demo-provider

 




ZooInspector工具

百度网盘密码: ck89

 


 

4.2  启动rpc-demo-consumer

 



 

4.3  浏览器借助swagger#ui接口管理页面进行用例测试

 

 


 


 


 

4.4  客户端和服务端控制台输出

 

客户端:

 


 

服务端:

 

 


 

客户端·演示订单查询:

 

 


 


5、项目地址:

 

GitHub: https://github.com/kobeyk/seven-rpc.git


Gitee:  https://gitee.com/appleyk/seven-rpc

 

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值