Tomcat

目录结构

屏幕截图 2020-08-26 141912

部署方式

JAVA WEB项目目录结构

架构

整体设计:

屏幕截图 2020-08-26 143148

Container设计:

屏幕截图 2020-08-26 144406

Connector设计:

屏幕截图 2020-08-26 144755

Executor:

共享线程池由Service维护

外部依赖 Bootstrap和Catalina:

Bootstrap启动Cataina Catalina启动Server 实现了Bootstrap 与 Server进行解耦

启动流程

屏幕截图 2020-08-26 145611

请求处理

屏幕截图 2020-08-26 145856

总体流程:

Catalina请求处理:

屏幕截图 2020-08-27 145924

类加载器

屏幕截图 2020-08-26 150126

通过每个app使用自己的类加载器来达到:

对于Web 应用类加载器,它的加载顺序:

Catalina

Server 创建

Web应用启动流程

屏幕截图 2020-08-26 153133

StandardHost:

HostConfig:

StandardContext:

应用初始化及启动

ContextConfig:

StandardWrapper:

Context的命名与请求路径映射

屏幕截图 2020-08-26 160757

Catalina 自带的 Servlet

Coyote

支持的传输协议:

支持的IO方案:

HTTP 配置:

<!-- server.xml -->
<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<!-- 使用NIO方式处理HTTP1.1 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
<!-- 
  maxThreads:指定Connector创建请求处理线程的最大数
  maxSpareThreads:允许空闲线程的最大数
  minSpareThreads
  tcpNoDelay:禁止TCP通过批量发送数据来提高网络利用率
  maxKeepAliveRequest: 最大keepalive的连接数
  socketBuffer
  enableLookups:是否开启request.getRemoteHost() DNS查询
 -->

概念

请求流程

屏幕截图 2020-08-27 152428

AJP

<!-- server.xml -->
<Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />

AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过 TCP连接 和 SERVLET容器连接

包结构:

屏幕截图 2020-08-27 154533

有效载荷的前一个字节代表类型

屏幕截图 2020-08-27 155233

请求处理:

屏幕截图 2020-08-27 155429

Jasper

使用单独的类加载器

编译方式

运行时编译:

屏幕截图 2020-09-03 144855

编译结果:

预编译:

jspc

编译原理

// 继承该类
class index_jsp extends HttpJspBase
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static Map<String, Long> _jspx_dependants; // 依赖的外部资源
private static final Set<String> _jspx_imports_packages = new HashSet(); // 导入的包
private static final Set<String> _jspx_imports_classes; // 导入的类

_jspService 处理请求:

屏幕截图 2020-09-03 152717

配置管理

JVM配置

:: JVM启动参数
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"

系统属性:略

服务器配置

catalina.properties: 容器启动阶段的配置

server.xml: 服务器核心配置

Web 应用配置

内置的 Filter

Tomcat 管理

/host-manager/html

集群

屏幕截图 2020-09-04 111658

Tomcat 本身就不适合配置集群 一种通用的解决方案是 接入层为 Nginx

Nginx 对后端的Tomcat进行负载均衡

Tomcat上的Web应用最好是设计成无状态的 如果仍然需要保持会话 最好使用一台独立的服务器来存储会话 比如 Redis

而不要使用Tomcat的会话同步功能

安全

安装部署:下载安全 移除自带的几个Web应用

server.xml:

应用安全

传输安全(SSL)

JAVA安全策略

优化

JVM 优化

Tomcat 配置优化

server.xml:

网络传输优化:

JSP页面配置(web.xml):

继承 web 服务器:

应用优化

附加功能