0.前言
近期阅读了《深入分析Java Web技术内幕》这本书,书中涉及的知识点非常全面,让我对Java Web相关技术有了更加全面的认识,受益匪浅。这里跟大家分享下本人深入后印象比较深刻的几个点。
1.NIO (Non-blocking IO)
1.1同步异步、阻塞非阻塞
- I/O交互中经常涉及同步/异步,阻塞/非阻塞。
- 要注意这两个是不同纬度的概念:同步/异步指的是程序跟I/O操作的关系,如果由程序自己控制I/O操作则是同步,如果将I/O操作委托给其他(例如操作系统),则是异步;阻塞/非阻塞指的是I/O操作时对于CPU的消耗,如果CPU停下来等待I/O操作完,再进行其他操作,则为阻塞,否则是非阻塞。
- 根据组合,I/O交互可分为同步阻塞、同步非阻塞、异步阻塞、异步非阻塞四种。其中BIO为同步阻塞的,NIO为同步非阻塞,而AIO(也称为NIO2,书中没有讲到AIO)是异步非阻塞的。
1.2NIO的核心
NIO最主要的三个概念Channel、Buffer、Selector。
Channel
首先看下jdk里对于Channel的注释
- Channel代表了一个可以用来进行至少一种直接IO操作(例如读、写)的实体(例如硬盘、文件、socket等);
- 不同于InputStream或者OutPutStream,Channel是双向的,它可以代表不止一种IO操作;
- Channel的数据可以异步读写;
Buffer
Channel的数据不能直接写入或者读取,需要使用Buffer。
Buffer就是一段连续并拥有特定大小的原始类型数据载体。它拥有三个关键的指针来标记当前的读取数据状态,分别是position, limit, capacity。其中,capacity标识了当前Buffer的总容量。limit则标识了在读/写模式下,还能再读/写到的位置。position则代表了当前数据的位置。
初始时如下图:
当读取5个字节后,则变为下面的状态:
此时,调用flip()的方法,则会转换Buffer的读写状态,有写入变为读取,此时的指针变为下面的状态:
此时就可以使用get()读取Buffer中的数据,读取完调用clear()方法,状态则会再次重置为初始状态。
Selector
NIO的神奇之处就在于Selector。多个SelectableChannel可以都注册到同一个Selector上,每个注册后都有一个SelectionKey,这个SelectionKey可以检测到Channel的状态,是在请求链接,还是数据准备好了,还是断开连接,根据不同的状态做出不同的操作。这样就可以使用较少的线程来管理更多的连接,同时I/O操作可以是非阻塞的,提高了系统中的吞吐量。
1.3对比BIO、AIO
前面已经提过,BIO为同步阻塞的,NIO为同步非阻塞,而AIO(也称为NIO2)是异步非阻塞的。
- BIO是同步阻塞的,IO时会造成cpu等待,当拥有大量连接请求时,IO将会成功系统吞吐量的瓶颈。
- NIO因为是非阻塞的,所以在IO还没有准备好时,cpu可以去做别的事情,而不是停下来等待,系统吞吐量增加;
- AIO则通过异步通道实现异步非阻塞IO,当进行读/写操作时,调用API的read或者write方法即可,IO的准备以及读/写数据均有操作系统完成,当操作系统完成后,将结果通知应用程序。
2.Servlet
2.1 Servlet容器
- Servlet创建,初始化,运行等均离不开Servlet容器,比较流行的Servlet容器有Tomcat,Jetty等。
Tomcat作为一个Web容器,其设计大而全。Jetty基于Handler的设计更加轻盈,在定制化和移动领域有不错的表现。
2.2 Servlet创建与初始化
StandardContext会根据我们的配置解析servlet,并设置属性、mapping等,同时根据load-on-startup属性判断是否立即初始化。
2.3 Servlet体系结构
Servlet引用了几个关键的类,ServletContext,ServletConfig,ServletRequest,ServletResponse。ServletConfig包含了一些配置属性,ServletRequest和ServletResponse分别代表了请求和返回,ServletContext代表了应用的上下文信息,可读取全局的存储信息。
3.Spring
3.1 Spring架构
Spring的架构大家都比较熟悉了
这里面最核心的就是Core,Context,Bean,而最最核心的就是Bean了。
3.2 Bean
Bean组件主要包含了Bean的创建,Bean的定义,Bean的解析。
Bean的创建使用了经典的工厂方法模式
我们定义的Bean在Spring内部都会转化成BeanDefinition
关于Spring的内容这里就不再展开讲了,后面有机会单独拿出来分享。
4.设计模式
本书里面很多章节都讲到了涉及的设计模式。比如IO的装饰者模式和适配器模式,Tomcat的观察者模式、命令模式、外观模式,Spring的策略模式,模板方法模式,iBatis的工厂模式等等。
5.写在最后
这本书涉及的东西很多,看出来君山想要讲的东西很多,但限于篇幅,有些都是点到为止,所以对于部分技术的一些细节,还需要自己继续去深挖一下,一定会有更大的收获。