ASP.NET Core 中 Kestrel 的應用及在前后端分離項目中的角色

目錄

一、Kestrel 基礎:輕量級且高性能的 Web 服務器

二、前后端分離項目架構:Vue、.NET Core API、Nginx 與 Kestrel

2.1 交互流程圖

2.2 流程詳解

三、Kestrel 在架構中的核心作用

四、launchSettings.json 與 Kestrel 配置的關系及底層機制

4.1 launchSettings.json 文件結構與作用

4.2 配置優先級與底層機制

4.2.1?ASP.NET?Core 的配置系統

4.2.2 Kestrel 的配置加載機制

4.2.3 Program.cs 中的配置與 launchSettings.json 的關系

4.3 實際應用場景

4.4 最佳實踐


在ASP.NET Core 的開發領域中,Kestrel 服務器是其重要的組成部分。它是一個跨平臺的 Web 服務器,由微軟開發并開源,能夠直接處理 HTTP 請求,并且可以與 IIS、Nginx 等反向代理服務器結合使用。今天,我們就來深入探討一下 Kestrel 在ASP.NET Core 中的應用,以及它在前后端分離項目,如 Vue 和.NET Core API 結合 Nginx 的項目架構中扮演的角色。

一、Kestrel 基礎:輕量級且高性能的 Web 服務器

Kestrel 是ASP.NET Core 應用程序的默認 Web 服務器,它基于.NET Standard 構建,這使得它能夠在 Windows、Linux 和 macOS 等多個平臺上運行。Kestrel 具備輕量級和高性能的特點,它直接處理網絡請求,能夠高效地處理大量并發連接,減少了中間環節帶來的性能損耗。

在ASP.NET Core 項目的Program.cs文件中,我們可以看到 Kestrel 的基本配置代碼:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;namespace YourProjectName
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
}

上述代碼中,UseStartup<Startup>()方法會加載應用的啟動配置,而默認情況下,ASP.NET Core 應用就會使用 Kestrel 來監聽請求。我們也可以對 Kestrel 進行進一步的配置,比如指定監聽的 IP 地址和端口:

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>().UseKestrel(options =>{options.ListenAnyIP(5000);});});

在這段代碼中,UseKestrel方法對 Kestrel 進行配置,ListenAnyIP(5000)表示 Kestrel 將監聽所有可用 IP 地址的 5000 端口。

二、前后端分離項目架構:Vue、.NET Core API、Nginx 與 Kestrel

在前后端分離項目中,Vue 通常用于構建前端頁面,提供用戶交互界面;.NET Core API 負責處理業務邏輯和數據交互;Nginx 作為反向代理服務器,起到轉發請求、負載均衡等作用;而 Kestrel 則在后端為.NET Core API 提供底層的 Web 服務支持。下面我們通過流程圖和文字描述來詳細了解它們之間的交互流程。

2.1 交互流程圖

2.2 流程詳解

  1. 用戶發起請求:用戶在瀏覽器中輸入網址或者進行頁面操作,瀏覽器會根據操作生成相應的 HTTP 請求,比如 GET 請求獲取數據,POST 請求提交數據等。這個請求首先會發送到 Nginx 服務器。
  1. Nginx 接收并轉發請求:Nginx 作為反向代理服務器,監聽著特定的端口(通常是 80 或 443 端口)。當它接收到用戶的請求后,會根據預先配置好的規則來判斷請求應該轉發到哪個后端服務器。在前后端分離項目中,Nginx 會將與 API 相關的請求轉發到運行著.NET Core API 的服務器上,而將靜態資源(如 Vue 打包后的 HTML、CSS、JavaScript 文件)的請求直接返回給瀏覽器。Nginx 的配置示例如下:
server {listen 80;server_name yourdomain.com;location /api/ {proxy_pass http://localhost:5000;  # 轉發到Kestrel監聽的端口proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection keep-alive;proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;}location / {root /path/to/vue/dist;  # Vue打包后的靜態資源目錄index index.html index.htm;try_files $uri $uri/ /index.html;}
}

在上述配置中,location /api/表示當請求的 URL 以/api/開頭時,Nginx 會將請求轉發到本地運行在 5000 端口的服務器,也就是運行著 Kestrel 的.NET Core API 服務器。

3. Kestrel 接收并處理請求:Kestrel 在.NET Core API 應用中監聽著指定的端口(如前面配置的 5000 端口),當它接收到 Nginx 轉發過來的請求后,會將請求傳遞給ASP.NET Core 應用的中間件管道。中間件會對請求進行一系列的處理,比如身份驗證、請求日志記錄、數據驗證等,然后將請求路由到對應的控制器方法。控制器方法處理業務邏輯,與數據庫進行交互,獲取或更新數據,并將處理結果封裝成響應數據返回。

4. 響應返回:Kestrel 將控制器返回的響應數據打包成 HTTP 響應,并發送回 Nginx。Nginx 接收到響應后,再將響應轉發給用戶的瀏覽器。瀏覽器接收到響應數據后,Vue 應用根據數據更新頁面,展示給用戶最終的結果。

三、Kestrel 在架構中的核心作用

  1. 底層服務支持:Kestrel 為.NET Core API 提供了基礎的網絡通信和請求處理能力,它直接與網絡層交互,監聽端口,接收和解析 HTTP 請求,并將請求傳遞給ASP.NET Core 的應用邏輯進行處理。沒有 Kestrel,.NET Core API 就無法直接對外提供 Web 服務。
  1. 高效性能保障:由于 Kestrel 的輕量級和高性能特性,它能夠快速處理大量的并發請求,減少請求的響應時間,提升 API 的整體性能。在高并發場景下,Kestrel 的優勢尤為明顯,能夠保證后端 API 的穩定運行,為前端應用提供可靠的數據支持。
  1. 與反向代理協作:Kestrel 可以與 Nginx 等反向代理服務器無縫協作。Nginx 負責處理外部網絡請求的負載均衡、SSL 加密、靜態資源服務等功能,而 Kestrel 專注于處理ASP.NET Core 應用的業務邏輯請求,兩者分工明確,共同構建起穩定、高效的前后端分離項目架構。

四、launchSettings.json 與 Kestrel 配置的關系及底層機制

在ASP.NET?Core 項目中,我們經常會看到launchSettings.json文件,它通常位于項目的Properties文件夾下。這個文件中包含了應用程序啟動時的配置信息,包括不同環境下的 URL、端口、應用程序參數等。很多開發者會疑惑,為什么已經在Program.cs中通過UseKestrel方法配置了 Kestrel,還要在launchSettings.json中配置 URL 和端口呢?這背后的底層機制是什么?

4.1 launchSettings.json 文件結構與作用

首先,讓我們看一下launchSettings.json文件的基本結構:

{"profiles": {"YourProjectName": {"commandName": "Project","launchBrowser": true,"applicationUrl": "http://localhost:5000;https://localhost:5001","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}},"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"applicationUrl": "http://localhost:5002","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
}

這個文件定義了不同的啟動配置文件(profiles),每個配置文件包含了特定的啟動設置:

  • commandName:指定啟動應用程序的命令類型,可以是 "Project"(直接啟動項目)或 "IISExpress"(通過 IIS Express 啟動)。
  • launchBrowser:是否在應用程序啟動后自動打開瀏覽器。
  • applicationUrl:應用程序監聽的 URL 地址,可以指定多個地址,用分號分隔。
  • environmentVariables:環境變量設置,例如設置ASPNETCORE_ENVIRONMENT來指定應用程序的運行環境(Development、Production 等)。

4.2 配置優先級與底層機制

要理解為什么需要在launchSettings.json中配置 URL 和端口,我們需要了解ASP.NET?Core 的配置系統和 Web 服務器的啟動機制。

4.2.1?ASP.NET?Core 的配置系統

ASP.NET?Core 使用分層配置系統,它可以從多種來源加載配置,包括:

  1. 命令行參數
  2. 環境變量
  3. appsettings.json 文件
  4. appsettings.{Environment}.json 文件
  5. User Secrets(僅在開發環境中)
  6. launchSettings.json 文件(僅在開發環境中)

這些配置源按照特定的順序加載,后面的配置源會覆蓋前面的配置源中相同的鍵值。這種機制使得我們可以在不同的環境中使用不同的配置,同時保持代碼的一致性。

4.2.2 Kestrel 的配置加載機制

當ASP.NET?Core 應用程序啟動時,Kestrel 服務器會從配置系統中讀取 URL 和端口設置。在默認情況下,Kestrel 會使用urls配置鍵來確定要監聽的 URL 地址。

Host.CreateDefaultBuilder()方法會自動加載多種配置源,包括launchSettings.json文件(僅在開發環境中)。這意味著在開發環境中,launchSettings.json中的applicationUrl設置會被加載到配置系統中,并被 Kestrel 讀取作為監聽地址。

4.2.3 Program.cs 中的配置與 launchSettings.json 的關系

Program.cs中,我們可以通過UseUrls方法或在UseKestrel方法中直接配置 Kestrel 來指定監聽的 URL 和端口:

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>().UseUrls("http://localhost:5000;https://localhost:5001").UseKestrel(options =>{// 其他Kestrel配置});});

但是,這種硬編碼的方式不夠靈活,特別是在不同環境中需要使用不同的 URL 和端口時。而launchSettings.json文件提供了一種更靈活的方式來配置這些設置,并且它只在開發環境中生效,不會影響生產環境的配置。

當同時存在Program.cs中的配置和launchSettings.json中的配置時,配置系統的優先級機制會決定最終使用哪個配置:

  1. 如果在Program.cs中使用了UseUrls方法明確指定了 URL,那么這個設置會覆蓋配置系統中的任何其他設置。
  2. 如果沒有使用UseUrls方法,Kestrel 會從配置系統中讀取urls配置鍵的值。在開發環境中,這個值通常來自launchSettings.json文件中的applicationUrl設置。
  3. 如果配置系統中沒有找到urls配置鍵,Kestrel 會使用默認值http://localhost:5000;https://localhost:5001

4.3 實際應用場景

了解了這些底層機制后,我們可以更好地理解為什么需要在launchSettings.json中配置 URL 和端口:

  1. 開發環境的靈活性:在開發過程中,不同的開發者可能需要使用不同的端口來避免沖突。launchSettings.json文件可以放在項目的.gitignore文件中,這樣每個開發者可以在自己的本地副本中配置自己的端口,而不會影響其他開發者。

  2. 多環境配置:ASP.NET?Core 支持在不同的環境中使用不同的配置。launchSettings.json主要用于開發環境,而在生產環境中,我們可以通過環境變量或配置文件來指定 URL 和端口,這樣可以保持開發和生產環境的一致性。

  3. 與 IDE 集成:Visual Studio 和 Visual Studio Code 等 IDE 會自動讀取launchSettings.json文件,并在啟動應用程序時使用其中的配置。這使得開發者可以通過 IDE 的界面輕松切換不同的啟動配置。

  4. 多配置文件支持launchSettings.json文件可以包含多個配置文件(profiles),每個配置文件可以有不同的設置。例如,一個配置文件可以用于調試,另一個配置文件可以用于性能測試。

4.4 最佳實踐

在實際開發中,我們可以遵循以下最佳實踐:

  1. Program.cs中使用UseKestrel方法配置 Kestrel 的高級選項,如連接限制、請求超時等,這些設置通常在所有環境中都是相同的。

  2. launchSettings.json中配置開發環境的 URL 和端口,這樣每個開發者可以根據自己的需要進行調整。

  3. 在生產環境中,使用環境變量或配置文件來指定 URL 和端口,而不是硬編碼在代碼中。

  4. 對于不同的環境(開發、測試、生產),使用不同的appsettings.{Environment}.json文件來管理特定環境的配置。

通過以上內容,我們對 Kestrel 在ASP.NET Core 中的應用以及它在前后端分離項目中的角色有了更深入的了解。合理配置和使用 Kestrel,結合 Nginx 等工具,能夠幫助我們打造出高性能、可擴展的 Web 應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86943.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin 退出循環總結

文章目錄 Kotlin 退出循環總結for循環forEach()嵌套for循環lambda函數inline函數 Kotlin 退出循環總結 for循環 for ((index, value) in list.withIndex()) {if (value "c") {break // 退出循環}println("$index - $value") }// 0 - a // 1 - bfo…

再看C語言

目錄 與Java的差異化 編程范式 跨平臺 編譯過程 包管理 基本類型 內存結構 重點掌握 進制、字節與計算 指針 結構體 關鍵詞 動態內存 模塊化 高級特性 動態鏈接 虛擬內存 打包編譯 并發編程 現在需要參與到存儲軟件開發工作&#xff0c;存儲層比較接近OS系統…

機器學習入門 | 訓練、推理與其他機器學習活動(預處理、測試與評估)

在訓練階段&#xff0c;訓練算法通過優化目標/損失函數在訓練數據集上的表現&#xff0c;不斷更新模型參數θ。在監督學習場景中&#xff0c;訓練數據集由輸入-標簽對&#xff08;真實輸出值&#xff09;組成。目標函數應當獎勵模型根據訓練輸入成功預測真實輸出的行為&#xf…

Node.js特訓專欄-實戰進階:11. Redis緩存策略與應用場景

&#x1f525; 歡迎來到 Node.js 實戰專欄&#xff01;在這里&#xff0c;每一行代碼都是解鎖高性能應用的鑰匙&#xff0c;讓我們一起開啟 Node.js 的奇妙開發之旅&#xff01; Node.js 特訓專欄主頁 專欄內容規劃詳情 Redis 緩存策略與應用場景&#xff1a;從理論到實戰的高…

【stm32】HAL庫開發——Cube配置基本定時器

目錄 一、Cube配置基本定時器 1.定時器CubeMX配置介紹 2.定時器中斷控制LED 3.定時器常用函數 4.定時器從模式&#xff08;Reset Mode&#xff09; 5.定時器的從模式&#xff08;Gated Mode&#xff09; 6.定時器的編碼器接口 一、Cube配置基本定時器 1.定時器CubeMX配置…

nginx反向代理后端服務restful及token處理

#user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; } #代理mysql服務 stream {upstream mysql_backend {server 192.168…

正確理解Cola StateMachine不內置事務管理機制

? 正確理解&#xff1a;Cola StateMachine 并非“不支持”事務一致性&#xff0c;而是“不內置”事務管理機制 因為&#xff1a; Cola StateMachine 是輕量級、無狀態、不依賴 Spring 的框架&#xff0c;它本身 不綁定任何事務上下文。它不像 Spring StateMachine 那樣自動與…

AudioTrack使用

** AudioTrack ** AudioTrack 是 Android 音頻系統中的核心類&#xff0c;用于播放原始音頻數據&#xff08;PCM&#xff09;或壓縮音頻&#xff08;如 MP3、AAC&#xff09;。它提供了低級別的音頻播放控制&#xff0c;適合需要精細管理的場景&#xff08;如游戲音效、實時音…

解密:MySQL 的常見存儲引擎

在數據庫領域&#xff0c;MySQL 作為一款廣受歡迎的關系型數據庫管理系統&#xff0c;提供了多種存儲引擎以滿足不同應用場景的需求。每種存儲引擎都有其獨特的特性、優勢和適用場景。本文將深入探討 MySQL 中幾種常見的存儲引擎&#xff0c;包括 InnoDB、MyISAM、MEMORY 和 AR…

qt和qtcreator版本關系

實例展示&#xff1a; 如圖所示的qtcreator是使用qt5.15安裝過程選擇勾選了qtcreator 14.0.2&#xff0c;安裝完成qtcreator版本信息&#xff1a; 安裝過程中選擇了這些構件kits&#xff0c;會自動識別到&#xff1a; 使用qt5.9.9另外安裝的kits&#xff0c;需要手動設置才能識…

2個任務同時提交到YARN后2個都卡住(CDH)

文章目錄 問題描述解決方案1、增加資源2、調整ApplicationMaster資源3、關閉YARN調度器的資源搶占4、不使用公平調度器 問題描述 在CDH集群上&#xff0c;同時提交2個任務到YARN后&#xff0c;2個任務都卡住 解決方案 1、增加資源 增加服務器的內存和CPU 2、調整Applicatio…

web3區塊鏈-ETH以太坊

一. 以太坊概述 以太坊&#xff08;Ethereum&#xff09;作為區塊鏈技術的代表性項目之一&#xff0c;自2015年發布以來&#xff0c;迅速成為全球區塊鏈行業的核心基礎設施。相比比特幣&#xff0c;以太坊不僅支持點對點的價值轉移&#xff0c;還引入了智能合約&#xff0c;使…

【智能協同云圖庫】智能協同云圖庫第二彈:用戶管理系統后端設計與接口開發

用戶管理系統 一、需求分析 對于用戶模塊&#xff0c;通常要具有下列功能&#xff1a; 二、方案設計 &#xff08;一&#xff09;庫表設計 實現用戶模塊的難度不大&#xff0c;在方案設計階段&#xff0c;我們需要確認以下內容&#xff1a; 庫表設計用戶登錄流程如何對用戶權限…

閑庭信步使用SV搭建圖像測試平臺:第十三課——談談SV的數據類型

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

前端進階之路-從傳統前端到VUE-JS(第一期-VUE-JS環境配置)(Node-JS環境配置)(Node-JS/npm換源)

經過前面的傳統前端開發學習后&#xff0c;我們接下來進行前端的VUE-JS框架學習&#xff08;寫這篇文章的時候VUE-JS最新版是VUE3&#xff0c;所以默認為VUE3即可&#xff09; 首先&#xff0c;我們要配置Node-JS環境&#xff0c;雖然我們還不學習Node-JS但是Node-JS可以快速配…

Requests源碼分析:面試考察角度梳理

簡單描述執行流程 ?? Q:能簡單描述一下發送一個requests.get(url)請求時,在requests庫內部的主要執行流程嗎?(從調用get方法到收到響應) 入口委托: get() 方法內部調用 requests.request(GET, url)。Session 接管: request() 方法會獲取或隱式創建一個 Session 對象,并…

航天VR賦能,無人機總測實驗艙開啟高效新篇?

(一)沉浸式培訓體驗? 在傳統的無人機培訓中&#xff0c;操作人員主要通過理論學習和簡單的模擬操作來掌握技能。但這種方式存在很大局限性&#xff0c;難以讓操作人員真正感受無人機在復雜環境下的運行狀態。而航天 VR 技術引入到 VR 無人機總測實驗艙后&#xff0c;徹底改變了…

Kotlin 函數與 Lambda 表達式

今天繼續分享Kotlin學習內容。 目標&#xff1a;掌握函數定義、調用、參數傳遞&#xff0c;以及 Lambda 表達式的基礎用法 1. 函數&#xff1a;Kotlin 的代碼模塊化工具 定義&#xff1a;函數是可重復調用的代碼塊&#xff0c;用于封裝邏輯。 語法&#xff1a; fun 函數名(參…

[mcp-servers] docs | AI客戶端-MCP服務器-AI 架構

鏈接&#xff1a;https://github.com/punkpeye/awesome-mcp-servers 服務器調用 相關專欄&#xff1a;實現Json-Rpc docs&#xff1a;精選MCP服務器資源列表 本專欄為精選 模型上下文協議&#xff08;MCP&#xff09;服務器的列表。 MCP 是一種標準協議語言&#xff0c;允許*…

1688商品發布API:自動化上架與信息同步

一、1688商品發布API的核心功能與技術架構 1.1 API功能全景 1688商品發布API是1688開放平臺的核心組件之一&#xff0c;支持商品信息的自動化發布、編輯、上下架及庫存同步。其核心功能包括&#xff1a; 商品信息管理&#xff1a;支持商品標題、描述、價格、庫存、SKU&#…