深入拆解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
登录|注册

10 | 比较:Jetty架构特点之Handler组件

李号双 2019-06-01
在专栏上一期,我们学习了 Jetty 的整体架构。先来回顾一下,Jetty 就是由多个 Connector(连接器)、多个 Handler(处理器),以及一个线程池组成,整体结构图如下。
上一期我们分析了 Jetty Connector 组件的设计,Connector 会将 Servlet 请求交给 Handler 去处理,那 Handler 又是如何处理请求的呢?
Jetty 的 Handler 在设计上非常有意思,可以说是 Jetty 的灵魂,Jetty 通过 Handler 实现了高度可定制化,那具体是如何实现的呢?我们能从中学到怎样的设计方法呢?接下来,我就来聊聊这些问题。

Handler 是什么

Handler 就是一个接口,它有一堆实现类,Jetty 的 Connector 组件调用这些接口来处理 Servlet 请求,我们先来看看这个接口定义成什么样子。
public interface Handler extends LifeCycle, Destroyable
{
//处理请求的方法
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException;
//每个Handler都关联一个Server组件,被Server管理
public void setServer(Server server);
public Server getServer();
//销毁方法相关的资源
public void destroy();
}
你会看到 Handler 接口的定义非常简洁,主要就是用 handle 方法用来处理请求,跟 Tomcat 容器组件的 service 方法一样,它有 ServletRequest 和 ServletResponse 两个参数。除此之外,这个接口中还有 setServer 和 getServer 方法,因为任何一个 Handler 都需要关联一个 Server 组件,也就是说 Handler 需要被 Server 组件来管理。一般来说 Handler 会加载一些资源到内存,因此通过设置 destroy 方法来销毁。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • why
    - Handler 是一个接口, 有一堆实现类
        - Handler 接口用 handle 方法处理请求, 类似 Tomcat 的 service
        - 有 set/getServer 用于关联一个 Server
        - 用 destroy 销毁释放资源
    - Handler 继承关系
        - Handler→AbstractHandler→AbstractHandlerContainer
        - AbstractHandlerContainer 中有其他 handler 的引用, 可实现链式调用
        - AbstractHandlerContainer 子类有 HandlerWrapper 和 HandlerCollection. HandlerWrapper 包含一个 Handler 引用; HandlerCollection 包含多个 Handler 引用, 存于数组中
        - HandlerWrapper 有两个子类: Server 和 ScopedHandler
            - Server, 是 Handler 的入口, 必须将请求传递给其他的 Handler 处理
            - ScopedHandler 实现具有上下文信息的责任链调用; 有一堆子类来实现 Servlet 规范: ServletHandler; ContextHandler; ContextHandler; ServletContextHandler; WebAppContext
        - HandlerCollection 用于支持多个 Web 应用, 每个 Web 应用对应一个 Handler 入口
            - Server 中有 HandlerCollection, Server 根据 URL 从数组中选择 Handler 处理请求
        - Handler 的类型
            - 协调 Handler: 负责将请求路由到一组 handler, 如 HandlerCollection
            - 过滤器 Handler: 自己会处理请求, 再转发给下一个 Handler, 如 HandlerWrapper 及其子类
            - 内容 Handler: 调用真正 Servlet 处理请求, 响应内容, 如 ServletHandler, 或 ResourceHandler 响应静态资源请求
        - 实现 Servlet 规范
            - ServletHandler, ContextHandler, WebAppContext
            - Jetty 启动 Web 应用分为两步
                - 创建 WebAppContext 并配置 WAR 包和应用路径
                - 将 WebAppContext 添加到 Server, 并启动 Server
            - Servlet 规范有: Context, Servlet, Filter, Listen, Session, Jetty 对应的实现为 ContextHandler, ServletHandler, SessionHandler
                - WebAppContext 是一个 ContextHandler, 并负责管理 ServletHandler 和 SessionHandler
            - ContextHandler 负责创建并初始化 ServletContext 对象, 另外还包含一组 Handler, 处理特定 URL 的请求(ServletHandler)
                - ServletHandler 实现 Servlet, Filter, Listen 的功能; 其依赖 Filter/ServletHandler(Filter 和 Serlvet 的包装类) 以及 Filter/ServletMapping 封装 Filter/Servlet 及其映射的路径
            - SessionHandler 管理 Session
        - WebAppContext 将这些 Handler 构成执行链: Connection→SessionHandler→SecurityHandler→...→SevletHandler→Servlet.
    2019-06-07
    5
  • 夏天
    想学习tomcat架构,大佬有没有推荐的书籍

    作者回复: How tomcat works 还不错

    2019-06-01
    4
  • 秋天
    hadler只算是一层wrapper,真正处理得还是真正处理servlet逻辑的servlet

    作者回复: Handler实现的是Web容器本身的功能,Servlet实现的是具体业务逻辑。

    2019-07-16
    2
  • 易儿易
    老师讲的这篇知识点脉络清晰,看完之后能够明确课程内容,但是考虑到开发使用,我却更迷糊了,web开发要怎样跟Jetty这样的容器相结合呢?我们跑在tomcat上的项目能拿下来直接放到Jetty上吗?感觉Jetty需要在项目中增加很多配置才行,对开发的要求也多……没有用过Jetty

    作者回复: 在Tomcat可以跑的War包可以直接放到Jetty里跑

    2019-07-01
    1
  • east
    1.H和S都能处理请求,
    2.H可以调用S,S不能调用H,
    3.H更多处理通用的处理并且是抽象的,S是处理具体的且比较特定化请求
    2019-06-01
    1
  • jaryoung
    handler 是指挥官?serlvet 真正的执行者
    2019-08-17
  • L.B.Q.Y
    Servlet用于处理业务逻辑,Handler用于路由请求到指定的Servlet上。
    2019-07-30
  • Geek_00d567
    Jetty Server 就是由多个 Connector、多个 Handler,以及一个线程池组成。

    Jetty 的 Handler 设计是它的一大特色,Jetty 本质就是一个 Handler 管理器,Jetty 本身就提供了一些默认 Handler 来实现 Servlet 容器的功能,你也可以定义自己的 Handler 来添加到 Jetty 中,这体现了“微内核 + 插件”的设计思想。

    handler 应该会把请求字节流转换为servlet request
    2019-06-04
  • 空知
    老师问下
    server是一个 handlerWrapper 内部应该只有一个hanlder 可是他内部又维护一个handlerCollection,当请求过来时候 去handlerCollection 里面根据url判断是哪个项目 那定义的那个 单独的hanlder 有啥用?

    作者回复: 单独的Handler的handle方法也会处理一些自己的逻辑,再调用下一个Handler的handle方法

    2019-06-03
  • -W.LI-
    Handler实现了 Servlet 规范中的 Servlet、Filter 和 Listener 功能中的一个或者多个。handler可以持有别的handle,servlet不持有别的servlet。servlet的调用关系通过servlet容器来控制。handler的调用关系通过wabappcontext控制。老师好!
    Tomcat通过连接器来区分协议和端口号,host区分虚拟主机(二级域名)。jetty里面是怎么绑定的呢?jetty的连接器和容器没有对应关系,所有的容器都可以处理各种的协议么?mapping具体又是在哪里起作用的呢?是handlecollection通过mapping找到对应的wabappcontext吗?

    作者回复: 可以给一个wabappcontext配置多个虚拟主机地址,在Jetty中,请求进来后,可以在所有的wabappcontext上进行匹配,首先是虚拟主机名,然后是访问路径。

    2019-06-03
  • -W.LI-
    老师有jetty源码下载地址链接么?git的下不动😂

    作者回复: 源码github上都有的,但是我建议用内嵌式的方式跑Jetty,体会一下SpringBoot是怎么用Jetty的,可以用IDE把源码下载下来,加断点调试。
    https://github.com/jetty-project/embedded-jetty-jsp

    2019-06-02
收起评论
11
返回
顶部