手写一个RPC框架来检验你的Spring和Netty基本功
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
原文地址: https://blog.csdn.net/Appleyk/article/details/117392129
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章