服务器指接收请求数据并进行解析,完成相应的业务处理,然后把处理结果作为响应返回给请求的客户端。
tomcat中常用的设计模式有:模板方法模式,责任链模式,观察者模式
上图是tomcat的类的关联设计图。
一个Server类包含多个Service,每个Service对应一个服务。一个Service包含一个Engine,
一个Engine包含多个Host, 一个Host包含多个Context, 一个Context包含多个Wrapper。
Server,Service,Engine,Host,Context,Wrapper都实现了Lifecycle接口,Lifecycle接口有下面这些方法:
四个基本容器Engine,Host,Context,Wrapper都实现了Container接口。
四个基本容器对象里面都有一个pipeline及valve模块。采用了责任链模式,依次调用。
Coyote是Tomcat服务器提供的客户端访问的外部接口。客户端通过Coyote与服务器建立连接,发送请求并接收响应。
Coyote负责封装Request,Response对象。
上图是Coyote与Catalina的交互图。
Tomcat支持3种传输协议:HTTP/1.1协议,AJP协议,HTTP/2.0协议。(应用层)
Coyote按照I/O方式提供不同的实现:NIO,NIO2,APR三种。(传输层)
Connector种有下面几个核心的概念:
1.Endpoint:通信监听端口,是具体的Socket接收处理类,对传输层的抽象,Tomcat提供了一个AbstractEndpoint抽象类,根据I/o实现不同分别提供了NioEndpoint ,AprEndpoint,以及Nio2Endpoint。
2.Processor:协议处理接口,负责构造Request,Response对象,并通过Adapter将数据提交到Catalina的容器处理。tomcat根据协议的不同分别提供了Http11Processor,AjpProcessor,StreamProcessor(HTTP/2.0)做处理。
3.ProtocloHandler:Coyote协议接口,通过封装Endpoint和Processor,实现针对具体协议的处理功能。Tomcat按照协议和I/o分别提供了6个实现类:Http11NioProtocol, Http11AprProtocol, Http11Nio2Protocol, AjpNioProtocol, AjpAprProtocol, AjpNio2Protocol。
4.UpgradeProtocl:表示HTTP升级协议,提供了实现类Http2Protocol。
HTTP/2.0的改进:1.采用二进制格式传输数据,而不是HTTP/1.1的文本格式;
2.对消息头采用了PACK压缩,提升了传输效率;
3.基于帧和流的多路复用,实现了基于一个链接的多请求并发处理;
4.支持服务器推送。
系统的性能,一般会考虑下面几个方面:1.数据库I/o,数据文件存储;2.功能算法,缓存,并发,SQL语句;3.服务器性能。
服务器性能又可以分为:1.请求处理的并发程度;2.减少网络传输的数据量;3.降低新建链接网络的开销;4.选择合适的I/o,提升I/o效率。
传统的BIO是基于流进行读写的,而且是阻塞的,性能较差。
BIO以流的方式处理数据,而 NIO 以块的方式处理数据。
NIO中有几个核心对象需要掌握:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。
NIO2最大的改进是引入对异步的支持,也叫(AIO)。
AIO中通道必须实现接口java.nio.channels.AsynchronousChannel。有三个通道实现类:java.nio.channels.AsynchronousFileChannel, java.nio.channels.AsynchronousServerSocketChannel, 和 java.nio.channels.AsynchronousSocketChannel。
AIO的操作存在两种方式:Future和CompletionHandler。
APR是Apache可移植运行库。
java服务器先将JSP页面转换成一个标准的java类文件,然后进行编译,加载并实例化。编译后的Servlet实现负责将在JSP页面中编写的内容输出到客户端。
tomcat在默认的web.xml中配置了一个org.apache.jasper.servlet.JspServlet,用于处理所有的.jsp或者.jspx结尾的请求,这个Servlet实现即是运行时编译的入口。
上面的图片讲解了jsp输出一个HTML页面的过程。