接上一篇,说到XmlConfiguration ,XmlConfiguration 利用自己实现的 IOC 组装 Server 的全过程如下图所示:

这里可以看到 3 个关键的配置文件, jetty.xml 、 jetty-deploy.xml 、以及 contexts/xxx.xml

l  Jetty.xml 文件中定义了入口类 Server, 以及其所需要的线程池、 Connector 、 Handler 。

l  Jetty-deploy.xml 中则定义了部署 web 应用用到部署工具,在其中指定了部署 web 应用的两种方式,类似于 tomcat, 如果采用 webappProvider ,则表示将 web 应用放在 webapp 下即可生效,如果采用 ContextProvider ,则需要定义 Contexts 目录所在位置,只要在该目录下放置任何应用的 context 配置文件就可以生效。

l  Xxx.xml 这是一个用户自定义文件,表示采用 ContextProvider 时,在其中定义一个 WebAppContext 的 handler, 它指定了我们应用所在的位置,便于加载。

XmlConfiguration 解析装配完毕之后,就开始启动服务, Jetty 的启动是从 Server 开始的,我们来看一下服务器真正的启动过程。

从上图中我们能大概看出服务器启动过程,先是由用户设置好需要的核心组件,然后调用 Server.start() 开始启动服务,其中会首先启动 handler 处理器,之后启动用户自定义组件,这个自定义组件需要实现 LifeCyle 接口,最后才启动 Connector 接受请求。可以想到,关闭过程恰好是反过来,首先关闭接受请求的 connector ,然后再关闭用户自定义组件,最后关闭 handler.

我们再来详细看一下 Server 源代码的核心实现过程,当调用 start 方法时,其实是调用其祖先类 AbstractLifeCycle 中方法,该方法在这里有一个模板实现,如下:

public final void start() throws Exception { synchronized (_lock) { try { if (_state == __STARTED || _state == __STARTING) return; setStarting(); doStart(); setStarted(); } catch (Exception e) { setFailed(e); throw e; } catch (Error e) { setFailed(e); throw e; } } }

  • Connector 启动过程

看下 Connector 的详细启动过程: ( 以 NIO 为例 )

NIOConnector 启动过程中,先创建了多个 SelectSet 对象,每个 SelectSet 负责一个 NIO 的 Selector ,专门用于监听 read 事件 ( 这里利用的多线程 Reactor 模式, http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf ) ,当然这里仅仅是创建了对象,并没有启动,后面会提到。

SelectorManager :

然后再调用 open 创建了一个 blocking 的阻塞 channel ,专门用于接受用户的新连接,我们看下:

public void open() throws IOException { synchronized(this) { if (_acceptChannel == null) { // Create a new server socket _acceptChannel = ServerSocketChannel.open(); // Set to blocking mode _acceptChannel.configureBlocking(true); // Bind the server socket to the local host and port _acceptChannel.socket().setReuseAddress(getReuseAddress()); InetSocketAddress addr = getHost()==null?new InetSocketAddress(getPort()):new InetSocketAddress(getHost(),getPort()); _acceptChannel.socket().bind(addr,getAcceptQueueSize()); _localPort=_acceptChannel.socket().getLocalPort(); if (_localPort<=0) throw new IOException("Server channel not bound"); } } }

随后从线程池中分配了 N 个 ( 可以在配置文件中配置 ) 线程用于启动 SelectSet 监听 read 事件。

synchronized (this) { _acceptorThread = new Thread[getAcceptors()]; for (int i = 0; i < _acceptorThread.length; i++) _threadPool.dispatch(new Acceptor(i)); if (_threadPool.isLowOnThreads()) Log.warn("insufficient threads configured for {}",this); }

最后再分配 1 个线程用于 accept 用户的新连接,新连接来之后,会将其设置为 nonblocking 模式,之后就将其 Register 给某个 SelectSet 去监听 read 事件,然后又返回来继续监听新连接:

_manager.dispatch(new Runnable() { public void run() { final ServerSocketChannel server=_acceptChannel; while (isRunning() && _acceptChannel==server && server.isOpen()) { try { SocketChannel channel = server.accept(); channel.configureBlocking(false); Socket socket = channel.socket(); configure(socket); _manager.register(channel); } catch(IOException e) { Log.ignore(e); } } } });

  • Handler 启动过程

Jetty 将所有的真正处理请求的动作都抽象成了 Handler ,因此做事情的组件都是实现了这个接口的,包括上图所示的 WebAppContext 等等,需要做什么样的工作,那么就添加什么样的 Handler ,这里 SessionHandler 不是必须的,但是默认是创建好的。 ServletHandler 主要负责处理 web 应用的 Servlet 、 Filter 等工作,最后将请求直接交给 Servlet 、 Filter 都是在这里完成。

这里展示的 Handler 的启动过程其实是在准备 web 应用环境,例如解析 web 应用的 web.xml 等等工作,做好一切准备工作。

转载于:https://www.cnblogs.com/lovingprince/archive/2011/02/23/2166259.html

Jetty 服务器架构分析(中)相关推荐

  1. coc游戏服务器架构分析

    coc中的功能,大致分为以下几个部分 1.登陆 2.部落相关功能 3.聊天("世界"聊天,部落内部聊天) 4.邮件 5.搜索对战玩家 6.排行榜 从需求上来出发,由于是全球同服,所 ...

  2. 微信小程序架构分析 (中)

    2019独角兽企业重金招聘Python工程师标准>>> 本文探讨一下小程序的 view 模块和 service 模块是如何构成的. 你可以在app.nw/app/dist/weapp ...

  3. 无服务器架构 - 从使用场景分析其6大特性

    2019独角兽企业重金招聘Python工程师标准>>> 无服务器架构 - 从使用场景分析其6大特性 博客分类: 架构 首先我应该提到,"无服务器"技术肯定有服务器 ...

  4. 游戏服务器架构设计的一些整理

    一.前言 没有最好的架构,只有最适合自身业务的架构. 首先我们应该确定的是大的架构方向:分布式 / 单应用+负载均衡,这两种架构设计直接影响后续的网络层.缓存层.数据层.业务层的设计.笔者这两种架构的 ...

  5. [转]MMORPG服务器架构

    这是一篇写的比较好的文章,转载自 https://www.cnblogs.com/freebird92/p/4141610.html 文中较少部分为个人添加 MMORPG服务器架构一.摘要 1.网络游 ...

  6. SLG手游Java服务器的设计与开发——架构分析

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  7. 深入浅出学习透析Nginx服务器的架构分析及原理分析「底层技术原理+运作架构机制」

    Nginx再次回顾 也许你已经忘记了Nginx是做什么的?我来再次给你夯实一下概念. 多协议反向代理 Nginx是个高性能的Web和反向代理服务器及HTTP服务器,它能反向代理HTTP,HTTPS和邮 ...

  8. python异步多线程框架_Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)。...

    这篇文章主要介绍服务器架构. 网络服务需要面对两个挑战.第一个问题是核心挑战,要编写出能够正确处理请求并构造合适响应的代码. 第二个挑战是如何将网络代码部署到随系统自动启动的Windows服务或者是U ...

  9. 基于linuxunix高性能web服务器架构思路分析

    随着21世纪互联网的快速发展以及web2.0的诞生,最初web服务器已经不能满足我们的需求.而现在我们要考虑的不再仅仅是web服务器以及数据库服务器这么简单,我们所需要考虑的就是设计出一套高性能web ...

最新文章

  1. 北师大毕彦超:AI和人类感知的相同点和不同点
  2. java static关键字_好程序员Java教程分享static关键字的理解
  3. Pycharm打开之后一直在扫描,进不去
  4. Mac终端(Terminal)自定义颜色,字体,背景
  5. 低差异序列:范德科皮特序列(Van der Corput sequence)
  6. Python内建函数之——filter,map,reduce
  7. Windows的Win键被自动按下解决方案
  8. 数据合并之concat、append、merge和join
  9. HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)
  10. php传输的多个id集中为一条记录,如何将多个ID应用于Mysql中的一条记录?
  11. CentOS cannot change locale UTF-8解决方法及设置中文支持
  12. 算法分析与设计 —— 贪心算法「活动安排」「背包问题」「哈夫曼编码」
  13. 马云背后的女人:原来淘宝、支付宝的名字都是她取的
  14. SqlServer数据库 性能监视器 打开路径、添加监控参数 等详解
  15. sudo apt-get install lsb-core
  16. 【资料】《数字电子技术基础》阎石第五版
  17. J2EE框架(StrutsHibernateSpring)的理解
  18. 常见的贴片LED封装尺寸规格表
  19. 联手华为,北京联通在北京打造不一样的5G慧生活!
  20. html怎么让音乐隐藏在网页中循环播放,怎么在网页中循环播放声音

热门文章

  1. scp命令:服务器间远程复制代码
  2. oracle之trunc(sysdate)
  3. java io之图片存取
  4. 为什么构造函数不能是虚函数
  5. Windows Phone 7 开发 31 日谈——第22日:应用?还是 游戏?
  6. 题库 java_java题库
  7. php 识别语种,HYPHP增加多国语言支持 PHP通过用户浏览器判断来源国家方案
  8. idea创建springboot项目出现的问题
  9. scroll-view 横向滑动无效的问题
  10. 时隔多日,旧域名重用,niceyoo博客上线