來源:https://www.cnblogs.com/7tiny/p/10493805.html
【前言】
Ocelot是一個用.NET Core實現並且開源的API閘道器,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑒權、限流熔斷、並內建了負載均衡器與Service Fabric、Butterfly Tracing整合。這些功能只都只需要透過一個統一的Ocelot.Json配置檔案簡單的配置即可完成。
簡單的來說Ocelot是一堆的asp.net core middleware組成的一個管道。
當它拿到請求之後會用一個request builder來構造一個HttpRequestMessage發到下游的真實伺服器,等下游的服務傳回response之後再由一個middleware將它傳回的HttpResponseMessage對映到HttpResponse上。
Ocelot的基本使用
用一臺web service來host Ocelot,在這裡有一個json配置檔案,裡面設定了所有對當前這個閘道器的配置。它會接收所有的客戶端請求,並路由到對應的下游伺服器進行處理,再將請求結果傳回。而這個上下游請求的對應關係也被稱之為路由。
整合Identity Server
當我們涉及到認證和鑒權的時候,我們可以跟Identity Server進行結合。當閘道器需要請求認證資訊的時候會與Identity Server伺服器進行互動來完成。
閘道器叢集
只有一個閘道器是很危險的,也就是我們通常所講的單點,只要它掛了,所有的服務全掛。這顯然無法達到高可用,所以我們也可以部署多臺閘道器。當然這個時候在多臺閘道器前,你還需要一臺負載均衡器。
Consul 服務發現
在Ocelot已經支援簡單的負載功能,也就是當下游服務存在多個結點的時候,Ocelot能夠承擔起負載均衡的作用。但是它不提供健康檢查,服務的註冊也只能透過手動在配置檔案裡面新增完成。這不夠靈活並且在一定程度下會有風險。這個時候我們就可以用Consul來做服務發現,它能與Ocelot完美結合。
【Demo】
本篇文章為Ocelot入門的第一步要走的步驟,使用Ocelot作為微服務的閘道器
- Ocelot閘道器api的建立
- 三個下游Demo微服務介面的建立
- 閘道器輪詢負載均衡的演示
【實現過程】
一、建立下游微服務
1. 新建3個asp.net core webapi專案,分別命名為Service1,Service2,Service3
2. 將三個專案的啟動埠分別設定為39991,39992,39993
在每個服務的屬性設定中將服務的host埠略作修改,分別叫做39991,39992,39993
3. 將預設的/api/values介面的傳回值稍做修改,讓其比較明顯對應三個埠
開啟預設生成的/api/Values控制器Action,改造原來的Get方法傳回值,讓其對應三個埠以便提高區分度
例如Service1:
Service2和Service3依次修改
二、Ocelot閘道器Api
1. 新建一個asp.net core webapi專案,命名為OcelotGateway
2. 該專案引入Nuget: Ocelot 最新穩定版
3. 根目錄新增配置檔案Ocelot.json,新增上述三個api地址資訊
根目錄下新建一個Jso檔案
內容如下(最簡單的配置,採用預設路由模板):
1 { 2 "ReRoutes": [ 3 { 4 // - 上游服務配置 5 "UpstreamPathTemplate": "/{url}", 6 "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ], 7 8 // - 下游服務配置 9 "DownstreamPathTemplate": "/{url}", 10 "DownstreamScheme": "http", 11 "DownstreamHostAndPorts": [ 12 { 13 "Host": "localhost", 14 "Port": 39991 15 }, 16 { 17 "Host": "localhost", 18 "Port": 39992 19 }, 20 { 21 "Host": "localhost", 22 "Port": 39993 23 } 24 ], 25 26 // - LoadBalancer將決定負載均衡的演演算法,三種取值 27 // RoundRobin:輪流傳送 28 // LeastConnection:將請求發往最空閑的那個伺服器 29 // NoLoadBalance:總是發往第一個請求或者是服務發現 30 "LoadBalancerOptions": { 31 "Type": "RoundRobin" 32 } 33 } 34 ], 35 "GlobalConfiguration": { 36 "BaseUrl": "https://api.mybusiness.com" 37 } 38 }
裡面指定了相關配置項:
- 上游伺服器請求路由模板
- 下游伺服器轉發時的請求路由模板
- 下游伺服器的三個相同api的不同地址(模擬負載均衡)
- 負載均衡的策略(輪詢)
4. 調整OcelotGateway專案的Programe和Start需要配置的相關程式碼(詳情見程式碼)
修改Program.cs檔案,引入Ocelot.Json
改造StartUp.cs檔案的配置項,.netcore請求管道內加入Ocelot
三、執行
1. 先同時執行三個下游微服務,可以看到三個瀏覽器視窗分別傳回了三個介面對應的傳回值
可以在vs中設定多啟動項,讓三個服務同時啟動
然後我們執行三個服務,可以看到三個瀏覽器視窗分別開啟了三個服務,並傳回了Demo api的傳回值
三個微服務啟動成功
2. 執行OcelotGateway專案,可以看到傳回了第一個下游微服務的傳回值
我們單獨執行OcelotGateway專案
可以看到Ocelot服務也被host成功
並且透過通用模板轉發到了其中一個微服務上,傳回了響應值。
3. 掃清Gateway專案的視窗,可以看到根據我們配置的輪詢複雜均衡策略分別輪詢地傳回了三個介面的結果
既然我們配置了輪詢的負載均衡,那麼我們掃清Gateway專案地址看是否會分別請求到三個微服務上。
Gif版本:
可以看到,相同的請求被轉發到了不通的api介面上,且是按我們配置的負載均衡策略順序輪詢轉發
【專案原始碼】
專案原始碼已託管至GitHub:https://github.com/sevenTiny/Demo.Ocelot
說明:為了更好地展示我們的專案配置是漸進性的,我們採用分支策略來展示不同階段的Demo成果,master分支為當前所有配置的功能總和
例如:roadmap-01分支對應我們本篇文章的原始碼,對應說明檔案 “01-Ocelot極簡單Demo及負載均衡的配置”
原文地址:https://www.cnblogs.com/7tiny/p/10493805.html