资讯专栏INFORMATION COLUMN

分布式 - Jetty架构

libin19890520 / 1972人阅读

摘要:实现为,即模式上一个依赖于下一个的调用,比如常见的就是这种模式。启动实例化和设置运行时处理流程通常会实例化一个,注意的构造方法最终会调用依次将构成责任链因为这个连同都是类型。内部所有等执行即。

Connectors

For each accepted TCP connection, the Connector asks a ConnectionFactory to create a Connection object that handles the network traffic on that TCP connection, parsing and generating bytes for a specific protocol.

比如:a ServerConnector configured with three factories: ProxyConnectionFactory, SslConnectionFactory and HttpConnectionFactory. Such connector will be able to handle PROXY protocol bytes coming from a load balancer such as HAProxy (with the ProxyConnectionFactory), then handle TLS bytes (with SslConnectionFactory) and therefore decrypting/encrypting the bytes from/to a remote client, and finally handling HTTP/1.1 bytes (with HttpConnectionFactory).

可以自己自定义ConnectionFactory实现来处理自定义的协议。

Handlers
// org.eclipse.jetty.server.Handler的方法:
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException;

Handlers有两种模型:

Sequential handlers,即handlers依赖定义的顺序,而上一个handler不依赖于下一个handler的调用。实现为org.eclipse.jetty.server.handler.HandlerCollection

Nested handlers,即 before/invokeNext/after 模式(上一个handler依赖于下一个handler的调用),比如常见的FilterChain就是这种模式。实现为org.eclipse.jetty.server.handler.HandlerWrapper

ServletHandler、ServletContextHandler

最基层的handler,常见的就是spring的DispacherServlet + 一些Filter。ServletHandler会被 ServletContextHandler 所持有。ServletContextHandler与ServletHandler是一对一的,逻辑上就是 web application context ,即SessionHandler、SecurityHandler、ServletHandler、GzipHandler的组合,常见的就是web.xml。

Server启动

new Server(int port) -> 实例化QueuedThreadPool和ServerConnector

Server#setHandler 设置运行时处理流程:
通常会实例化一个ServletContextHandler,注意ServletContextHandler的构造方法最终会调用ServletContextHandler#relinkHandlers
依次将SessionHandler、SecurityHandler、GzipHandler、ServletHandler构成责任链(因为这4个handler连同ServletContextHandler都是HandlerWrapper
类型)。

Server#start即AbstractLifeCycle#start -> Server#doStart。以下步骤是Server#doStart

设置ErrorHandler

ShutdownThread通过Runtime.getRuntime().addShutdownHook(Thread)使得jvm关闭时会唤起ShutdownThread来stop Server

启动ShutdownMonitor来监听远端stop指令,可以设置STOP.HOST、STOP.PORT、STOP.KEY来启用。

内部所有connector(ServerConnector等)执行Connector#start 即AbstractLifeCycle#start。

AbstractNetworkConnector#doStart -> ServerConnector#open -> ServerConnector#openAcceptChannel 即绑定host、port到ServerSocket

Server运行时

由于Server继承HandlerWrapper,运行时由其内部托管的handler实现(比如ServletContextHandler)。

HttpChannel#handle -> Server#handle(target, request, request, response)即HandlerWrapper的handle方法

注意:Server、ServletContextHandler、SessionHandler、SecurityHandler、GzipHandler、ServletHandler都是HandlerWrapper,即都在一条责任链上。
注意:ServletContextHandler、SessionHandler、ServletHandler继承ScopedHandler,即调用链上是 ScopedHandler#handle(target, request, request, response) -> ScopedHandler#doScope入参略 -> ScopedHandler#doHandle

所以最后请求request会传递到ServletHandler,通常会设置spring的DispatcherServlet作为ServletHandler的Servlet。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70992.html

相关文章

  • Java学习路线

    摘要:学习路线编程基础语言语言基础数据类型面向对象接口容器异常泛型反射注解流集合类加载机制字节码执行机制 Java学习路线 Java编程基础 Java语言 Java语言基...

    不知名网友 评论0 收藏0
  • Docker和容器云落地一年后的反思

    摘要:这里我想从我在谷歌内部使用容器,并基于容器研发大规模生产平台的经验中谈谈现有和谷歌容器环境的差别,并通过的实际案例落地经验总结下自身所带来的一些谎言和误区。 我与容器的缘分起源于我在 Google 内部研发容器集群管理系: Cluster Management。谷歌内部一切皆容器,搜索、视频、大数据、内部工具等核心业务都以容器的方式运行在容器编排系统 Borg 上。2014年,随着公司...

    _ang 评论0 收藏0
  • [直播视频] 《Java 微服务实践 - Spring Boot 系列》限时折扣

    摘要:作为微服务的基础设施之一,背靠强大的生态社区,支撑技术体系。微服务实践为系列讲座,专题直播节,时长高达小时,包括目前最流行技术,深入源码分析,授人以渔的方式,帮助初学者深入浅出地掌握,为高阶从业人员抛砖引玉。 简介 目前业界最流行的微服务架构正在或者已被各种规模的互联网公司广泛接受和认可,业已成为互联网开发人员必备技术。无论是互联网、云计算还是大数据,Java平台已成为全栈的生态体系,...

    Enlightenment 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<