文章目录
- 一、Tomcat设计思路总结
- 1、Tomcat整体架构
- 2、Tomcat设计思路
- 二、Tomcat源码设计精髓
- 三、拓展:SpringBoot整合Tomcat源码分析
- 四、拓展:SpringBoot整合Undertow实战
- 1、Undertow概述
- 2、SpringBoot集成Undertow
- 2.1、引入依赖
- 2.2、application.properties配置
一、Tomcat设计思路总结
1、Tomcat整体架构
2、Tomcat设计思路
二、Tomcat源码设计精髓
思考:Tomcat使用了哪些设计模式?
思考:Tomcat线程池和传统JDK线程池有什么区别? (自定义线程池的需求可以参考tomcat的线程池)
Tomcat线程池默认实现StandardThreadExecutor。Tomcat 线程池和 Java 原生线程池的区别:
-
自定义了拒绝策略,Tomcat 在线程总数达到最大数时,不是立即执行拒绝策略,而是再尝试向任务队列添加任务,添加失败后再执行拒绝策略。
-
TaskQueue 重写了 LinkedBlockingQueue 的 offer 方法。只有当前线程数大于核心线程数、小于最大线程数,并且已提交的任务个数大于当前线程数时,也就是说线程不够用了,但是线程数又没达到极限,才会去创建新的线程。目的:在任务队列的长度无限制的情况下,让线程池有机会创建新的线程。
三、拓展:SpringBoot整合Tomcat源码分析
四、拓展:SpringBoot整合Undertow实战
1、Undertow概述
Undertow作为SpringBoot默认集成的三大容器之一(Tomcat、Jetty、Undertow);首先它是Red Hat公司旗下的开源产品, 由Java语言开发,是一款灵活的高性能Web服务器;不仅支持阻塞IO还支持非阻塞IO。由于Undertow通过java语言开发,即在java项目中使用可直接嵌入。Undertow在性能使用方面优于Jetty、Tomcat。
官网: https://undertow.io/
特性:
-
红帽开源产品,目前是 WildFly(JBoss AS)的默认 Web 容器。
-
在不需要非常复杂的配置情况下,可以展现出很高的性能以及稳定性。
-
非常轻量,只需通过 API 即可快速搭建 Web 服务器。
-
底层基于 XNIO,和 Netty 设计类似,使用 NIO 作为网络交互的方式,并且使用直接内存作为网络传输的 buffer,减少业务的 GC。
-
由于基于这种异步框架,所以配置也是交由链式Handler配置和处理请求,可以最小化按需加载模块,无须加载多余功能
-
支持 Servlet 4.0 以及向下兼容,支持 WebSocket
2、SpringBoot集成Undertow
Spring boot 默认使用 Tomcat 内嵌容器 ,依赖于 spring-boot-starter-web 。我们只需要排除 Tomcat 依赖,引用Undertow 就可以了
2.1、引入依赖
<!--添加web依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--移除Tomcat依赖--><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<!-- 添加Undertow依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
2.2、application.properties配置
# Undertow 日志存放目录
server.undertow.accesslog.dir=
# 是否启动日志
server.undertow.accesslog.enabled=true
# 日志格式
server.undertow.accesslog.pattern=common
# 日志文件名前缀
server.undertow.accesslog.prefix=access_log
# 日志文件名后缀
server.undertow.accesslog.suffix=log
# HTTP POST请求最大的大小
server.undertow.max-http-post-size=0
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
server.undertow.io-threads=4
# 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
server.undertow.worker-threads=20
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分
server.undertow.buffer-size=1024
# 是否分配的直接内存
server.undertow.direct-buffers=true
当你看到 Undertow started on port 8080 (http) 的行输出时,说明此时正在使用的是 Undertow 容器,而非 Tomcat容器。