首页 > 其他分享 >从零带你写netty

从零带你写netty

时间:2023-03-04 14:36:07浏览次数:35  
标签:netty 框架 零带 编程 学习 源码 课程

提到netty,我们总会说它是Java语言中网络编程的首选框架?为什么?因为它性能太高了。这也是很多人热衷学习它的原因。也许点进这篇文章的你,就怀着这样的目的。但是,请你认真审视一下自己的内心,你是为了补充技能盏而盲目学习,还是真的知道自己为什么学习netty,或者仅仅是因为兴趣而学习?如果你真的知道自己为什么学习netty,那么,你肯定也就清楚,你希望从netty中学到什么,学到什么程度,最后把学到的东西用到哪里。如果你对这三点感到茫然,不如先听听我当年为什么学习netty。

我当初工作了一年的时候,也接触了一些业务,代码水平,也不值一提,但是我有一颗求知的心,总想利用业余时间找点东西学一下。恰好,那时我总是听到一个词:远程调用。我不知道大家第一次接触这个概念的时候是怎么理解的,但我相信在分布式大行其道的今天,大家应该都明白远程调用的意思,所以我就不嗦啰解释了。在我看来,如果把远程调用的定义设定得宽泛一点,http请求也可以称得上远程调用,redis的客户端发送一条get指令给服务端,也可以称得上远程调用。甚至我可以说,只要有客户端和服务端,就会有远程调用。所以我就一直想,为什么我不自定义协议,也写一个远程调用框架呢?也就是我们俗称的Rpc框架。

当然,这只是引起我兴趣的一个契机,让我们回到网络编程,各位,我理解的网络编程实际上就是为网络通信服务的,我们所做的一切就是为了让客户端发送一条消息,然后顺利到达服务端,或者是服务端发送一条消息,顺利达到客户端。我们熟知的各种软件不就是这么工作吗?MySQL不就是这样吗?Redis也是如此,我们熟悉的各种中间件,哪一个离得开网络通信呢?

比如说,我学过了Redis,现在我想自己手写一个Redis,要写客户端和服务端,要完善哨兵模式,我不可能离得开网络编程;如果我要手写一个消息队列中间件,或者手写一个全链路监控框架,或者是一个分布式定时任务框架,或者类似于Nacos的动态配置中心,我就必须要熟练掌握网络编程,实现网络通信。众所周知,学习一个框架有很多种方式,但是哪种方式都比不过自己仿照源码手写一个新的框架。这不是重复造轮子,造轮子还是交给大厂去吧,这只是我们学习的一种最优手段。所以,我为了能够以上面列举的这些框架为模版而创造轮子,我在掌握Java网络编程的基础上,学会了如何使用netty,又在此基础上,深入学习了netty的源码和架构。这时候,我也拥有了创造这些轮子的最基本的能力。当然,这也就意味着我要学习的东西还有很多。

现在,请各位再次问问自己,究竟为什么要学netty?

我可以再谈谈自己在学习netty的过程中掌握了哪些知识,首先,我得承认,虽然netty用到了多线程编程,但是它并没有使用多么丰富的多线程编程手段,它的核心部分也只是用到了线程池和Promise,其实Promise是Java中Future的一种更灵活的实现,算不上新东西。但是我可以说,通过学习netty,我个人对并发编程思想的理解和掌握,达到了一个新的层次;其次就是一些常用的设计模式,让我领悟得更深,也在之后的编程生涯中用到了很多次;还有对象池,堆内存和堆外内存的利用,我把这些称为优化的技术。最后,也是最重要的,通过反复研究netty的源码,琢磨其中各种接口和类的关系结构,我发现我对编写框架,也就是造轮子,有了更深的领悟。

比如,在我后来自己造轮子时——当然也是为了更深入地学习某个框架——编写到某个地方,很自然地我就明白,应该引入接口了,或者这里应该弄成抽象类,哪些方法应该定义成抽象的,渐渐成为了一种习惯。后来我学习一些逻辑复杂的源码,比如Spring,多看几遍,我也可以看明白其中类和接口的关系结构,为什么这个方法要在这个类中,为什么这个类要实现好几个接口。简而言之,我对编写框架的思想也有新的感悟。说到底,高内聚,低耦合,适用于你编写的任何代码和框架。这里我多说一句,从我个人来说,netty的源码比Spring的源码简单一些,但同时又精妙一些。

说了这么多,那么netty难学吗?还是我个人的感受,我认为不难,只要你有网络编程和并发编程的知识,知道什么是bio和nio,就可以学习。我知道有些技术博主或者培训机构也在吹捧netty,甚至吹捧到神乎其神的地步。依我看,根本没必要这么做,netty只是一个性能优秀的框架,源码确实很精妙,但是再精妙,也不会增加它的学习难度,只会让你学起来感觉更有趣。总而言之,netty的核心就四个字:异步,回调。

如果你知道自己为什么学习netty,想学到什么程度,今后怎么运用,那就跟着我的课程学习吧。别的我不敢保证,但是我从netty中受益多少,我会毫无保留地展现给大家。

好了,下面来谈谈我是怎么规划这门课程的吧,整个课程目前分为25节,可能还会加餐。下面是该课程的目录。我采用的是渐进式教学,既然是手写netty,当然就不会直接去讲框架的源码,如果是那种照本宣科的教学方式,我相信市面上已经有很多了。没有新意,而且效率也不是很高。当然,我们自己手写的netty,不论是接口和类的名称还是关系结构,还是各个方法的名称和逻辑,最后都会和源码一摸一样,但是整个过程的变化,结构的演进,我们都一清二楚,最后循序渐进,由浅入深地掌握这个框架。

 

课程配备的代码,目前已经迭代到了第十版本,对应我们课程的第十六节。后面应该还会继续迭代八个版本。每一个版本,你都会看到新的变化。而且所有关键代码都加了注释,保证大家不会困惑。再回过头说说我们的课程,虽然写了这么多版本的代码,但是在讲课的时候,我也不会照着手写的代码或者框架源码,干巴巴地讲解代码逻辑,那样还不如直接把代码发给大家去看。我喜欢的风格是列举例子,提出问题,然后引导思考的方向,然后是下一个问题,环环相扣,最后讲清楚内容。我不会直接教你就这么写,而是想教给你为什么要这么写,简而言之,我想把我领悟的编程思想展示给大家。我相信我没有夸大这种讲课模式的益处,如果我没能做到我说的这样,请大家及时给我留言。

代码具体版本可点击链接观看:https://www.bilibili.com/video/BV1mv4y1h7D6/?vd_source=89b2cee37fd7097b81ebe3fe89324549

好了,这时候,我想谈谈我为什么要写这门课,首先,我的目的是挣点钱,这一点无法回避。我本人已经工作六年,呆过的地方都是小公司,没进过大厂,这是事实。除了Java,还学过C和C++,虽然也存了点钱,但是也花了不少钱,马上就要有小孩了,未来还要花更多的钱,所以才想用自己掌握的一点知识换点钱。你们也许会好奇既然我打算贩卖这门课,之前一定也写过不少技术文章,不然你怎么能让陌生的读者一上来就信服你拥有过人的技术呢?这时候我确实得解释一句,我个人之前确实没写过什么技术文章,倒不是我一点技术也不会,而是我觉得各种平台上有很多技术文章,我要讲的东西有人已经讲得很好了,因为我也常在各种平台上看别人发表的文章,学习知识。就像这次准备netty课程,我也观摩学习了一下别的技术博主的讲解流程。如果我做一件事,我希望最好能让这件事体现出我自己独有的价值。虽然我和大家一样都是普通人。

还有一个最重要的原因,我之所以没怎么写过技术文章,是因为我没精力。因为就在两年前,我心中的文学梦还没有熄灭,那时候还幻想自己写的文学小说能够出版,一有时间就写小说,把时间都留给文学小说了。最后确实写完了两部文学作品,一本四十万字,一本十万字,当然也没能出版成功,都分给身边的朋友看了,文学梦也就此搁浅,也许以后还会有机会重新起航。近几年,我最喜欢的作家是石黑一雄,所以,我也希望自己能写出它那样情感冲击强烈的文学小说。

如果大家怀疑我的能力,我在文章的最后贴出了三节课作为试读,如果大家有兴趣,可以大概浏览一遍。最后,再说说这门课的定价,定价为100,虽然每节课我讲述的内容很多,但也确实很贵,就算一本市面上的实体书也没这么贵。但是这个定价是一次性买断的,这也就意味着我们的语雀小册以后会一直更新。手写netty的项目更新完了,我会继续更新其他的新项目,比如仍然是仿照别的框架手写链路监控系统;或者是动态配置中心;或者是一个小巧的Redis;或者是用netty写一个游戏的服务器。甚至我可以用我的方法教大家C和C++,然后讲一些编译器的知识。以后我推销自己课程,也会以新的科目来推销,但是只要购买了册子的人,都可以学习有所有课程。

当然,我说我可能会搞这些东西,并不是我对这些东西全都精通,我自己也只是明白它们的运行原理,然后抽时间去学了学。因为我一直觉得我在这行不会干太久,迟早有一天我会脱掉程序员的身份,变成文学作家,所以我不会强迫自己太深入地学习一些知识,如果有些知识我学得时间长,稍微有些深度,那也是感兴趣才去学的。我研究生是在香港的城市大学读的,是比不过大陆的一些学校,所以毕业之后直接在香港找工作,直到去年结婚才回大陆。疫情那两年,香港的公司一直居家办公,基本上每天五点就可以结束工作,所以我有很多可以自由支配的时间去钻研知识,写自己的小说。对了,我还要再说一句,我们现在的手写netty项目也没有更新完,代码已经迭代到第16节课了,文章马上就要更新第4和第5节课,今后会维持五天一节课的更新频率。

也许你是个经验丰富的老程序员,对Spring,Mybatis等框架的源码烂熟于心,学netty只是想在工作之余快速学点东西,如果是这样的话,浏览我写的课程时,有不正确的地方请耐心地留言指出,我一定虚心接受和学习;如果你是个工作经验刚满一年,不满足于整日CRUD,想学点有技术含量的知识,提高阅读源码和编程的能力,那么在阅读课程的时候,有不明白的地方也请及时给我留言,我一定帮你解惑。因为我写这门课的初衷,就是想教给那些只有网络编程基础,明白什么是bio和nio,同时也掌握了并发编程的人从零写一个netty。也许有的人会质疑,连netty都没用过,怎么能学会写呢?这时候我就要反问一句了,netty的作者在没写出netty之前是怎么学会netty的呢?

下面给出的四个链接,前三个是课程的试读部分,也就是我们的前三节课。如果大家觉得我讲得不错,可以点击最下面的链接进行购买。感谢大家。

第一节课

第二节课

第三节课

购买链接

 

 

标签:netty,框架,零带,编程,学习,源码,课程
From: https://www.cnblogs.com/tutucute/p/17178237.html

相关文章

  • Netty
    数据模型最主要的就是Channel每一个Channel都有自己的ChannelPipeline每一个Channel只会和一个EventLoop绑定EventLoop和Channel是一对多关系.EventLo......
  • 《netty实战》10-11章
    第10章编解码器框架                                    第11章预置的ChannelHandler......
  • 《netty实战》笔记 1-8章
    第1章            此方式(javaAPI阻塞方式):一个客户端——一个线程当客户端连接非常多时很不理想 JavaNIO——非阻塞      ......
  • Gateway集成Netty服务
    Gateway和Netty都有盲区的感觉;一、Netty简介Netty是一个异步的,事件驱动的网络应用框架,用以快速开发高可靠、高性能的网络应用程序。传输服务:提供网络传输能力的管理;......
  • 即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
    为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。[-1-] 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别[链接] htt......
  • Gateway集成Netty服务
    目录一、Netty简介二、Netty入门案例1、服务端启动2、通道初始化3、自定义处理器4、测试请求三、Gateway集成1、依赖层级2、自动化配置四、配置加载1、基础配置2、属性配置......
  • java netty socket实例:报文长度+报文内容,springboot
    前言说实话,javanetty方面的资料不算多,尤其是自定义报文格式的,少之又少自己写了个简单的收发:报文长度+报文内容发送的话,没有写自动组装格式,自己看需求吧,需要的话,自己完......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,其被......
  • 手把手教你为基于Netty的IM生成自签名SSL/TLS证书
    1、引言对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作。众所周之,Netty是高性能的JavaNIO网络通信框架,因而用Netty来写IM是再正常不过了。网上关于为Netty......