Tomcat源码研究

本人目前热衷于tomcat源码的研究,目前正在研究中,希望能在此宝地得到同道中人的多方指点,谢谢。

简单向大家介绍一下我目前研究的进展情况,首先明确一下我目前拿到的源码版本号是:TOMCAT_6_0_12,svn地址是:http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_12;需要一同研究的同学,可以用此地址下载此版本源码。本人目前的研究进度是:对tomcat的启动过程算是有了一个初步的了解,从Bootstrap.java里的main函数出发,到Catalina.java中的await部分,这个阶段的全程代码粗粗跟了一遍,算是对tomcat的启动过程有了一个粗浅的了解了。对于启动中的Digester技术尚未能彻底搞懂,敬待高年级的同学指点,不甚感激。

以前也研究过,觉得挺好的,文档非常丰富,但是好像现在都忘了,呵呵

2011年09月27日 15:23 "@docsun"的内容
以前也研究过,觉得挺好的,文档非常丰富,但是好像现在都忘了,呵呵 ...

研究过的话,不妨分享一下你的研究方法,因为我目前的主要方法就是跟源码,并配合官方的文档介绍,第一阶段,目标是搞懂tomcat的组成,启动,工作过程,尤其是tomcat中的线程池的设计使用情况。任务比较重,但是我愿意为此目标而奋斗。当然tomcat里面值得大家研究的东西确实很多,不过我目前的想法还仅仅是上面介绍的内容,研究明白了第一阶段,设想还有第二阶段,那就是tomcat的设计思想,它的优点在哪里,还有那些瓶颈和不足,因为目前Resin已经引起越来越多人的关注了,所以要做的事儿真是太多了,大家都自勉吧

我貌似不知道如何引用,回来教教我
我当年看tomcat的时候好像也是6的代码吧,很久之前了,当时就是粗略的看了一遍代码,主要是从架构上看看tomcat如何设计的,看完了发现,太臃肿了,跟很多人看完了一样,只能用学院派来形容,我当时对于pipeline,还有valve的设计还是很着迷的,至今有时候都会拿来使用一下,看完了之后,主要是从架构层面上对于context,pipeline,valve,这种东西有了更进一步的认识,感觉也很粗浅,毕竟没有那么多时间去看,当时开发任务也重,对了,还有其中的jsp页面动态编译的也挺好玩的,总之学了很多的东西,但是忘性也快
digester我也没细看,感觉封装了sax的解析xml的风格,我也没看出他有什么优点,可能代码看上去比较优雅,的确很优雅!
看完了之后对于java的底层东西感觉了解的还是太少了,关于线程之类的,以后还得都研究一下,上班写的,杂乱点,咱们就是交流

2011年09月28日 10:55 "@docsun"的内容
我貌似不知道如何引用,回来教教我
我当年看tomcat的时候好像也是6的代码吧,很久之前了,当时就是粗略的看了一遍代码,主要是从架构上看看tomcat如何设计的,看完了发现,太臃肿了,跟很多人看完了一样,只能用学院派来形容,我当时对于pi ...


谢谢您的回复,看完您的回复,我逐条回复吧。
首先,您说,貌似不知道如何引用?什么意思?我不是太清楚,不过我猜应该是你跟代码的过程中,比如到了
Method method = catalinaDaemon.getClass().getMethod(methodName, paramTypes);
method.invoke(catalinaDaemon, param);
这部分,不知道如何F5跟进里面的代码了吗?
如果是这样的话,那么我说说我跟代码的做法,我改写了Bootstrap类中的init()方法中的如下代码:
// Class startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
Class<?> startupClass = Class.forName("org.apache.catalina.startup.Catalina");
Catalina startupInstance = (Catalina) startupClass.newInstance();

// Set the shared extensions class loader
if (log.isDebugEnabled())
log.debug("Setting startup class properties");

// String methodName = "setParentClassLoader";
// Class paramTypes[] = new Class[1];
// paramTypes[0] = Class.forName("java.lang.ClassLoader");
// Object paramValues[] = new Object[1];
// paramValues[0] = sharedLoader;
// Method method = startupInstance.getClass().getMethod(methodName, paramTypes);
// method.invoke(startupInstance, paramValues);

startupInstance.setParentClassLoader(sharedLoader);
catalinaDaemon = startupInstance;
还有load()方法,直接贴代码了,如下:
private void load(String[] arguments)
throws Exception {

// Call the load() method
// String methodName = "load";
// Object param[];
// Class paramTypes[];
// if (arguments==null || arguments.length==0) {
// paramTypes = null;
// param = null;
// } else {
// paramTypes = new Class[1];
// paramTypes[0] = arguments.getClass();
// param = new Object[1];
// param[0] = arguments;
// }
// Method method =
// catalinaDaemon.getClass().getMethod(methodName, paramTypes);
// if (log.isDebugEnabled())
// log.debug("Calling startup class " + method);
// method.invoke(catalinaDaemon, param);

catalinaDaemon.load();
}
这样的话,你就直接可以从catalinaDaemon.load()跟到Catalina的load()方法了,依次跟下去,就可以粗粗
窥探一下tomcat启动的轨迹了.

第二个问题,您说从架构上看tomcat如何设计的?我想知道怎么看算是从架构上看,以及你
对架构的理解?您说太臃肿了?请问,依据是什么?还有您说得那些tomcat中的组件,设计还是很着迷的,至今有时候都会拿来使用一下。
我想如果您对整体没有一个清晰全面的了解的话,如何真正领悟到这些组件的设计上真正值得我们学习和借鉴的地方?比如
Pipeline在tomcat这个机器中的作用是什么?担当的角色是什么?它的使命是什么?能否可以设计
出一个更好的组件来替代它?等等,反正我现在是非常抵触泛泛而谈,说话办事必须得有相应的逻辑和
理论作为依据和出发点,否则,将无法让人信服。所以我个人认为,研究东西不再多,而在于精。
而且我们必须抱有严谨求实的态度,想想我看完了这个东西之后,真正懂了吗?吃透了几分?不妨试着这样问问自己,
这个东西产生的动机是什么?为啥会有这个东西?它是在什么样的设计思想下产生出来的?毕竟作品是思想
的一种具体体现,试图爬上巨人的肩膀上看世界的话,我们就必须这么要求自己,否则,永远无法真正欣赏
到巨人所看到的风景。不过,非常感谢您的回复,期待咱们能有更多的交流,共同进步,谢谢。

我说的引用是,我不会引用别人的话,呵呵
这个是论坛这个功能我不会用

其实我就是趁着工作之余随便说说而已,每个人对于架构都有自己的体会,我也表达不出来,可能是因为不善于表达,也不会很多术语吧,总之咱们多沟通

2011年09月28日 15:12 "@docsun"的内容
我说的引用是,我不会引用别人的话,呵呵
这个是论坛这个功能我不会用

其实我就是趁着工作之余随便说说而已,每个人对于架构都有自己的体会,我也表达不出来,可能是因为不善于表达,也不会很多术语吧,总之咱们多沟通 ...

谢谢docsun同学的持续关注和回复。其他问题本人不想多说,此处只想就本人对架构的一些粗浅理解与大家交流和探讨。我先稍微阐述一下本人的认识和理解,不当不妥之处,还望大家多多“拍砖”。
架构,就其字面意思理解,应该是搭架子的意思,不难想象,盖房子,需要打地基搭架子吧,开发企业级软件系统,同样需要搭架子,只是搭架子是架构的具体表现,而具体怎么搭好适当的架子,进而保证后续工作高质量地完成,我觉得就应该是架构的真正含义,说白了,其实就是搭架子的思想。说起思想,大家估计就更觉得虚幻了,思想看得见吗?摸得着吗?所以,还是得回到我们这个领域来讨论这个问题。关于架构,我曾经也查了一些资料,试图让自己先有一个理论上比较准确的认识,比如InfoQ中文站办的杂志架构师有一期特刊名叫《架构之美》,相信很多人都看过,没看过的同学也可以留邮箱,我可以直接发给大家,这份电子杂志上对架构讲了很多,不过看了之后,总觉得还是空泛(这个估计是因为自己的架构经验几乎为零的原因),但是书中有一部分我还是决定拿来和大家分享一下,希望大家能有所启发,那就是这份电子杂志说架构师在考虑构建一个系统的时候,一般都会有如下关注点:功能性,即产品会向客户提供哪些功能?可变性,软件将来可能会应对多少方面的改变?性能,产品的运行对资源会有什么样的要求?容量,系统将支撑多少并发用户,并如何安全地为用户保存他们得数据?生态系统,在产品即将的部署环境中,该系统将会与哪些模块进行交互?模块化,即如何将开发任务化简为单独的模块组件?还有可构建性,产品化,安全性,我就不一一叙述了,有兴趣的同学可以详细阅读这本电子杂志。看了这些关注点之后,估计大家对架构的认识就不会再那么模糊了,但是这仅仅是过来人归纳的一些自己做架构的时候的关注点罢了,所以大家完全不必觉得这些关注点就是架构的全部,不过这些关注点确实有助于大家对架构的理解和认识,细心的同学,可能现在就会想,原来做架构,有的时候需要考虑以上那些关注点啊,通过思考,我个人感觉,架构其实就是一种行动的指导思想,它将指挥我们需要做什么?为什么要这么做?其实,我觉得我还是需要说得尽量通俗化一点,举个例子吧,一个产品放哪儿了,它的组成结构是什么样的?它的材质是什么样的?它具有什么样的功能?它是如何实现这些功能的?它的用途在哪里?它的价值如何体现?为啥要制造它?人们制造它的动机是什么?我觉得,这些问题的答案应该就可以囊括我们所讨论的架构的大部分内容吧。一点粗浅的理解,还往高手们别吝啬你们手中的“砖头”,谢谢赐教!

受这里道友的刺激,前天我也下了代码,整合到Eclipse里了.不过我看的是tomcat7.0.22的源码.就是学习下.现在进展和你差不多.但是能拿出来的还真没有啊.持续关注中....

2011年10月12日 18:55 "@zzg16"的内容
受这里道友的刺激,前天我也下了代码,整合到Eclipse里了.不过我看的是tomcat7.0.22的源码.就是学习下.现在进展和你差不多.但是能拿出来的还真没有啊.持续关注中.... ...

谢谢zzg16同学的关注啊,看到有同样研究兴趣的同学加入,我非常高兴,我看到你下载的是最新版本的源码,我也随即下载了一份,想看看6和7有什么不同。初步跑了一遍发现还真是改动不少,我最近在研究6里面的线程池部分,今天跑了一遍7版本,发现tomcat现在也用JDK里面的线程池了,而且启动之后,6一共加主线程也就24个线程,而7版本却已经达到了49个,确实耐人研究啊,大家继续加油吧,最近在对线程池的实现以及使用做深入的学习,希望广大有此研究的同学多多指导,谢谢大家