Tomcat 流程梳理

1)Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。

    在設計模式中,Socket其實就是一個門面模式(Facade Pattern, 也叫做外觀模式),它把複雜的TCP/IP協議族隱藏在Socket接口後面

    對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。



2)新建ServerSocket 對象需要一個參數(port),綁定端口;它的accept()方法的執行將使Server端的程序處於等待狀態,

    Client 端新建Socket 對象需要兩個參數(host, port)

    程序將一直阻塞直到捕捉到一個來自Client端的請求,並返回一個用於與該Client通信的Socket對象

    此後Server程序只要向這個Socket對象讀寫數據,就可以實現向遠端的Client讀寫數據。
    ServerSocket 一般僅用於設置端口號和監聽,真正進行通信的是服務器端的Socket與客戶端的Socket

    在ServerSocket 進行accept之後,就將主動權轉讓了。

    當一個Socket會話產生後或者說服務器端SeverSocket接收了Socket後,將這個sokcet會話交給線程處理,然後主程序繼續監聽。運用Thread類或Runnable接口來實現是不錯的辦法。 

3)Tomcat 流程開始;C:\Program Files\apache-tomcat-8.5.24\bin\startup.bat 啓動tomcat

    start "Tomcat" "C:/j2sdk1.4.2_15/bin/java" -D...

    在該命令中,start "Tomcat"是在控制檯打開一個新的窗口,然後運行java虛擬機 C:/j2sdk1.4.2_15/bin/java, 現在大家應該明白了,tomcat是從bootstrap.jar中的org.apache.catalina.startup.Bootstrap 類main函數開始啓動運行,並且傳入了start參數。-D開始的都是虛擬機的運行參數;

    初始化運行環境,載入需要的jar包,讀取conf/server.xml,生成相應的運行對象(組件):connector, service, engine, host, context. 

    A web container (also known as a servlet container) is essentially the component of a web server that interacts with the servlets.

    server就代表一個web容器,代表一個服務器,其它的幾個概念都是屬於server的一部分。service表示web容器能夠提供的某項服務。如果把server按照功能粒度進行細化,那麼每個單元就是一個service。connector和engine是組成server的兩個組成部分。engine是執行用戶的請求的引擎,connector是請求執行的通道。connector本身並不做請求的處理,只是提供通道功能。

    Connector 類的構造函數,主要是初始化一個ProtocolHandler對象;啓動函數,則主要是啓動這個對象;在ProtocolHandler上的init和start所執行的操作,通過AbstractProtocol這兩個方法的實現來看;從代碼上看AbstractProtocol本身並不做太多請求解析處理相關的事情,它是把事情委託給了一個AbstractEndpoint對象來完成。類似init和start生命週期,其它的幾個生命週期如pause、resume、stop、destory也主要是通過AbstractEndpoint對象來完成。在Http11NioProtocol的構造函數中指定的是使用NioEndpoint實例,因此這裏通過分析AbstractEndpoint的子類NioEndpoint來做進一步的瞭解。經過了這麼一長串的處理之後,請求被轉到了Connector來進行處理。


4)RMI全稱爲Remote Method Invocation,中文翻譯爲遠程方法調用。指的是從本地調用服務器上的一組方法,服務器根據提交的信息(方法名、方法攜帶參數)計算得到結果、並將結果返回給調用者。Java Remote Method Invocation指的是在Java上實現上述機制。

5)。。。

6)SpringBoot (SpringMVC+Spring 環境) Debug 記錄

    org/apache/tomcat/util/net/NioEndpoint$Acceptor.run();

    sun.nio.ch.ServerSocketChannelImpl.accept();    

SocketChannel和ServerSocketChannel的概念與基礎的阻塞式的java 網絡編程中的socket和serversocket類似。
在後者的模型中,服務器端生成一個serversocket對象,bind綁定端口號,然後accept阻塞等待客戶端連接到服務器。每當連接建立成功,則返回一個Socket對象,用來表示連接建立成功。
在java nio中。ServerSocketChannel和SocketChannel模型其實是與ServerSocket和Socket模型對應的。服務器端open打開一個ServerSocketChannel,這個操作同時會成功一個ServerSocket對象,但生成的ServerSocket對象是沒有進行端口綁定的。所以在進行網絡監聽之前,還需要對ServerSocketChannel的ServerSocket對象進行bind綁定操作。然後ServerSocketChannel開始進行accept網絡監聽,請求建立成功之後返回一個SocketChannel對象。這個SocketChannel對象有一個與之對應的Socket對象。
ServerSocketChannel是線程安全的 ---- at least the Oracle documentation says so.

    sun.rmi.transport.tcp.TCPTransport.class: void executeAcceptLoop(){var1 = this.serverSocket.accept();};

    org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller: void run(); 

        Acceptor的作用是控制與tomcat建立連接的數量,但Acceptor只負責建立連接。socket內容的讀寫是通過Poller來實現的。Poller使用java nio來實現連接的管理。Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的IO工作方式。

    org.apache.coyote.AbstractProtocol.class;

    org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor;

    org.springframework.boot.web.embedded.tomcat.TomcatWebServer.class

    org.apache.catalina.core.StandardServer.class; 它代表一個服務器實例,有一個Service數組的屬性,爲當前這個Server所擁有的service。(StandardService表示一項具體的服務能力,它有一個Connector數組的屬性,是屬於這個Service的連接器;此類中的executors代表爲這個服務配置的ArrayList 線程池,可在多個Connector之間共享。)

    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable;

    org.apache.tomcat.util.net.SocketProcessorBase;

    org\apache\coyote\AbstractProcessorLight.class;

    org\apache\coyote\http11\Http11Processor.class;

    org/apache/catalina/connector/CoyoteAdapter.class; 每個到達Tomcat Connector的請求都有一個對應的線程去處理;線程池是在服務中配置的,在connector之間共享的。

    org/apache/catalina/core/StandardEngineValve.class;

    org/apache/catalina/valves/ErrorReportValve.class;

    org/apache/catalina/authenticator/AuthenticatorBase.class;

    org\apache\catalina\core\StandardHostValve.class;

    org/apache/catalina/authenticator/AuthenticatorBase.class;

    org/apache/catalina/core/StandardContextValve.class;

    org/apache/catalina/core/StandardWrapperValve.class;

    org\apache\catalina\core\ApplicationFilterChain.class;

    org/springframework/web/filter/OncePerRequestFilter.class;

    org/springframework/web/filter/CharacterEncodingFilter.class; 看來SpringBoot 自動配了編碼過濾器;之前手動搭建SSM框架需要在web.xml 配置此過濾器。

    org/springframework/web/filter/RequestContextFilter.class;

    javax/servlet/http/HttpServlet.class;

    org/springframework/web/servlet/FrameworkServlet.class;

    org/springframework/web/servlet/DispatcherServlet.class;

    org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.class;

    org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.class;

    org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.class;

    org/springframework/web/method/support/InvocableHandlerMethod.class;

    java/lang/reflect/Method.java;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章