tomcat基本流程
-
tomcat在启动时将webapps下的每个项目中的web.xml读取,获取相关信息。tomcat只关心Servlet 程序、Filter 过滤器、Listener 监听器,不关心其他类。
-
tomcat接收到请求后会将请求报文转换成一个httpServletRequest对象,包含请求所有信息
-
tomcat同时创建了一个httpServletResponse对象,用于承装要响应给客户端的信息,后面该对象会被转换成响应报文
-
tomcat根据请求资源路径找到对应的servlet,将servlet实例化,调用service方法,同时将HttpServletRequest和HttpServletResponse对象传入
手写tomcat大致步骤:
-
建立一个接收TCP请求的服务端ServerSocket。
-
-
如何处理连接?处理阻塞?
-
processSocket
-
-
如何处理多个请求?while()
-
如何处理串行问题? 线程池
-
ExecutorService
-
-
-
如何处理连接
-
通过具体的连接socket对象获取数据 socket.getInputStream()
-
输出成字节可以看到获取的字节
-
-
解析字节流,
-
了解HTTP协议的格式
-
按照格式去解析http协议、请求行、头、体
-
-
根据解析的内容,构造得到request对象
-
request属性:method构造方法、url、protocal协议版本
-
-
按servlet规范实现request和response
-
实现HttpServletRequest、HttpServletReponse接口
-
-
新建Servlet类,继承HttpServlet
-
socket.getOutputStream().write()
-
tomcat结构和配置
-
结构图,
-
配置文件解析:
-
Server:顶层元素,是整个配置文件的根元素,即服务器,每个 tomcat 程序启动后,就是一个 server。
-
className: 使用的 java 类名
-
address:服务器等待接收 shutdown 命令的地址,默认 localhost
-
port: 接收 shutdown 命令的端口,设置为 - 1 为禁用关闭端口,也就是你不能通过这种方式来关闭了,这样就会影响你使用脚本 (catalina.sh 或者是 shutdown.sh) 来 stop 了,默认绑定 8005 端口
-
shutdown: 指定 shutdown 命令的别名,默认值 SHUTDOWN
-
-
Listener: 监听器,不允许内嵌其他组件;listener中定义的组件可以在某事件发生时执行相应的操作;监听器可以在Server、Engine、Host或Context中,如下代码定义的5个监听器都是在Server中。
-
VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器。
-
AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
-
JreMemoryLeakPreventionListener:与类加载器导致的内存泄露有关。
-
GlobalResourcesLifecycleListener:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。
-
ThreadLocalLeakPreventionListener:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。
-
-
GlobalNamingResources: 元素定义了全局资源,如下配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。
-
Service:Tomcat服务器提供的服务,通常包含一个或多个Connector(连接器),但只能有一个引擎engine。默认是
-
className: 要使用的 java 类名,未指定的话就使用标准的实现
-
name: 显示的名称
-
tomcat默认的一个服务是Catalina
-
-
Connector:是Tomcat服务器与外部应用程序或客户端之间的连接,常见的Connector类型包括HTTP、HTTPS、AJP等。
-
port:指定Connector监听的端口号,用于监听来自客户端的请求。
-
protocol:连接器使用的协议,指定Connector要使用的协议类型,常见的有HTTP/1.1、HTTP/2、AJP/1.3等。
-
connectionTimeout:指定超时的时间数(以毫秒为单位),即在指定时间内未收到客户端请求,则连接被关闭。
-
redirectPort:指定重定向端口,即在使用HTTPS时,自动将HTTP请求重定向到HTTPS。
-
maxParameterCount:最大可以创建的处理请求的线程数。
-
-
Engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。
-
defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值一样。
-
-
host:在Tomcat中,一个物理服务器可以部署多个虚拟主机,每个虚拟主机拥有自己的域名和独立的配置,这些虚拟主机通过Host元素来实现。
-
name:虚拟主机的名称,可以是域名和ip
-
appBase:指定该虚拟主机的Web应用程序的基础目录,Web应用程序在该目录下部署。
-
unpackWARs:是否在部署Web应用程序时解压WAR文件,可以提高Web应用程序的访问速度。
-
autoDeploy:是否自动部署新的Web应用程序,如果设置为true,则Tomcat会自动检测appBase目录下的新的Web应用程序,并进行自动部署。
-
-
Context:一个Context就是一个应用。
-
Context:表示一个web应用程序,通过为war文件。
-
docBase:表示Web应用程序的根目录,即Web应用程序的发布目录。应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
-
path:表示Web应用程序的上下文路径,即访问该Web应用程序的URL路径。
-
reloadable:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序。
-
crossContext:用于指定不同的Web应用程序之间是否可以共享ServletContext对象。如果crossContext被设置为true,则表示允许跨上下文共享ServletContext对象,否则不允许。
-
-
Valve:通过提供不同类型的阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve),实现对Tomcat服务器的访问控制、流量控制、日志记录等功能。
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
-