自学内容网 自学内容网

二十七、Tomcat专题总结与拓展

一、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容器。

在这里插入图片描述


原文地址:https://blog.csdn.net/qq_41378597/article/details/144357053

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!