深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?

李号双 2019-07-13
为了方便开发和部署,Spring Boot 在内部启动了一个嵌入式的 Web 容器。我们知道 Tomcat 和 Jetty 是组件化的设计,要启动 Tomcat 或者 Jetty 其实就是启动这些组件。在 Tomcat 独立部署的模式下,我们通过 startup 脚本来启动 Tomcat,Tomcat 中的 Bootstrap 和 Catalina 会负责初始化类加载器,并解析server.xml和启动这些组件。
在内嵌式的模式下,Bootstrap 和 Catalina 的工作就由 Spring Boot 来做了,Spring Boot 调用了 Tomcat 和 Jetty 的 API 来启动这些组件。那 Spring Boot 具体是怎么做的呢?而作为程序员,我们如何向 Spring Boot 中的 Tomcat 注册 Servlet 或者 Filter 呢?我们又如何定制内嵌式的 Tomcat?今天我们就来聊聊这些话题。

Spring Boot 中 Web 容器相关的接口

既然要支持多种 Web 容器,Spring Boot 对内嵌式 Web 容器进行了抽象,定义了 WebServer 接口:
public interface WebServer {
void start() throws WebServerException;
void stop() throws WebServerException;
int getPort();
}
各种 Web 容器比如 Tomcat 和 Jetty 需要去实现这个接口。
Spring Boot 还定义了一个工厂 ServletWebServerFactory 来创建 Web 容器,返回的对象就是上面提到的 WebServer。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • 刘冬
    和"飞翔"同问: 有@RestController,为什么还要自己去注册Servlet给Tomcat?
    我感觉老师很善于将负责的问题、长的逻辑链讲的简洁清晰,还请老师帮忙详细说明一下。
    谢谢!

    作者回复: 可能有些场景需要注册你自己写的一个Servlet提供辅助功能,与主程序分开

    2019-07-13
    1
    4
  • peter
    "这段代码实现的方法返回一个 ServletRegistrationBean,并将它当作Bean 注册到 Spring 中", 这句话中“注册到Spring中” 是不是错的? 怎么会注册到Spring中? 应该是注册到tomcat servlet容器中吧。

    作者回复: ServletRegisterBean本身是个Bean,由Spring管理,Spring会把这种类型的Bean收集起来,根据Bean里定义向Tomcat注册Servlet。

    2019-07-18
    3
  • 飞翔
    老师 sprongboot 不注册servlet 给tomcat 直接用@controller 就能实现servlet功能是咋回事呀

    作者回复: springboot默认给我们注册了DispatcherSetvlet。

    2019-07-13
    3
  • 慎独
    老师讲的很棒
    2019-12-12
  • 肖臧
    Spring boot启动Tomcat的源码里面把protocal写死了,我想把SIP相关的支持挪进来,该从哪里入手呢。
    @Override
    public WebServer getWebServer(ServletContextInitializer... initializers) {
    Tomcat tomcat = new Tomcat();
    File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");
    tomcat.setBaseDir(baseDir.getAbsolutePath());
    Connector connector = new Connector(this.protocol);
    tomcat.getService().addConnector(connector);
    customizeConnector(connector);
    tomcat.setConnector(connector);
    tomcat.getHost().setAutoDeploy(false);
    configureEngine(tomcat.getEngine());
    for (Connector additionalConnector : this.additionalTomcatConnectors) {
    tomcat.getService().addConnector(additionalConnector);
    }
    prepareContext(tomcat.getHost(), initializers);
    return getTomcatWebServer(tomcat);
    }
    2019-08-23
  • 蒙开强
    老师,你好,如果我不想使用内嵌的Tomcat,想用自己装的Tomcat,那需要怎么做呢
    2019-08-15
  • brianway
    springboot 1.0版本如何定制web容器呢?
    2019-08-15
  • Royal
    您好,想请教下jetty的NetworkTrafficListener.Adapter机制,有什么博客可以推荐吗?谢谢

    作者回复: Jetty的资料比较少,我一般是看官网和源码

    2019-07-16
  • 新世界
    servletContextInitializer实现该接口被spring管理,而不是被servletcontainer管理,是这个意思吗?

    作者回复: 对的

    2019-07-16
  • 飞翔
    老师 在digester 类里边的createStartDigester,方法,把enginer,host,context都实例化了,那wrapper是在哪里实例化的呢
    2019-07-16
  • despacito
    老师,springboot 中 getWebServer方法的实现类不仅有tomcat,还有其他web容器,比如jetty,那为什么我们在运行启动类的时候默认都是用的tomcat容器,如果我运行启动类的时候想用jetty作为应用容器,应该怎么做?

    作者回复: 在pom文件中去掉对Tomcat的依赖,加入对jetty的依赖:

      <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>

        </dependencies>

    2019-07-13
    1
  • 大漠落木
    @FunctionalInterface
    org.springframework.boot.web.servlet.ServletContextInitializer
    This interface is primarily designed to allow ServletContextInitializers to bemanaged by Spring and not the Servlet container.
    javax.servlet.ServletContainerInitializer
    ServletContainerInitializers (SCIs) are registered via an entry in the file META-INF/services/javax.servlet.ServletContainerInitializer that must beincluded in the JAR file that contains the SCI implementation.
    2019-07-13
  • nightmare
    感觉还是要跟着操作一下才能懂了
    2019-07-13
收起评论
13
返回
顶部