目錄
一、目的
二、Ocelot介紹
三、.Net中使用Ocelot搭建網關服務
3.1?搭建網關Ocelot步驟
?3.1.1、創建Net7 WebApi服務
3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)
3.1.3、配置中間件和IOC注冊
3.1.4?配置文件編輯Ocelot網關配置信息
3.2?Ocelot相關配置
3.2.1?單地址訪問
3.2.2?多地址訪問
3.2.3?單地址多實例負載均衡
3.2.4?負載均衡+Consul(服務發現)
四、文章總結
一、目的
?????????在微服務架構中,網關作為系統的統一入口,承擔著路由轉發、負載均衡、安全控制等核心功能,是確保系統高效運行的關鍵組件。市面上一些主流網關:Kong、Envoy、Spring Cloud Gateway、Bumblebee、Ocelot(C#開源-微軟-騰訊---Abp.vnext內置)。
? ? ? ? 這里主要講解通過Ocelot設計微服務Api網關。
二、Ocelot介紹
????????Ocelot網關是一款基于.NET Core開發的開源API網關,專為微服務架構設計,其主要作用包括統一管理客戶端請求、提升系統安全性和可維護性?.
????網關的作用包括:
- ?請求路由?:通過配置文件定義路由規則,將客戶端請求動態轉發到對應的下游服務,支持路徑占位符(如
/{userId}
)和通配符匹配?。 - ?負載均衡?:集成輪詢、隨機、最少連接數等算法,分發請求到多個服務實例,提高可用性和性能?。
- ?服務發現?:自動集成Consul或Eureka等注冊中心,實時發現服務地址,減少手動配置負擔?。
- ?認證與授權?:支持JWT、OAuth2等認證方式,實現統一身份驗證和基于角色的訪問控制(RBAC),保障資源安全?。
- ?限流與熔斷?:采用令牌桶算法限制請求速率,防止服務過載;熔斷機制在服務故障時快速失敗,避免級聯崩潰?。
- ?請求聚合?:合并多個下游服務的響應為單一結果,減少客戶端請求次數,優化用戶體驗?。
- ?日志與監控?:記錄請求日志和性能指標,支持與Serilog、Prometheus等工具集成,便于運維分析和優化?。
- ?統一入口?:作為微服務架構的單一接入點,屏蔽后端服務復雜性,降低客戶端與服務間的耦合度?。
三、.Net中使用Ocelot搭建網關服務
3.1?搭建網關Ocelot步驟
?3.1.1、創建Net7 WebApi服務
3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)
????????dotnet add packages Ocelot
3.1.3、配置中間件和IOC注冊
//配置Ocelot中間件設置和注冊到Ioc
builder.Services.AddOcelot();//使用Ocelot中間件
app.UseOcelot();
3.1.4?配置文件編輯Ocelot網關配置信息
為了便于區分,新增一個configuration配置文件用來編輯Ocelot網關相關信息。
創建了配置文件就需要在重新讀取配置文件,appsettings是默認讀取的,這里需要在讀取configuration中的內容:
builder.Configuration.AddJsonFile("configuration.json", true, true);
3.2?Ocelot相關配置
? ? ? ? Ocelot在注冊服務到Ioc時,AddOcelot方法在構建Ocelot服務時,對通過讀取配置文件中的信息來設置相關服務。以下是幾種常見的服務配置方式。
3.2.1?單地址訪問
? ? ? ? 這里配置了單地址轉發,通過配置文件定義路由規則,將請求動態轉發到對應的下游服務,通過占位符"/Test80"和通配符訪問。
{"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 80 //服務端口} //http://127.0.0.1:80],"UpstreamPathTemplate": "/Test80/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]}]
}
3.2.2?多地址訪問
? ? ? 網關支持多個服務地址,轉發請求。模擬客戶端請求不同的服務示例。如:
訪問: https://網關ip:80/Test81/Test/Get
// //*****************************多地址********************************
{"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 81 //服務端口}],"UpstreamPathTemplate": "/Test81/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]},{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 82 //服務端口}],"UpstreamPathTemplate": "/Test82/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]},{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 83 //服務端口}],"UpstreamPathTemplate": "/Test83/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]}]
}
3.2.3?單地址多實例負載均衡
????????可以負載均衡,客戶端請求網關時,會根據負載策略去匹配不同的示例。但是不能動態伸縮服務, 所以一般不會使用他來做負載均衡, 需要和Consul做集成。這種處理方式和nginx的負載很像。
//*****************************單地址多實例負載均衡********************************
{"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 81},{"Host": "127.0.0.1","Port": 82},{"Host": "127.0.0.1","Port": 83} //能負載均衡,但是不能動態伸縮, 需要結合Consul來完成],"UpstreamPathTemplate": "/Test/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ],"LoadBalancerOptions": {"Type": "RoundRobin" //輪詢 // "LeastConnection" //最小連接數的服務器 "NoLoadBalance" //不負載均衡 }}]
}
3.2.4?負載均衡+Consul(服務發現)
? ? ? ? 1、在網關中配置Consul,注冊Consul到Ocelot中,引用Ocelot.Provider.Consul
dotnet add package Ocelot.Provider.Consul
? ? ? ? 2、配置Consul注冊到Ocelot
builder.Services.AddOcelot().AddConsul();
ps:ocelot請求時,通過Consul獲取的默認服務名稱會通過本機名字匹配。默認請求時可能會出現通過consul訪問對應服務節點的情況。(此處測試時Consul在window上運行)
解決方案:啟動Consul的node節點.此處寫上服務端地址
//設置node地址
consul agent -dev -node=127.0.0.1
? ? ? ? 3、Json配置內容
//*****************************Consul服務發現
{"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址--url變量"DownstreamScheme": "http","UpstreamPathTemplate": "/Test/{url}", //網關地址--url變量"UpstreamHttpMethod": [ "Get", "Post" ],"UseServiceDiscovery": true,"ServiceName": "TestService", //consul服務名稱"LoadBalancerOptions": {"Type": "RoundRobin" //輪詢 "LeastConnection-最少連接數的服務器NoLoadBalance不負載均衡"}}],"GlobalConfiguration": {//"BaseUrl": "http://127.0.0.1:6299", //網關對外地址"ServiceDiscoveryProvider": {"Host": "127.0.0.1","Port": 8500,"Type": "Consul" //由Consul提供服務發現,每次請求去consul}}
}
四、文章總結
? ? ? ? 以上內容基本滿足網關搭建的使用,本篇主要介紹基礎的使用方式。Ocelot還有更多高級的用法,也會在后面的文章中慢慢補上。例如:Ocelot緩存、自定義負載均衡規則以及接入Polly的服務治理相關。
????????歡迎大家多多交流~