`
zhaohaolin
  • 浏览: 1012663 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Jetty 服务器架构分析(中)【转】

    博客分类:
  • JAVA
阅读更多

接上一篇,说到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 中方法,该方法在这里有一个模板实现,如下:

  1. public   final   void  start()  throws  Exception  
  2.    {  
  3.        synchronized  (_lock)  
  4.        {  
  5.            try   
  6.            {  
  7.                if  (_state == __STARTED || _state == __STARTING)  
  8.                    return ;  
  9.                setStarting();  
  10.                doStart();  
  11.                setStarted();  
  12.            }  
  13.            catch  (Exception e)  
  14.            {  
  15.                setFailed(e);  
  16.                throw  e;  
  17.            }  
  18.            catch  (Error e)  
  19.            {  
  20.                setFailed(e);  
  21.                throw  e;  
  22.            }  
  23.        }  

  • Connector 启动过程

 

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

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

SelectorManager

 

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

  1. public   void  open() throws IOException  
  2.    {  
  3.        synchronized(this )  
  4.        {  
  5.            if  (_acceptChannel ==  null )  
  6.            {  
  7.                // Create a new server socket   
  8.                _acceptChannel = ServerSocketChannel.open();  
  9.                // Set to blocking mode   
  10.                _acceptChannel.configureBlocking(true );  
  11.                // Bind the server socket to the local host and port   
  12.                _acceptChannel.socket().setReuseAddress(getReuseAddress());  
  13.                InetSocketAddress addr = getHost()==null ? new  InetSocketAddress(getPort()): new  InetSocketAddress(getHost(),getPort());  
  14.          _acceptChannel.socket().bind(addr,getAcceptQueueSize());  
  15.                _localPort=_acceptChannel.socket().getLocalPort();  
  16.                if  (_localPort<=0)  
  17.                    throw   new  IOException( "Server channel not bound" );  
  18.            }  
  19.        }  

 

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

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

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

  1. _manager.dispatch( new  Runnable()  
  2.         {  
  3.             public   void  run()  
  4.             {  
  5.                 final ServerSocketChannel server=_acceptChannel;  
  6.                 while  (isRunning() && _acceptChannel==server && server.isOpen())  
  7.                 {  
  8.                     try   
  9.                     {  
  10.                         SocketChannel channel = server.accept();  
  11.                         channel.configureBlocking(false );  
  12.                         Socket socket = channel.socket();  
  13.                         configure(socket);  
  14.                         _manager.register(channel);  
  15.                     }  
  16.                     catch (IOException e)  
  17.                     {  
  18.                         Log.ignore(e);  
  19.                     }  
  20.                 }  
  21.             }  
  22.         });  

  • Handler 启动过程

 

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

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

 

分享到:
评论

相关推荐

    jetty服务器

    - 启动Jetty服务器,可以在命令行中导航到Jetty解压后的bin目录,然后执行`start.jar`。例如,如果在Linux/Mac上,可以使用`./start.jar`;在Windows上,可以使用`start.jar`。 - 要停止服务器,可以使用`stop.jar...

    Jetty内嵌服务器实例

    内嵌Jetty意味着将Jetty服务器直接集成到你的Java应用中,而不是作为一个独立的服务来运行。这种方式提供了更高的灵活性和控制权,特别适合于快速迭代的开发环境或者需要自定义服务器配置的情况。 在“Jetty内嵌...

    jetty 架构

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛应用于各种规模的Web应用程序中。本文将深入探讨Jetty的架构及其核心特性,帮助你理解其工作原理和优势。 首先,Jetty的核心设计理念是简洁和...

    Jetty 核心架构

    #### 四、Jetty服务器架构 Jetty采用了层次分明的架构设计,便于扩展和维护。其核心架构图如下所示: - **Server**:顶层容器,管理所有组件。 - **Handler**:处理特定的请求。 - **Connectors**:负责建立网络...

    jetty 适合jdk1.8用的服务器

    1. **Jetty服务器核心**:包含了运行Jetty服务器所需的基本组件。 2. **Servlet容器**:支持Servlet 3.1规范,可以处理HTTP请求并分发到对应的Servlet。 3. **配置文件**:如`start.ini`或`jetty.xml`,用于配置...

    应用服务器jetty8.0

    Jetty 8.0是Java应用服务器的一种,主要用于托管Web应用程序。它是一个开源项目,以其轻量级、高效和易于...用户可以通过遵循read-Me.text中的指南来设置和运行Jetty服务器,然后将他们的Web应用部署到这个服务器上。

    Jetty源码分析.pdf

    - **应用场景**:由于Jetty的轻量特性,使其非常适合于**开发测试环境**以及**小型生产环境**使用,尤其在微服务架构中表现优秀。 - **扩展性**:Jetty的设计支持灵活的扩展,用户可以根据需求添加自定义的`...

    jetty-6.1.9服务器(2),包含源码

    Jetty服务器的架构设计使其可以轻松地与其他Java库集成,例如Spring框架,这使得开发者能够在不增加太多复杂性的情况下构建复杂的Web应用。它的模块化特性意味着你可以根据需要选择安装和配置特定的服务,如...

    Android平台i-Jetty服务器在智能家居中的应用研究.pdf

    在研究Android平台i-Jetty服务器在智能家居中的应用时,首先需要了解智能家居的基本概念以及它的核心技术——物联网(Internet of Things, IoT)。智能家居系统是一种融合了计算机、通信、控制技术于一体的现代化家居...

    Jetty

    为了方便管理和调试,Jetty提供了一些工具,如`jetty-maven-plugin`,它可以将Maven项目直接部署到Jetty服务器上。此外,还有`jetty-admin`和`jetty-console`等工具,用于远程管理和监控Jetty实例。 ### 《Jetty6_...

    jetty.jar,jetty-sslengine.jar,jetty-util.jar

    这个jar文件包括了Jetty服务器的基本架构,如服务器启动、线程池管理、HTTP连接器、请求处理等。此外,它还支持WebSocket、Continuation和 Comet编程模型,这些都是现代Web应用中的重要特性。 其次,jetty-...

    jetty html5 websocket服务器

    为了在Jetty服务器上部署WebSocket应用,可以将WebSocket端点类打包到一个Java Web应用程序中,并通过Jetty的Web应用部署机制(如`web.xml`配置或使用Jetty的`Server`和`WebAppContext`类)进行部署。 标签"jetty...

    jetty 9.4.9

    4. **jetty-distribution-9.4.9.v20180320.zip**:这是Jetty 9.4.9的完整发行版,包含了运行Jetty服务器所需的所有组件和库。解压后,用户可以找到启动脚本、配置文件以及示例应用程序,帮助快速开始使用Jetty。 在...

    jetty嵌入项目实战

    - 项目中包含的jar包可能包括Jetty服务器核心模块、Servlet支持模块、WebSocket支持模块等。 - 示例项目通常会展示如何创建一个简单的HTTP服务器,处理GET和POST请求,以及如何注册Servlet和Filter。 - 可能还...

    Jetty 学习资料汇总

    1. **部署应用**:讲解如何将WAR文件或自定义配置部署到Jetty服务器。 2. **性能调优**:提供性能监控和调优的策略,包括JMX工具的使用。 3. **热部署与自动重启**:了解如何实现代码变更后应用的热部署和自动重启...

    run-jetty-run.rar

    在"run-jetty-run"插件中,它会描述如何将Jetty集成到Eclipse的工作流中,比如创建和管理Jetty服务器实例的菜单项和快捷方式。 2. **icons**: 此目录包含了插件在Eclipse界面中使用的图标,例如启动、停止Jetty...

    spring boot内置jetty

    6. **健康检查**:Spring Boot 提供 Actuator 模块,可以监控应用的健康状态、内存使用情况、线程状态等,这对于微服务架构中的服务监控至关重要。 7. **日志管理**:Spring Boot 集成了各种日志框架,如 Logback ...

    jetty-distribution-9.1.0.v20131115

    【标题】"jetty-distribution-9.1.0.v20131115"指的是Jetty服务器的一个发行版本,这个版本发布于2013年11月15日。Jetty是一个开源的、轻量级的Java Web服务器和HTTP服务器,它主要被设计用于快速开发和部署Web应用...

    jetty-6.1.26.zip

    总的来说,Jetty 6.1.26虽然相对较老,但它体现了Jetty服务器的核心设计理念和优势,如轻量级、高性能和灵活性。尽管现代开发可能更倾向于使用更新的版本,但对于了解Jetty的历史和原理,以及在某些场景下部署旧项目...

    jetty6.1.6-2

    在描述中提到的"lib"目录是Jetty的库文件夹,包含了运行Jetty服务器所需的各种依赖JAR文件。这些JAR文件涵盖了Jetty的核心组件、Servlet API、HTTP协议实现、以及其他支持性库,如JSP引擎、WebSocket实现等。理解lib...

Global site tag (gtag.js) - Google Analytics