ASP.NET Core Web伺服器 Kestrel和Http.sys 特性詳解

来源:http://www.cnblogs.com/vipyoumay/archive/2017/09/15/7525478.html
-Advertisement-
Play Games

Kestrel是進程內伺服器,以一個包形式提供,自身不能單獨運行,必須HOST在一個.NET的WEB應用程式中。它內部封裝了對libuv的調用,但不是libuv庫簡單的封裝庫。Kestrel是個精簡的,高效的Http Server ...



1.1. 名詞解釋

內核態: CPU可以訪問記憶體所有數據, 包括外圍設備, 例如硬碟, 網卡. CPU也可以將自己從一個程式切換到另一個程式。

用戶態: 只能受限的訪問記憶體, 且不允許訪問外圍設備. 占用CPU的能力被剝奪, CPU資源可以被其他程式獲取。

1.2. Kestrel基本工作原理

Kestrel是進程內伺服器,以一個包形式提供,自身不能單獨運行,必須HOST在一個.NET的WEB應用程式中。它內部封裝了對libuv的調用,但不是libuv庫簡單的封裝庫。Kestrel是個精簡的,高效的Http Server。

1.2.1. Kestrel的基本架構

Kestrel遵循以下架構原則:

  • libuv中使用單線程的事件迴圈模型。
  • Kestrel支持多事件迴圈以支持更多的I/O。
  • Kestrel僅在libuv的事件迴圈中做I/O工作。
  • 所有非I/O工作,包括HTTP解析,請求幀處理等等都在標準的托管線程中進行。
  • 更少的系統調用。

對應的架構圖如下:

2017-09-13-23-07-16

  • Libuv

    作為I/O底層,屏蔽各系統底層實現差異,為windows下,通過IOCP實現非同步;linux下通過epoll實現非同步。提供一個主程式和主迴圈。

  • I/O事件隊列

    對應Libuv的工作隊列,為了利用現代伺服器的多核處理器,適當的隊列數量將提高更大的I/O吞吐能力。Kestrel預設為每兩個CPU核心設置一個I/O事件隊列,但至少有一個I/O事件隊列。每個隊列對應一個托管線程,該線程不屬於線程池。用戶可以設置隊列個數,通過設置KestrelServerOptions.ThreadCount即可,最多設置16個。

  • Kestrel線程

    事件隊列對應的托管線程,主要控制讀取事件的迴圈機制:每次事件迴圈處理8個事件,然後等待下一次迴圈。

  • 非托管記憶體池

    這是在.net運行環境分配的非托管記憶體池,申請的比較大塊的堆記憶體,僅在首次請求或者池剩餘空間不足時分配,後續請求可以復用,不受GC管理。記憶體被分為n片,每片大小是128K,每頁大小4k,管理記憶體頁的數據結構採用鏈表方式。以獲取大塊連續空間的方式增長。遵循讀完後立即釋放的處理原則。

  • TCP監聽器

    這個監聽器不同於套接字的監聽器,而是Libuv的Socket類型的連接事件監聽器。監聽TCP連接事件,對每一個TCP請求產生一個連接對象。連接對象包括暫停,繼續,終止。

  • 連接管理

    負責非同步結束連接對象。

  • HTTP協議模塊

    該模塊包括HTTP幀的創建工廠,工廠在監聽器監聽到一個連接時產生一個HTTP幀。一個HTTP幀處理一次HTTP請求和返回。

更為詳細的結構視圖如下:

2017-09-13-23-23-55

1.2.2. Kestrel的工作原理

1.2.2.1. 處理Request和Response

2017-09-14-21-21-30

按照請求流轉方向會有以下處理過程:

1. 請求進入libuv

將請求事件放入事件隊列,隨後的事件迴圈中,監聽器回調函數執行。

2. 監聽器創建連接

根據請求信息創建一個連接對象,此時Http幀工廠被調用,產生一個Http幀對象;用於讀取Request的SocketInput、用於返回Response的SocketOutput對象被創建,二者會被Http幀使用。

3. 連接管理監控連接

連接管理器跟蹤連接的狀態,收集待關閉連接,然後非同步關閉。

4. Http幀處理

一個Http負責構建Http上下文的Request對象和Response對象。讀取Request數據和返回Response數據都要經過記憶體池。高效的記憶體讀寫和與和Libuv的讀寫事件協調,確保Request數據到達就能讀到記憶體池,到達記憶體池就能及時被讀;Response數據寫入記憶體池就能被套接字及時發出去,體現了Kestreld強大的非同步處理能力。

1.2.2.2. 記憶體池讀寫

讀取記憶體池數據時可讀取後續到達的數據,不需要重新等待事件,此時對應讀取Request數據情形:

2017-09-14-23-42-10

寫數據到記憶體池時,libuv連續讀出併發送數據,也不需要重新等待時間,此時對應發送Response數據情形:

2017-09-14-23-42-58

1.2.2.3. Libuv線程和托管線程通信

二者的通信機制保證Libuv線程永遠不會被阻塞:比如libuv線程在通知事件時會很小心嘗試獲取隊線程私有鎖,如果成功獲取就這在事件隊列線程上非同步處理,否則這一通信過程線上程池裡重覆執行直到成功,如圖:

2017-09-14-23-28-33

1.3. Http.sys基本工作原理

1.3.1. Http.sys基本構成

2017-09-10-12-25-14

1. 監聽器

監聽TCP請求,允許埠共用。TCP攜帶的HTTP報文會被Http Parser解析,名稱映射首先會根據url確定對應的web app,然後把請求放入該app的消息隊列中。

2. 消息隊列

Http.sys給每個註冊的web app一個消息隊列。

3. 響應緩存

請求的靜態資源和GET請求會緩存起來一段時間,如果請求url能匹配這直接返回緩存數據。

4. 響應模塊

將數據返回給用戶代理,如果返回的是可以緩存的資源,則會放入響應緩存中。

1.3.2. Http.sys工作原理

下圖表示在ASP.NET Core應用中接受一個http請求到返回數據的過程:

2017-09-10-11-29-05

  1. 這裡的TCPIP.sys也是windows內核驅動,提供了TCPIP協議棧。

  2. Http.sys的處理如在“基本構成”做所述。

  3. ASP.NET Core應用程式裡面HttpSys模塊代表了Http.sys,它與應用程式代碼交流,交流的載體是HTTP上下文。

1.3.3. 總結

Kestrel伺服器運行在Asp.net core應用程式中,能高效的處理網路請求,且跨平臺。Http.sys運行在內核態中,極大減少了系統調用次數,運行效率很高;自帶生存環境的安全,魯棒性等特點;它也可以作為反向代理,因此它的功能更加強大,主要問題是只能運行在windows下。Kestrel應用在生產環境中需要運行在代理伺服器後面,以獲取安全性,負載均衡等能力。

功能 Http.sys Kerstrel
平臺支持 Windows Windows/Linux/Mac
靜態文件 Yes Yes
HTTP訪問日誌 Yes No
埠共用/多應用程式 Yes No
SSL證書 Yes Internal*
Windows 授權 Yes No
過濾請求&限制 Yes No
IP&功能變數名稱約束 Yes No
HTTP重定向規則 Yes No
WebSocket 協議 Yes Middleware
緩存Response Yes No
壓縮 Yes Yes
FTP伺服器 Yes No
運行態 內核態 用戶態

* Internal:https通信僅僅工作在反向代理伺服器後面與ASP.NET程式之間,如果要想外暴露https服務這需要用到反向代理,比如IIS,nginx,apached。

參考文章

http://www.cnblogs.com/yxmx/articles/1652128.html

http://www.cnblogs.com/arbin98/archive/2010/09/03/1816847.html

https://stackify.com/kestrel-web-server-asp-net-core-kestrel-vs-iis/

作者:帥蟲哥 出處: http://www.cnblogs.com/vipyoumay/p/7525478.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天測試提了一個BUG,說是消息提醒的時機不對,設置的提前2小時,還沒到就提醒了。 看了下代碼 執行 結果是55,按道理應該是170 執行 結果是169.89568451 最後把代碼修改為 BUG解決 總結: 1.Minutes的計算只限於分鐘部分,類型Int,(-59到59) https://ms ...
  • 1. HSV 1.1 HSV的定義 HSV都是一種將RGB色彩模型中的點在圓柱坐標系中的表示法,這種表示法試圖做到比RGB基於笛卡爾坐標系的幾何結構更加直觀。HSV即色相、飽和度、明度(英語:Hue, Saturation, Value),又稱HSB,其中B即英語:Brightness。 色相(H) ...
  • 這裡按老規矩先進行和其它產品進行比較: 目前在.net平臺存在兩個比較老牌的日誌框架分別為Log4net和NLog。 我們進行對這兩種框架進行比較下 Log4net Log4net是一個老牌的日誌框架,它可以實現日誌多目標輸出,輸出到控制台、文件、資料庫、系統事件、Email等,幾乎無所不能。它可以... ...
  • 今天在公司同事問了我一個問題,用postman傳遞json字元串給介面,介面獲取到的值不正確。 我就看到下麵的json數據: { "Mark":"1" } 介面的model成員欄位定義如下: 差不多是類似的代碼,這樣子webapi介面獲取到的值就是false,如果傳遞的是"true"的話,那麼mod ...
  • 在MSDN沒找到關於使用APPCMD備份IIS的"Management Service Delegation"模塊配置命令。 到IIS的配置文件存放目錄下,幾番搜索,查到%windir%\system32\inetsrv\config\administration.config里,有我想要備份的東西 ...
  • 表達式樹可以說是Linq的核心之一,為什麼是Linq的核心之一呢?因為表達式樹使得c#不再是僅僅能編譯成IL,我們可以通過c#生成一個表達式樹,將結果作為一個中間格式,在將其轉換成目標平臺上的本機語言。比如SQL。我們常用的Linq to sql就是這樣生成SQL的。 表達式樹是.NET 3.5之後 ...
  • 最近在做一些EO方面的系統開發,由於涉及到對資料庫的操作量比較大,用ADO.NET和資料庫進行連接交互的時候,難免會對程式的性能產生影響。比如說我們現在要對九個SQL語句進行資料庫操作,並且每個語句的執行是有順序限制的,如果我們一次一個一個的與資料庫進行交互,則需要和資料庫建立九次連接,這樣對系統性 ...
  • 某天搬磚搬得熱火朝天,突然一個電話打來,業務部門反映,某功能特別卡,簡直不能忍。有多慢?大概90s。是突然很慢?還是之前就很慢?之前就有點慢,但是沒有這麼慢。好了,不扯犢子了,直接查看源碼: 調試了一下,只用了223ms,果然是日期格式的原因。 之前為什麼沒有出現這個問題,和資料庫小組溝通,資料庫小 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...