仓酷云

标题: JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云 [打印本页]

作者: 飘飘悠悠    时间: 2015-1-18 11:29
标题: JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,良多开源使用服务器都是集成tomcat作为webcontainer的,并且关于tomcat的servletcontainer这部分代码很少修改。如许,这些使用服务器的功能基础上就取决于Tomcat处置HTTP哀求的connector模块的功能。本文起首从使用条理剖析了tomcat一切的connector品种及用法,接着从架构上剖析了connector模块在全部tomcat中所处的地位,最初对connector做了具体的源代码剖析。而且我们以Http11NioProtocol为例具体申明了tomcat是怎样经由过程完成ProtocolHandler接口而构建connector的。
经由过程本文的进修,应当能够轻松做到将tomcat做为webcontainer集成到第三方体系,而且自界说任何你想要的高功能的HTTP毗连器。
1Connector先容

1.1Connector的品种

Tomcat源码中与connector相干的类位于org.apache.coyote包中,Connector分为以下几类:

1.2Connector的设置

对Connector的设置位于conf/server.xml文件中。
1.2.1BIOHTTP/1.1Connector设置

一个典范的设置以下:
  1. <Connectorport=”8080”protocol=”HTTP/1.1”maxThreads=”150”connectionTimeout=”20000”redirectPort=”8443”
复制代码
别的一些主要属性以下:

假如是SSL设置,以下:
  1. <Connectorport="8181"protocol="HTTP/1.1"SSLEnabled="true"maxThreads="150"scheme="https"secure="true"clientAuth="false"sslProtocol="TLS"address="0.0.0.0"keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks"keystorePass="changeit"/>
复制代码
个中,keystoreFile为证书地位,keystorePass为证书暗码
1.2.2NIOHTTP/1.1Connector设置
  1. <Connectorport=”8080”protocol=”org.apache.coyote.http11.Http11NioProtocol”maxThreads=”150”connectionTimeout=”20000”redirectPort=”8443”
复制代码
1.2.3NativeAPRConnector设置

2Connector在Tomcat中所处的地位

2.1Tomcat架构

JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
-1Tomcat架构

故我们从功效的角度将Tomcat源代码分红5个子模块,它们分离是:
2.2Tomcat运转流程

JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
-2tomcat运转流程
假定来自客户的哀求为:http://localhost:8080/test/index.jsp
3Connector源码剖析

3.1Tomcat的启动剖析与集成假想

我们晓得,启动tomcat有两种体例:

它们对应于Bootstrap与Catalina两个类,我们如今只体贴Catalina这个类,这个类利用ApacheDigester剖析conf/server.xml文件天生tomcat组件,然后再挪用Embedded类的start办法启动tomcat。
以是,集成Tomcat的体例就有以下两种了:

团体以为第一种体例要优胜,给开辟者对照好的用户体验,假如利用这类,间接仿照Catalina类的办法便可完成集成。
今朝,JOnAS就利用了这类集成体例,JBoss、GlassFish利用的第二种自界说XML的体例。
3.2Connector类图与按次图

JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
-1Connector相干类图
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
-2Connector事情流程按次图
从下面二图中我们能够失掉以下信息:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
-3自界说connector时需完成的ProtocolHandler接口
Tomcat以HTTP(包含BIO与NIO)、AJP、APR、内存四种协定完成了该接口(它们分离是:AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11NioProtocol、Http11Protocal、JkCoyoteHandler、MemoryProtocolHandler),要利用哪一种Connector就在conf/server.xml中设置,在Connector的机关函数中会经由过程反射实例化所设置的完成类:
  1. <Connectorport="8181"protocol="org.apache.coyote.http11.Http11AprProtocol"/>
复制代码
3.3Connector的事情流程

上面我们以Http11AprProtocol为例申明Connector的事情流程。
良多开源使用服务器都是集成tomcat作为webcontainer的,并且关于tomcat的servletcontainer这部分代码很少修改。如许,这些使用服务器的功能基础上就取决于Tomcat处置HTTP哀求的connector模块的功能。本文起首从使用条理剖析了tomcat一切的connector品种及用法,接着从架构上剖析了connector模块在全部tomcat中所处的地位,最初对connector做了具体的源代码剖析。而且我们以Http11NioProtocol为例具体申明了tomcat是怎样经由过程完成ProtocolHandler接口而构建connector的。
4怎样完成Connector

由下面的先容我们能够晓得,完成Connector就是完成ProtocolHander接口的历程。
AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11Protocol、JkCoyoteHandler、MemoryProtocolHandler这些完成类的完成流程与Http11NioProtocol不异,上面我们以Http11NioProtocol为类重点申明tomcat中怎样完成ProtocolHander接口的。
Http11NioProtocol完成了ProtocolHander接口,它将一切的操纵托付给NioEndpoint类往做,以下图:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
NioEndpoint类中的init办法中起首以一般堵塞体例启动了SocketServer:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
NioEndpoint类的start办法是关头,以下:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
能够看出,在start办法中启动了两个线程和一个线程池:

4.1Init接话柄现办法中堵塞体例启动ServerSocketChannel

在Init接话柄现办法中堵塞体例启动ServerSocketChannel。
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
4.2Start接话柄现办法中启动一切线程

Start办法中启动了线程池,acceptor线程与Poller线程。个中acceptor与poller线程一样平常数量为1,固然,数量也可设置。
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
能够看出,线程池有两种完成体例:

4.3Acceptor线程吸收客户哀求、注册READ事务

在Acceptor线程中吸收了客户哀求,同时托付线程池注册READ事务。
在setSocketOptions办法中,起首将socket设置成非堵塞形式:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
在setSocketOptions办法中,最初挪用getPoller0().register(channel);一句为SocketChannel注册READ事务,register办法代码以下(注重:这是Poller线程的办法):
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
个中attachment的布局以下,它能够看作是一个共享的数据布局:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
4.4Poller线程读哀求、天生呼应数据、注册WRITE事务

4.5Handle接话柄现类经由过程Adpater挪用Servlet容器天生呼应数据

NioEndpoint类中的Handler接口界说以下:
[attach]292124[/attach]
个中process办法经由过程Adapter来挪用ServletContainer天生前往了局。Adapter接口界说以下:
JAVA教程之Tomcat处置HTTP哀求源码剖析仓酷云
登录/注册后可看大图

<br>
4.6小结

完成一个tomcat毗连器Connector就是完成ProtocolHander接口的历程。Connector用来吸收SocketClient真个哀求,经由过程内置的线程池往挪用ServletContainer天生呼应了局,并将呼应了局同步或异步的前往给SocketClient。在第三方使用集成tomcat作为Web容器时,一样平常不会动ServletContainer真个代码,那末connector的功能将是全部Web容器功能的关头。
关于作者

张华,临时处置Java方面的开辟事情,有搜刮引擎、两头件使用服务器、互联网、云盘算等范畴的行业履历,今朝正在处置基于Power的假造化手艺研发。博客地点:http://blog.csdn.net/quqi99

不得不提一下的是:.net网页编程是看到java红,而开发出来的工具。
作者: 飘灵儿    时间: 2015-1-21 07:52
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 灵魂腐蚀    时间: 2015-1-29 12:53
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 变相怪杰    时间: 2015-1-31 22:45
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 若天明    时间: 2015-2-7 00:57
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 乐观    时间: 2015-2-11 20:28
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 爱飞    时间: 2015-2-26 03:36
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 小女巫    时间: 2015-2-27 04:45
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 活着的死人    时间: 2015-3-1 17:54
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 不帅    时间: 2015-3-8 22:50
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 老尸    时间: 2015-3-10 12:41
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 若相依    时间: 2015-3-17 07:08
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者: 透明    时间: 2015-3-17 23:55
是一种使用者不需花费很多时间学习的语言
作者: 因胸联盟    时间: 2015-3-18 09:00
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 柔情似水    时间: 2015-3-19 03:50
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: admin    时间: 2015-3-27 04:10
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 谁可相欹    时间: 2015-4-1 17:10
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 再见西城    时间: 2015-4-4 10:53
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 飘飘悠悠    时间: 2015-4-6 00:58
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 兰色精灵    时间: 2015-4-14 06:21
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2