6. 【.NET 8 實戰--孢子記賬--從單體到微服務--轉向微服務】--微服務基礎工具與技術--Ocelot 網關--概念與簡單入門

網關是一種位于客戶端和后端服務之間的服務,充當所有客戶端請求的單一入口。它的主要職責是接收所有的API調用,匯總各類請求,將其路由到適當的后端服務,并將響應返回給客戶端。網關不僅僅是一個簡單的反向代理,它還能夠處理認證、授權、負載均衡、緩存、請求和響應的轉換等多種功能。
在微服務架構中,系統通常由多個獨立的服務組成,這些服務各自負責不同的業務功能。當客戶端需要與這些服務進行交互時,直接調用各個服務會帶來一系列的問題。首先,客戶端需要了解每個服務的地址和接口,當服務數量眾多時,這種復雜性會迅速增加。其次,不同的服務可能使用不同的協議和數據格式,客戶端需要處理這些差異。最后,為了實現認證、授權、限流、日志記錄和監控等功能,每個服務都需要重復實現這些通用功能,導致代碼重復和維護困難。
網關通過提供一個統一的接口,簡化了客戶端與后端服務的交互。客戶端只需要與網關交互,而不需要關心后端服務的具體實現和位置。網關可以進行負載均衡,將請求分發到多臺后端服務器上,以提高系統的可用性和性能。它還可以緩存某些請求的響應,減少后端服務的負載。通過集中處理認證和授權,網關可以確保安全性和一致性,而不需要在每個服務中重復實現這些功能。
此外,網關能夠對請求和響應進行轉換和聚合。例如客戶端可能需要從多個服務中獲取數據,網關可以在后端服務之間協調,匯總結果并返回給客戶端。這不僅簡化了客戶端的開發,還可以減少網絡延遲,提高響應速度。

一、Ocelot概述

Ocelot是基于.NET Core的開源網關,旨在為微服務架構和服務導向架構提供統一的入口。作為網關,Ocelot通過提供一系列強大而靈活的功能,幫助開發者輕松管理和路由客戶端請求。
Ocelot的核心功能之一是路由。通過定義路由規則,Ocelot能夠將客戶端的請求轉發至適當的后端服務。每個路由規則包括一個上游路徑(客戶端請求的路徑)和一個下游路徑(后端服務的路徑)。這種映射機制使得Ocelot可以靈活地處理不同的請求,確保客戶端與后端服務之間的通信順暢。此外,Ocelot支持路徑參數和查詢參數的傳遞,使路由規則更加靈活和強大。
為了提高系統的可用性和性能,Ocelot提供了多種負載均衡策略,包括輪詢(Round Robin)和最少連接(Least Connection)。輪詢策略將請求依次分發到每個可用的后端服務實例,從而均衡負載;最少連接策略則將請求分發到當前連接數最少的服務實例,以確保每個實例的負載均衡。通過配置負載均衡策略,Ocelot能夠有效地分配請求,避免單個服務實例過載。
在微服務架構中,服務實例的數量和地址可能是動態變化的。為了實現動態路由,Ocelot集成了服務發現功能,可以與Consul和Eureka等服務注冊中心進行集成。通過服務發現,Ocelot可以自動獲取可用的服務實例列表,并將請求路由到健康的實例上。這不僅簡化了服務管理,還提高了系統的可靠性和可擴展性。
請求聚合是Ocelot的一個重要特性,特別適用于需要從多個服務中獲取數據的場景。Ocelot可以將多個下游服務的響應合并為一個響應返回給客戶端,從而減少客戶端的調用次數,提高響應速度。通過配置聚合路由,開發者可以定義哪些服務的響應需要聚合,以及如何合并這些響應。這種功能在構建復雜的API時非常有用,能夠顯著簡化客戶端的邏輯。
在安全性方面,Ocelot提供了多種認證和授權機制,以確保請求的合法性和安全性。常見的認證機制包括JWT(JSON Web Token)認證和與IdentityServer的集成。通過配置認證策略,Ocelot可以在處理請求之前驗證令牌的有效性,并根據權限控制訪問。此外,Ocelot還支持IP白名單和黑名單、SSL/TLS終止等安全功能,進一步增強了系統的安全性。
為了幫助開發者跟蹤請求的處理過程,監控系統的健康狀況,Ocelot提供了豐富的日志和監控功能。通過集成日志框架(如Serilog),Ocelot可以記錄請求的詳細信息,包括請求路徑、響應時間、狀態碼等。開發人員可以根據這些日志進行問題排查和性能分析。Ocelot還支持與Prometheus等監控工具的集成,實時監控系統的各項指標,確保系統的穩定運行。
Ocelot的配置文件使用JSON格式,支持多種配置選項。開發者可以根據需求靈活配置路由、負載均衡、服務發現、認證、日志等功能。Ocelot還支持熱更新配置,即在不重啟服務的情況下動態更新配置文件。這使得Ocelot在應對變化和調整時更加靈活和高效。
Ocelot的設計高度模塊化,支持通過中間件擴展功能。開發者可以根據具體需求編寫自定義中間件,插入到請求處理管道中,增加或修改Ocelot的功能。這種擴展性使得Ocelot能夠適應各種復雜的業務場景,滿足不同應用的需求。

二、 Ocelot的安裝與配置

2.1 安裝

安裝Ocelot非常簡單,首先要確保已安裝.NET Core SDK,接著創建一個新的ASP.NET Core項目。在命令行中運行以下命令:

dotnet new webapi -n OcelotApiGatewayDemo

進入項目目錄:

cd OcelotApiGateway

使用NuGet包管理器安裝Ocelot。在命令行中運行以下命令:

dotnet add package Ocelot

安裝完成后,打開Program.cs文件,在Main方法中添加Ocelot服務:

builder.Services.AddOcelot();

Main方法中添加Ocelot中間件:

app.UseOcelot().Wait();

最后,在項目根目錄創建ocelot.json空的配置文件,它用來定義路由和其他配置。到此,Ocelot已成功安裝并配置完畢。

2.2 配置

在這一小節,我們以服務轉發為例簡單講解一下Ocelot的配置。打開上一小節創建的ocelot.json空配置文件,在其中輸入如下內容:

{"Routes": [{"DownstreamPathTemplate": "/api/users","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5001}],"UpstreamPathTemplate": "/users","UpstreamHttpMethod": [ "GET" ]}],"GlobalConfiguration": {"BaseUrl": "https://localhost:5000"}
}

在這個配置文件中Routes定義了一個路由規則,其中DownstreamPathTemplate指定了下游服務的路徑模板,DownstreamScheme指定了下游服務使用的協議(http或https),DownstreamHostAndPorts指定了下游服務的主機和端口。而UpstreamPathTemplate則指定了上游路徑模板,即客戶端請求的路徑,最后UpstreamHttpMethod配置了允許的HTTP方法(如GET、POST等)。GlobalConfiguration它是一個全局全局配置,其中的BaseUrl指定API網關的基礎URL。
完成ocelot.json配置后,打開Program.cs文件,在Main方法中添加對ocelot.json的支持:

// 添加Ocelot配置文件
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

這樣,Ocelot將讀取并使用ocelot.json文件中的配置。啟動API網關應用,客戶端請求https://localhost:5000/users時,Ocelot會將請求轉發到http://localhost:5001/api/users

三、總結

本篇文章主要介紹了網關的概念,以及在.NET開發中常用的Ocelot 網關,從下一篇文章開始,我們將一起學習Ocelot 網關的各個功能。

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

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

相關文章

網頁制作06-html,css,javascript初認識のhtml如何建立超鏈接

超鏈接有外部鏈接、電子郵件鏈接、錨點鏈接、空鏈接、腳本鏈接 一、內部鏈接 與自身網站頁面有關的鏈接被稱為內部鏈接 1、創建內部鏈接 1&#xff09;語法&#xff1a; <a href"鏈接地址"> …… </a> 2&#xff09;舉例應用&#xff1a; 3&#xf…

MySQL后端返回給前端的時間變了(時區問題)

問題&#xff1a;MySQL里的時間例如為2025-01-10 21:19:30&#xff0c;但是返回到前端就變成了2025-01-10 13:19:30&#xff0c;會出現小時不一樣或日期變成隔日的問題 一般來說設計字段時會使用datetime字段類型&#xff0c;這是一種用于時間的字段類型&#xff0c;而這個類型…

【算法與數據結構】單調隊列

目錄 單調隊列 使用單調隊列維護滑動窗口 具體過程&#xff1a; 代碼實現&#xff1a; 復雜度分析&#xff1a; 使用單調隊列優化動態規劃 例題 單調隊列 單調隊列(deque)是一種特殊的隊列&#xff0c;隊列中的元素始終按嚴格遞增或者遞減排列。這樣就可以保證隊頭元素…

AutoGen 技術博客系列 九:從 v0.2 到 v0.4 的遷移指南

本系列博文在掘金同步發布, 更多優質文章&#xff0c;請關注本人掘金賬號&#xff1a; 人肉推土機的掘金賬號 AutoGen系列一&#xff1a;基礎介紹與入門教程 AutoGen系列二&#xff1a;深入自定義智能體 AutoGen系列三&#xff1a;內置智能體的應用與實戰 AutoGen系列四&am…

深度學習每周學習總結Y1(Yolov5 調用官方權重進行檢測 )

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客Y1中的內容 &#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制 ** 注意該訓練營出現故意不退押金&#xff0c;惡意揣測偷懶用假的結果冒充真實打卡記錄&#xff0c;在提出能夠拿到視頻錄像…

為AI聊天工具添加一個知識系統 之117 詳細設計之58 思維導圖及觀察者效應 之2 概念全景圖

&#xff08;說明&#xff1a;本文和上一篇問題基本相同&#xff0c;但換了一個模型 deepseek-r1&#xff09; Q1227、在提出項目“為使用AI聊天工具的聊天者加掛一個專屬的知識系統”后&#xff0c;我們已經進行了了大量的討論-持續了近三個月了。這些討論整體淋漓盡致體現了…

2012年IMO幾何預選題第6題

設有非等腰的 △ A B C \triangle ABC △ABC, O O O 和 I I I 分別為外心和內心. 在邊 A C AC AC, A B AB AB 上分別存在兩點 E E E 和 F F F, 使得 C D C E A B CDCEAB CDCEAB, B F B D A C BFBDAC BFBDAC. 設 ( B D F ) (BDF) (BDF) 和 ( C D E ) (CDE) (CDE)…

為Eclipse IDE安裝插件IBM編程助手watsonx Code Assistant

從Eclipse IDE 安裝 從Eclipse IDE 安裝插件&#xff1a; _1、在Eclipse IDE 中&#xff0c;單擊幫助菜單&#xff0c;然后選擇EclipseMarketplace。 _2、根據您計劃進行的工作類型選擇安裝方式&#xff1a; 有關代碼建議、代碼解釋、代碼文檔和單元測試的集成生成式人工智能&a…

Linux基本指令(三)+ 權限

文章目錄 基本指令grep打包和壓縮zip/unzipLinux和windows壓縮包互傳tar&#xff08;重要&#xff09;Linux和Linux壓縮包互傳 bcuname -r常用的熱鍵關機外殼程序 知識點打包和壓縮 Linux中的權限用戶權限 基本指令 grep 1. grep可以過濾文本行 2. 把包含9的文本行過濾出來了 …

【部署優化篇十四】【十萬字全景拆解:GitHub Actions自動化流水線設計圣經(DeepSeek工業級實踐大公開)】

一、從手工作坊到智能工廠:CI/CD的革命之路 想象一下,你所在的公司每天要手工組裝1000臺手機,每個環節都靠老師傅肉眼檢查——這就是沒有CI/CD的軟件開發現狀。GitHub Actions的出現,就像給軟件交付裝上了特斯拉的超級工廠流水線。 DeepSeek的CI/CD演進史就是一部血淚史:…

“死”循環(查漏補缺)

以下代碼會死循環&#xff1a; #include<iostream> using namespace std; int n,res; int main(){cin>>n;for(int i1;i<n;i){int xi;while(i){int ti%10;i/10;if(t2||t0||t1||t9){resx;break;}}}cout<<res<<endl;return 0; } 你的代碼中存在一個邏…

力扣LeetCode: 2506 統計相似字符串對的數目

題目&#xff1a; 給你一個下標從 0 開始的字符串數組 words 。 如果兩個字符串由相同的字符組成&#xff0c;則認為這兩個字符串 相似 。 例如&#xff0c;"abca" 和 "cba" 相似&#xff0c;因為它們都由字符 a、b、c 組成。然而&#xff0c;"aba…

關于Java 反射的簡單易懂的介紹

目錄 #0.總覽 #1. 類的反射 ①介紹 ②獲取 ③作用 獲取構造函數&#xff1a; 創建實例&#xff1a; 字段操作&#xff1a; 方法操作&#xff1a; 獲取修飾符&#xff1a; #2.總結 #0.總覽 反射&#xff0c;官方是這樣介紹它的&#xff1a; Reflection is a …

【精調】LLaMA-Factory 快速開始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下載 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…

【07】區塊鏈性能

7-1 基礎性能優化 7-1-1 區塊鏈性能瓶頸 總述 區塊鏈性能指標 區塊鏈的性能指標主要包括&#xff1a; 吞吐量&#xff1a;在固定時間內處理的交易數量 延時&#xff1a;對交易的響應和處理時間 主流區塊鏈與中心化平臺TPS對比 區塊鏈與傳統計算的對比 區塊鏈可信且中立…

安全面試2

文章目錄 簡單描述一下什么是水平越權&#xff0c;什么是垂直越權&#xff0c;我要發現這兩類漏洞&#xff0c;那我代碼審計要注意什么地方水平越權&#xff1a;垂直越權&#xff1a;水平越權漏洞的審計重點垂直越權漏洞的審計重點 解釋一下ssrf漏洞原理攻擊場景修復方法 橫向移…

【Linux 專欄】echo命令實驗

風123456789&#xff5e;-CSDN博客 最近文章閱讀排行榜 【爬蟲基礎】第一部分 網絡通訊 P1/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-Socket套接字 P2/3-CSDN博客 【Linux專欄】find命令同步 實驗-CSDN博客 【Linux運維】非root用戶的單向免密登錄_linux 單向免密-CSDN博客…

RTSP協議全解析

RTSP&#xff08;Real Time Streaming Protocol&#xff09;協議全解析 一、協議概述 定位&#xff1a;應用層協議&#xff0c;用于控制流媒體服務器&#xff08;播放、暫停、錄制&#xff09;&#xff0c;媒體傳輸由 RTP/RTCP 實現。 特點&#xff1a; 基于文本&#xff08;…

第15屆 藍橋杯 C++編程青少組中/高級選拔賽 202401 真題答案及解析

第 1 題 【 單選題 】 表達式117 % 16 的結果是( )。 A:0 B:5 C:7 D:10 解析: % 是取模運算符,用于計算兩個數相除后的余數。 計算 117 / 16,結果是 7,余數是 5。因此,117 % 16 = 5。答案: B 第 2 題 【 單選題 】 下列選項中,字符數組定義正確的是( …

qt5實現表盤的旋轉效果,通過提升QLabel類

因為工作需要&#xff0c;需要實現溫度的表盤展示效果 實現思路&#xff1a; 通過提示聲QLabel控價類&#xff0c;實現報盤的旋轉和展示效果 1. 編寫一個QLabel的類MyQLabel,實現兩個方法 1. void paintEvent(QPaintEvent *event); //重繪函數 2. void valueChanged(int va…