Tomcat 在架构设计上采用面向组件的方式设计。即整体功能是通过组件的方式拼装完成。另外每个组件都可以被替换以保证灵活性。
我们平时启动 Tomcat 过程是怎么样的?
但是我们在 Eclipse 或 idea 中启动 WEB 项目的时候 也是把 War 包复杂至 webapps 目录解压吗?显然不是,其真正做法是在 Tomcat 程序文件之外创建了一个部署目录,在一般生产环境中也是这么做的 即:Tomcat 程序目录和部署目录分开 。
我们只需要在启动时指定CATALINA_HOME 与 CATALINA_BASE 参数即可实现。
启动参数 | 描述说明 |
---|---|
JAVA_OPTS | jvm 启动参数 , 设置内存 编码等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8 |
JAVA_HOME | 指定jdk 目录,如果未设置从java 环境变量当中去找。 |
CATALINA_HOME | Tomcat 程序根目录 |
CATALINA_BASE | 应用部署目录,默认为$CATALINA_HOME |
CATALINA_OUT | 应用日志输出目录:默认$CATALINA_BASE/log |
CATALINA_TMPDIR | 应用临时目录:默认:$CATALINA_BASE/temp |
- export JAVA_OPTS="-Xms100m -Xmx200m"
- export JAVA_HOME=/root/svr/jdk/
- export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34
- export CATALINA_BASE="`pwd`"
-
- case $1 in
- start)
- $CATALINA_HOME/bin/catalina.sh start
- echo start success!!
- ;;
- stop)
- $CATALINA_HOME/bin/catalina.sh stop
- echo stop success!!
- ;;
- restart)
- $CATALINA_HOME/bin/catalina.sh stop
- echo stop success!!
- sleep 2
- $CATALINA_HOME/bin/catalina.sh start
- echo start success!!
- ;;
- version)
- $CATALINA_HOME/bin/catalina.sh version
- ;;
- configtest)
- $CATALINA_HOME/bin/catalina.sh configtest
- ;;
- esac
- exit 0
-
- <Server>
- <Listener /><!-- 监听器 -->
- <GlobaNamingResources> <!-- 全局资源 -->
- </GlobaNamingResources
- <Service> <!-- 服务 用于 绑定 连接器与 Engine -->
- <Connector 8080/> <!-- 连接器-->
- <Connector 8010 /> <!-- 连接器-->
- <Connector 8030/> <!-- 连接器-->
-
- <Engine> <!-- 执行引擎-->
- <Logger />
- <Realm />
- <host "www.tl.com" appBase=""> <!-- 虚拟主机-->
- <Logger /> <!-- 日志配置-->
- <Context "/luban" path=""/> <!-- 上下文配置-->
- </host>
- </Engine>
- </Service>
- </Server>
-
配置多个 Connector
-
- <Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol"
- connectionTimeout="20000"
- redirectPort="8862"
- URIEncoding="UTF-8"
- useBodyEncodingForURI="true"
- compression="on" compressionMinSize="2048"
- compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript"
- maxThreads="1024" minSpareThreads="200"
- acceptCount="800"
- enableLookups="false"
- />
-
演示配置多个 Host
- <Host name="www.luban.com" appBase="/usr/www/luban"
- unpackWARs="true" autoDeploy="true">
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.luban.com.access_log" suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
- </Host>
-
Context 应用上下文:一个host 下可以配置多个 Context ,每个Context 都有其独立的 classPath。相互隔离,以免造成 ClassPath 冲突。 主要属性:
配置多个 Context
- <Context docBase="hello" path="/h" reloadable="true"/>
-
Valve 阀门:可以理解成 request 的过滤器,具体配置要基于具体的 Valve 接口的子类。以下即为一个访问日志的 Valve。
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="www.luban.com.access_log" suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
-
描述 | |
---|---|
BIO | 阻塞式IO,即Tomcat使用传统的java.io进行操作。该模式下每个请求都会创建一个线程,对性能开销大,不适合高并发场景。优点是稳定,适合连接数目小且固定架构。 |
NIO | 非阻塞式IO,jdk1.4 之后实现的新IO。该模式基于多路复用选择器监测连接状态在通知线程处理,从而达到非阻塞的目的。比传统BIO能更好的支持并发性能。Tomcat 8.0之后默认采用该模式 |
APR | 全称是 Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作。使用需要编译安装APR 库 |
AIO | 异步非阻塞式IO,jdk1.7后之支持 。与nio不同在于不需要多路复用选择器,而是请求处理线程执行完程进行回调调知,已继续执行后续操作。Tomcat 8之后支持。 |
配置 server.xml 文件当中的 修改即可。
默认配置 8.0 protocol=“HTTP/1.1”, 8.0 之前是 BIO 8.0 之后是 NIO
在高并发场景下 BIO 与 NIO 的线程数的变化?
演示数据:
- | 秒提交数 | BIO 执行线程 | NIO 执行线程 |
---|---|---|---|
预测 | 200 | 200 | 50 |
单机实验环境 | 200 | 48 | 37 |
网络生产环境 | 200 | 419 | 23 |
Http11Protocol Http BIO协议解析器
Http11NioProtocol Http Nio协议解析器