1. 程式人生 > 遊戲 >谷歌Play商店訂閱分成降低 由30%降至15%

谷歌Play商店訂閱分成降低 由30%降至15%

一、架構圖

二、容器元件

server:整個servlet容器,一個tomcat對應一個server,一個server包含多個service,server在tomcat中的實現類是:StandardServer。

service:一個service包含多個connector(接受請求的協議),和一個container(容器),多個connector共享一個container容器,service在tomcat中的實現類是:StandardService。

connector:連結器,負責處理客戶端請求,解析不同協議及io方式。

executor:執行緒池

container:包含engine,host,context,wrapper等元件

engine:servlet引擎,container容器中頂層的容器物件,一個engine可以包含多個host主機,engine在tomcat中的實現類是:StandardEngine。

host:engine容器的子容器,一個host對應一個網路域名,一個host包含多個context,host在tomcat中的實現類是:StandardHost。

context:host容器的子容器,表示一個web應用,context在tomcat中的實現類是:StandardContext。

wrapper:tomcat中最小的容器單元,web應用中的servlet會被包裝成一個wrapper,wrapper在tomcat中的實現類是:StandardWrapper。

三、NIO架構

1、Connector主要負責用來初始化具體應用協議的處理類ProtocolHandler,應用協議包括 http 協議(http/1.1 版本,http/1.0 版本),AJP 協議(AJP/1.3 版本)。

2、ProtocolHandler代表不同協議處理的實現類,對於 tomcat NIO來說,實現類為 Http11NioProtocol,用來處理 http/1.1 協議。對於普通的 http/1.0 版本協議來說,實現類為 Http11Protocol 。對於AJP/1.3 版本協議來說,為 AjpAprProtocol 和 AjpNioProtocol 這個兩個類。

3、AbstractEndpoint 類是屬於 Http11NioProtocol 類,其主要用來處理底層socket的連線,對於 tomcat NIO的實現類來說是 NioEndpoint。

4、Poller 類屬於NioEndpoint,主要監測epoll 模型裡註冊原始 socket 上的讀寫事件是否發生。

5、NioSelectorPool 類屬於 NioEndpoint ,當資料需要多次讀寫的時候,監測註冊在原始 socket 上的讀寫事件是否發生。

6、NioBlockingSelector 類屬於 NioSelectorPool 類,對於監測註冊在原始 scoket 上的讀寫事件,delegate 給 NioBlockingSelector 處理。

7、BlockPoller類屬於 NioBlockingSelector類,實現具體的監測讀寫事件的邏輯。

8、SocketWrapper 類封裝了原始 socket ,提供封裝的 socket 讀寫操作。

9、ConnectionHandler 類屬於 Http11NioProtocol 類,主要對 SocketWrapper 類進行操作,整個 tomcat NIO 的處理框架就僅僅只有一個 ConnectionHandler 例項,是全域性的,也就是說所有的連線 SocketWrapper 都由這個例項處理。

10、Http11Processor,該類由 ConnectionHandler 例項呼叫,會把接收到的 SocketWrapper 封裝成 tomcat 的 Request 和 Response 物件。

11、CoyoteAdapter,該類負責把 Http11Processor 封裝的 tomcat Request 和 Response 物件給轉換成 HttpServletRequest/HttpServletResponse 物件,並完成對 servlet API 的呼叫。

ConnectionHandler 例項中還有一個 Map 型別的物件,key 為SocketWrapper 型別,value 為 Http11Processor 型別。也就是說為每一個連線都分配了處理類 Http11Processor ,可以儲存連線的狀態資訊。

四、資料處理

  在tomcat NIO的實現裡,會有一系列處理資料讀寫的類。並且 tomcat 也實現了servlet 標準,是 servlet 容器。所以會把處理資料讀寫的類封裝成標準的HttpServletRequest 和HttpServletResponse 實現,從而完成從原始 socket 連線請求到 servlet API 的呼叫。

對於請求 Request 相關的類,展示如下圖:

1、HttpServletRequest 類,代表標準 servlet API 中對於 Request 的具體的定義,其實現類為org.apache.catalina.connector.Request 。

2、HttpServletResponse 類,代表標準 servlet API 中對於 Response 的具體的定義,其中具體的實現類為org.apache.catalina.connector.Response 。

3、Connector類,org.apache.catalina.connector.Request類的屬性之一,就是上面所講的容器元件。

4、coyoteRequest ,org.apache.coyote.Request類的例項,是 tomcat 對連線請求的封裝,同時裡面也包含 http method ,uri ,querystring ,host ,port 等 items 的封裝。

5、CoyoteInputStream,是 tomcat 對於輸入流的包裝。

6、InputBuffer 類,用來完成請求資料的讀取。其中包含 Bytebuffer 和 CharBuffer 作為位元組和字元讀取緩衝區,預設大小為1028*8 bit ,即8KB。

7、coyoteResponse,org.apache.coyote.Response的例項,是 tomcat 對於對連線響應的封裝。

8、Http11InputBuffer 類,主要用於完成請求資料的讀取,其中包含 Bytebuffer 作為位元組讀取緩衝區,包含 SocketInputBuffer 輔助類用於完成到 Bytebuffer 位元組緩衝區的讀操作。

9、NioSocketWrapper 類,封裝了原始的 scoket ,提供封裝的 socket 讀寫操作。

10、NioSelectorPool 類,當資料需要多次讀寫的時候,監測註冊在原始 scoket 上的讀寫事件是否發生。

11、readLatch和writeLatch,CountDownLatch類的例項,均是屬於 NioSocketWrapper 類的屬性。用於當資料不可讀,或者不可寫的時候對 tomcat io 執行緒的阻塞,即如果資料不可讀寫,tomcat io 執行緒會分別在 readLatch 例項和 writeLatch 例項上等待。

12、poller,主要監測 epoll 模型裡註冊原始 scoket 上的讀寫事件是否發生。裡面包含事件佇列SynchronizedQueue ,java NIO 事件輪詢物件 selector,同時還包含了併發事件計數器 weakupCounter。

13、NioChannel,對原始 java NIO 物件 ScoketChannel 的封裝。

14、SocketBufferHandler 類,主要是用於進行封裝原始 java NIO ScoketChannel 物件的讀寫 buffer 。其內部有 DirectBuffer 型別的讀緩衝與寫快取,這裡的 DirectBuffer 是堆外記憶體,而不是 jvm 記憶體,從而提高了讀寫效率。

對於請求 Reponse 相關的類,展示如下圖:

1、CoyoteOutputStream,是 tomcat 對於輸出流的包裝。

2、OutputBuffer 類,用來完成響應資料的寫操作。其中包含Bytebuffer 和 CharBuffer 作為位元組和字元寫操作緩衝區,預設大小為1024*8 bit,即8KB。

3、Http11OutputBuffer 類,主要用於完成響應資料的寫操作,其中包含 Bytebuffer 作為 header 位元組寫緩衝區,包含 SocketOutputBuffer 輔助類用於完成寫操作。

參考連結:https://blog.csdn.net/weixin_46073333/article/details/107054348?spm=1001.2014.3001.5501