第 01 篇: 手写 JavaRPC 框架之思路分析
作者: 西魏陶渊明
博客: https://blog.springlearn.cn/
天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄!
一、前言
如果不是因为热爱,我不会这样;如果不是为了,涨点粉丝,我不会这样;如果不是为了几两散碎银子,我更不会这样。
以前的文章开场太过严肃,太过专业。就像大学老师上课,只知道讲课。不知道互动。这样效果太差,写的没意思,读者更是没意思。大数据分析还以为你是抄的,还不给你推荐热门 😭。
不然就改变一下风格吧,从本系列文章开始,小编就要放飞 ✈️ 自我,随心 ❤️ 而动。希望在分享,总结自己掌握的知识点的同时,能给各位客官带来一点小小的收获。小编尽量全力输出干货,如果看完感觉还行的话,希望能多多关注。你的关注,就是我进步的最大动力。如果看完,感觉就这? 可以留言讨论。接受各位看官的批评和意见。共同学习共同进步。
二、目标
本系列文章的总体目标是从零实现一个 RPC 框架,我们将从 TCP 通信协议开始,一步一步实操,将 socket 二进制数据流一步一步变成 Java 可以认识的数据类型,从而最终实现 RPC 远程通信,并可以集成在 Spring 中,同时也可以支持 SpringBoot 的自动化配置。最终我们会将项目发布到全球 Maven 仓库, 让大家都可以下载学习。
本系列文章主要知识点以思维导图的方式,展示在下图=面,内容只会多不会少。干货较多,对于初级的同学可以收藏起来慢慢看。毕竟一口也吃不了一个胖子。但是不能没有信心。
正如小编的口头禅: 写代码和写文章是一样一样的。
天下代码一大抄,抄来抄去有提高,看你会抄不会抄。
三、思路分析
3.1 什么是 RPC 框架
我们在要写 RPC 框架,我们先思考下 RPC 是什么? 白话点就是一个远程通信的工具而已。他可以让开发者像调用本地方法一样,方便的调用远程的方法。
目前市面上的 RPC 框架主要有下面这些
dubbo
grpc
feign
可能对于银行和传统国企可能偏爱国产的 dubbo 框架,可能会涉及到国家安全吧,而对于互联网公司更多的会使用 SpringCloud 的全家桶。那么不管他们使用的其中的哪一款,其实这些框架都是能做到,让开发者像调用本地方法一样实现远程方法的调用的。
可以实现远程调用的呢? 答案当然就是利用 socket 通信了。而 socket 底层通信都是基于 tcp/ip 协议实现的。所以以上这三款的
3.2 通信框架的区别
dubbo
grpc
feign
共同点:
都是基于 tcp/ip 协议来实现通信
都屏蔽底层通信细节,使开发者只用关心自己的业务即可
不同点:
grpc 和 feign 都是基于 tcp 协议更上层的 http 协议来实现的
dubbo 是基于 tcp 协议上自己重新实现了一套自己的规则,而这个规则就是 dubbo 协议。
dubbo 协议因为是直接基于 tcp 协议定制的,所以可能性能会更加的好。能实现更多的底层的特性,比如说长连接。而其他两款是基于 http 协议来进行封装的,正因为它的这个特性,所以只是 http 客户端都可以进行调用,更适合跨平台,跨语言。因为不管是什么语言,都支持 http 协议。但是他的性能可能就相对没有 dubbo 好,综上所述他们各有胜负。现在主要比的就是看谁的生态比较好,谁的周边扩展更加丰富。
3.3 RPC 底层实现
前面我们说了,RPC 框架是一个,可以让程序猿像调用本地方法一样实现远程方法调用的一个工具。其实这句话就说出了主要的答案。
既然知道了他的大概实现,那么其实思路就有了。我们第一步就是使用 Java 语言来实现底层的通信能力建设,然后在这个基础上进行二次封装,最终通过动态代理的形式,将底层通信的细节给屏蔽起来。如此就能实现一个 RPC 协议了。
思路就是这个思路。
所以本系列文章的第一部分,就是先完成通信层的建设,使用 Java 实现一个通用的底层协议,实现通信能力。
说着很简单,但是实现通信可没有那么简单哦。接下来我们面临一系列网络通信中的难题。比如说 Java 的通信 API 表难用,网络通信中还有黏包拆包等问题。但是没关系,这些坑小编已经踩过了,跟着小编的思路一步一步做。相信事半必能功倍。
版权声明: 本文为 InfoQ 作者【西魏陶渊明】的原创文章。
原文链接:【http://xie.infoq.cn/article/a319acafeedc915937e2380f6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论