- Java208
- 数据库101
- 框架83
- 设计78
- Spring77
- 分布式74
- java62
- JavaSE57
- 工具37
- 大数据33
- 架构31
- 分布式通信31
- 笔记30
- 设计模式27
- 搜索引擎数据库25
- Spring核心24
- 综合22
- 软件20
- 关系型数据库20
- Spring综合20
- 网络19
- KV数据库19
- Redis18
- MQ17
- 数据结构和算法16
- Elasticsearch16
- JavaEE15
- 其他15
- 基础特性15
- 列式数据库14
- 操作系统13
- 分布式协同13
- mysql12
- 文档数据库12
- 分布式理论12
- HBase12
- JVM11
- MongoDB11
- Linux11
- 并发10
- Mysql10
- Spring数据10
- 中间件9
- flink9
- 构建9
- Kafka9
- 工作8
- DevOps8
- 编程8
- 网络综合8
- hive8
- IO8
- 服务器8
- 安全8
- Elastic8
- 解决方案8
- RPC8
- SpringWeb8
- 重构7
- 分布式存储7
- hadoop7
- Maven7
- 树6
- 网络协议6
- 分布式调度6
- Python6
- 高级特性6
- 容器6
- JavaWeb6
- 监控诊断6
- 分布式协同综合6
- ZooKeeper6
- 效能6
- Tomcat6
- dependence5
- 测试5
- 缓存5
- 微服务5
- Spring集成5
- network4
- vuepress4
- 数据库中间件4
- UML4
- 线性表4
- 网络技术4
- 编程范式4
- IDE4
- 模板引擎4
- hdfs4
- SpringIO4
- Spring其他4
- RPC综合4
- RocketMQ4
- 软件工程3
- redis3
- 数据库综合3
- 分布式综合3
- 编程语言3
- ORM3
- 规范3
- Git3
- minio3
- linux2
- AI2
- windows2
- DDD2
- 操作系统应用2
- 监控2
- JavaBean2
- 流量控制2
- Shardingsphere2
- 方法论2
- Dubbo2
- MQ综合2
- idea1
- 力量训练1
- CDN1
- cloudflare1
- 使用指南1
- markdown1
- 分布式高可用1
- spark1
- 人工智能1
- python1
- bug1
- 数据库``1
- 命令1
- Spring安全1
- io1
- 其他MQ1
Jetty 简介
jetty 是什么?
jetty 是轻量级的 web 服务器和 servlet 引擎。
它的最大特点是:可以很方便的作为嵌入式服务器。
它是 eclipse 的一个开源项目。不用怀疑,就是你常用的那个 eclipse。
它是使用 Java 开发的,所以天然对 Java 支持良好。
🎁 版本说明
当前最新版本:Tomcat 8.5.24
环境要求:JDK7+
1. Tomcat 简介
1.1. Tomcat 是什么
Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为 Web 服务器的一些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。
由于 Tomcat 本身也内含了一个 HTTP 服务器,它也可以被视作一个单独的 Web 服务器。但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是一个用 C 语言实现的 HTTP Web 服务器;这两个 HTTP web server 不是捆绑在一起的。Tomcat 包含了一个配置管理工具,也可以通过编辑 XML 格式的配置文件来进行配置。
1. NioEndpoint 组件
Tomcat 的 NioEndPoint 组件利用 Java NIO 实现了 I/O 多路复用模型。

NioEndPoint 子组件功能简介:
LimitLatch
是连接控制器,负责控制最大连接数。NIO 模式下默认是 10000,达到这个阈值后,连接请求被拒绝。Acceptor
负责监听连接请求。Acceptor
运行在一个单独的线程里,它在一个死循环里调用 accept 方法来接收新连接,一旦有新的连接请求到来,accept 方法返回一个Channel
对象,接着把Channel
对象交给Poller
去处理。Poller
的本质是一个Selector
,也运行在单独线程里。Poller
内部维护一个Channel
数组,它在一个死循环里不断检测Channel
的数据就绪状态,一旦有Channel
可读,就生成一个SocketProcessor
任务对象扔给Executor
去处理。Executor
就是线程池,负责运行SocketProcessor
任务类,SocketProcessor
的 run 方法会调用Http11Processor
来读取和解析请求数据。我们知道,Http11Processor
是应用层协议的封装,它会调用容器获得响应,再把响应通过Channel
写出。
Tomcat 实现热部署和热加载
- 热加载的实现方式是 Web 容器启动一个后台线程,定期检测类文件的变化,如果有变化,就重新加载类,在这个过程中不会清空 Session ,一般用在开发环境。
- 热部署原理类似,也是由后台线程定时检测 Web 应用的变化,但它会重新加载整个 Web 应用。这种方式会清空 Session,比热加载更加干净、彻底,一般用在生产环境。
Tomcat 通过开启后台线程,使得各个层次的容器组件都有机会完成一些周期性任务。Tomcat 是基于 ScheduledThreadPoolExecutor 实现周期性任务的:
Tomcat 启动优化
如果 Tomcat 启动比较慢,可以考虑一些优化点
清理 Tomcat
- 清理不必要的 Web 应用:首先我们要做的是删除掉 webapps 文件夹下不需要的工程,一般是 host-manager、example、doc 等这些默认的工程,可能还有以前添加的但现在用不着的工程,最好把这些全都删除掉。
- 清理 XML 配置文件:Tomcat 在启动时会解析所有的 XML 配置文件,解析 XML 较为耗时,所以应该尽量保持配置文件的简洁。
- 清理 JAR 文件:JVM 的类加载器在加载类时,需要查找每一个 JAR 文件,去找到所需要的类。如果删除了不需要的 JAR 文件,查找的速度就会快一些。这里请注意:Web 应用中的 lib 目录下不应该出现 Servlet API 或者 Tomcat 自身的 JAR,这些 JAR 由 Tomcat 负责提供。
- 清理其他文件:及时清理日志,删除 logs 文件夹下不需要的日志文件。同样还有 work 文件夹下的 catalina 文件夹,它其实是 Tomcat 把 JSP 转换为 Class 文件的工作目录。有时候我们也许会遇到修改了代码,重启了 Tomcat,但是仍没效果,这时候便可以删除掉这个文件夹,Tomcat 下次启动的时候会重新生成。
Tomcat 和 Jetty
Web 容器 Tomcat 或 Jetty,作为重要的系统中间件,连接着浏览器和你的 Web 应用,并且支撑着 Web 程序的运行,可以说,弄懂了 Tomcat 和 Jetty 的原理,Java Web 开发对你来说就毫无秘密可言。
Web 容器
早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。
随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序。