好几个月没写博客了,一是在筹备转型事宜,二是一直在研究tomcat,现在总算有一些眉目了。现在将自己这几个月的研究成果给各位看官奉上,希望大家喜欢。
本次源码分析预计分为五大专题
第一部分是Tomcat入门篇(组件介绍,启动流程分析)
第二部分是手写tomcat实现。
第三部分是Tomcat的设计模式总结
第四部分是源码深入探究,
第五部分是Tomcat的优化专题。
很多人说看不懂源码,不懂方式方法。博主也是小白,但是源码看的比较多,这次分析以博主的第一人称视角来分析,语言朴实易懂,不管观众老爷是否阅读过Tomcat源码,以一个小白的角度来一步步分析源码的过程,想必会很有趣的!一定不要错过这顿丰盛的大餐哦。下面我就准备上菜啦,翠花,上酸菜!
源码分析网上一搜一大把,但是看起来感觉质量高的比较少,含糊其辞,千篇一律的居多。源码就是要细看,要精读才会对自己有实质性的帮助。但是看起来要细心才行。不知道这种风格大家会不会喜欢。以后想做一个源码分析的公众号,就用这种风格。不知道可行否?请大家看过后留下些意见。
题头:Tomcat 9.0概述:tomcat9.0版本已经取消了bio的实现,默认采用nio的实现方式。
而且从性能上来看,不要小瞧tomcat,其实无论是Jetty,webLogic这种,还是最近大热的netty这些服务器。每个服务器都有各自适应的场景,在高并发条件下,也不见得tomcat的性能就比netty弱。服务器的选型这种问题不能一概而论,和内存,cpu,业务场景都有很大关系。netty是基于tcp协议的,tomcat是基于http协议的,如果对网络协议不熟悉的话,不建议用netty,网络协议的解析不是一个简单的事。
一 : Tomcat开篇之 Tomcat基本组件介绍
本系列所有源码解析基于Tomcat 9.0.12版本。
Tomcat的组件大体结构如下

图片来源于百度图片
整个Tomcat包装在Server内,具体来说几大重要的组件分别是
1.Service: 一个Server可以有多个Service,Service包裹了整个逻辑组件。
2.Connector:简单来说Connector就是负责接收客户端的request,然后在tomcat处理过后再将请求发送出去的桥梁。
3.Engine:一个Service里面只有一个engine。字面理解是引擎,源码注释中给出的解释是负责处理来自Service中的Connector的所有请求。其实还有一个作用就是将请求发送出去。
4.Host:每一个host就是一个主机。可以绑定不同的端口。每一个host里面有多个context上下文。
5.Context:每一个context对应一个上下文,里面有多个web服务,每一个web服务里面有多个servlet。其中Resource和Global Naming Resources一样,只不过global是全局的,所有web项目都可以共用。而Resource对应的是一个web项目。Resources定义了资源之后需要一个Resources link来指向对应的Resource
其实简单来说,上面可以分为两部分,connector和container,container包含了engine,host,context。每个组件都有一个Standart开头的标准实现类。上面这些组件的初始化过程完美诠释了什么叫模版设计模式。
下面是其他部分的组件解释
5.Listener: 负责监听前面说的四大组件。上面说的四个组件对应的Config类分别实现了LifecycleListener接口。来实现监听功能。这种设计模式体现了设计模式中的观察者设计模式。(后续文章会单独介绍tomcat的设计模式)

6. Global Naming Resources: 这个是和JNDI配和使用。
那么首先需要了解JNDI,JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 ----转自百度百科
说白了啊,其实就是提供了一个map,key是名称,value就是对象。我们可以在应用中直接通过name来拿对象,而Global Naming Resources的作用,就是可以在xml文件中配置一个全局的资源,比如我们经常配置的数据源。可以配置在xml中。我们默认的server.xml文件里面就有一个配置。

我们可以直接从java代码里的MemoryUserDatabaseFactory这个接口拿对应的实例。这个例子最终指向tomcat-users.xml文件,负责管理用户授权。举个例子,如果碰到需要将数据库的数据源这些配置在tomcat里面的时候,就可以用这种配置方式。
7. 那些个小箭头,里面写着value的那个大家也注意看一下,这个也很重要,在Tomcat进行逻辑处理的时候,在每一个组件里面是通过Pipeline(管道)来进行处理的。这里大家可能不理解,大家应该都写过filter吧,每一个filter写完之后有一个doFilter(request,response)的方法,意思就是交给下一个过滤器。这里意思是一样的,就是这个小组件处理完了交给下一个小组件,全部处理完了才交给下一级。这里体现出的是设计模式中的责任链模式。

图片转自 https://www.cnblogs.com/coldridgeValley/p/6606271.html
8.Realm:realm组件顾名思义,其实就是授权,每个Standard标准实现类里面都有一个getRealm方法。
9.Servlet:我觉得这个位置写成wrapper更合适,这个地方就是每个servlet最后都包装成wrapper,然后在StandardContext的loadOnStartUp方法初始化的。参数是Wrapper类
10.Cluster将消息通知给集群中的其他项目。
11.manager这个组件的设计是为了方便远程管理tomcat,比如重启,升级等。不用进入到服务器就可以直接操作,前提是必须先给用户授权。下面是tomcat的manager的页面。

12 Loader是tomcat的自定义类加载器,这个是一个重点,在部署到tomcat的每个项目里面。每个项目之间jar包必须要隔离,但是tomcat自己的jar包又要被所有的项目共享,这时候tomcat必须要自定义类加载器也就是classLoader来实现自己的功能。所以要看懂Tomcat源码, 首先要理解他的类加载器。
下一篇会介绍类加载器的基本使用以及Tomcat的类加载器介绍。

本文详细解析Tomcat9.0源码,涵盖组件介绍、启动流程、设计模式及优化策略,适合初学者及进阶读者,旨在帮助理解Tomcat内部工作原理。

1万+

被折叠的 条评论
为什么被折叠?



