背景
- 根据Reactor模式论文和Doug Lea的nio文档,可以在java.nio包下实现网络编程功能,但是依然很繁琐细节。
- 通过各种技术的发展过程来理解为什么有Netty?
Netty为什么存在?
- 传统io在socket中的缺陷。一请求一线程一应答。所以才有JDK1.4的NIO出现,后面也有JDK1.7对NIO的优化。
- Java I/O(JDK1.0)到Java NIO(JDK1.4)到Java NIO2.0(JDK1.7)的发展史。Java I/O的演进之路
- Reactor反应器模式。尤其它有哪些角色,角色跟操作系统的关系,跟我们需要自定义实现的Initiaiton Dispacher, Event Hadler,Handler。及其理解它的工作过程。实践过程如下:
Doug Lea的nio文档学习之古典的网络编程服务设计
Doug Lea的nio文档学习之Reactor单线程版本
Doug Lea的nio文档学习之Reactor多线程版本
Doug Lea的nio文档学习之Reactor最佳做法 - 其实,根据Doug Lea 的nio.pdf文档和Reactor论文,直接使用Java NIO依然可以实现这样的功能,但是Java NIO实现起来繁琐,而是它的Future, Channel等控制起来并不那么精细,会存在缺陷。
- Netty在Java NIO基础上,加入了自定义的Future, ChannelFuture,ChannelFutureLisener,对整个过程的监控,回调,对执行过程的精确把控。
- Netty因为作了高层次的抽象,这样开发者使用Netty的时候,就会非常简单。如果要求不是很高的话,甚至可以对Netty不用知道太多细节,快速搭建自己的网络程序。如果要求高的话,就需要理解Netty启动过程发生了,做了哪些准备工作。真正重要的是:它对能够考虑到的问题,是怎么解决的,为什么要这样解决。
- 其实,会用和知道工作过程,都差不多。但是,如果想知道为什么这么做的话,就需要先越过工作过程的小山坡,然后探寻为什么这么设计。
- 为什么这么设计,是因为传统的做法,在某些场景下,有缺陷。事物一步步发展变更,最后,某个大牛一篇论文阐述某个理论可以解决这个问题。比如Reactor反应器模式。这个时候,Netty跳了出来,把这个理论进行了实践,也不一定是高深莫测的内因,有时候是没有内因的。就像Cardano对响尾蛇论文的实践一样(Cardano的共识算法)。
- 规律就是,事物发展变化,理论论文出来,后续很多开源框架进行了实践,最后这个框架。解决痛点问题,概念简单易用,有社区就会成为顶级项目,就像Netty。
- 这个规律在编写某个具体业务逻辑同样适用。当事物只有一个两个的时候,if else也能够应对,但是,当变多的时候,就会失控,然后就需要某个设计模式来应对这样的情况。刚开始的时候,没有必要去考虑这么多,慢慢地,自然而然地需要作出改变优化。其实,Netty的来源过程也跟这个差不多。
小结
- Netty在“巨人的肩上”,Reactor反应器模式和java.nio包提供的API的基础上,实现了一个高性能的Java网络编程框架。Netty屏蔽了底层的复杂度和细节,开发者可以专注于业务逻辑。
- Netty的出现过程。跟传统I/O和NIO和Reactor模式有莫大的关系。