web概念
- 软件架构
a. C/S:客户端、服务器端架构,如微信,QQ
b. B/S:浏览器、服务器端架构,如淘宝等门户网站 - 资源类别
a. 静态资源:所有用户访问得到的结果都一样,称为静态资源,可以直接被浏览器解析,如html、css、jpg等
b. 动态资源:每个用户访问得到的结果可能不一致,动态资源被访问后需要先转换为静态资源,再返回给浏览器,由浏览器解析,如:jsp、servlet等 - 网络三要素
a. ip:电子设备在网络的唯一标识
b. 端口:应用程序在计算机中的唯一标识
c. 传输协议:规定数据传输的规则
tomcat启动原理
- 加载tomcat配置文件,初始化容器组件,监听对应的端口号,准备接受客户端请求
启动流程
- 启动tomcat,执行bin/startup.bat脚本,调用catalina.bat脚本
- 执行调用BootStrap中main方法,调用init方法,通过反射创建Catalina对象及初始化类加载器
- main方法中调用load方法,会调用Catalina的load方法
- Catalina的load方法会进行Server中的一系列主键的初始化工作,并构造Digester对象,负责解析XML
- 加载tomcat配置文件,初始化容器组件,监听对应的端口号,准备接受客户端请求
启动源码
生命周期方法(Lifecycle)
- 所有组件都存在初始化、启动、停止等生命周期方法,tomcat基于生命周期管理抽象成Lifecycle接口
- 组件Server、Service、Container、Executor、Connector都实现Lifecycle,通过Lifecycle统一管理个组件的生命周期接口
○ init:初始化组件接口
○ start:启动组件接口
○ stop:停止组件接口
○ destroy:销毁组件接口
组件默认实现
源码跟踪
startup.bat 启动文件
:okHome
//调用catalina.bat
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
//执行
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
catalina.bat (bootstrap.jar)
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
启动入口 Bootstrap.main
org.apache.catalina.startup.Bootstrap#main
public static void main(String args[]) {
synchronized (daemonLock) {
//执行init方法初始化,创建Catalina对象
bootstrap.init();
//...
String command = "start";
//...
if (command.equals("startd")) {
args[args.length - 1] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[args.length - 1] = "stop";
daemon.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
if (null == daemon.getServer()) {
System.exit(1);
}
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else if (command.equals("configtest")) {
daemon.load(args);
if (null == daemon.getServer()) {
System.exit(1);
}
System.exit(0);
}
}
}
Bootstrap初始化组件
解析配置xml :org.apache.catalina.startup.Catalina#parseServerXml
初始化Bootstrap – bootstrap.init
- 初始化ClassLoader
- 通过反射创建Catalina(反射解耦)
public void init() throws Exception {
//初始化ClassLoader
initClassLoaders();
Thread.currentThread().setContextClassLoader(catalinaLoader);
SecurityClassLoad.securityClassLoad(catalinaLoader);
//使用自定义ClassLoader类加载器 反射创建Catalina
Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.getConstructor().newInstance();
String methodName = "setParentClassLoader";
Class<?> paramTypes[] = new Class[1];
paramTypes[0] = Class.forName("java.lang.ClassLoader");
Object paramValues[