Consul初探-整合ocelot
前言
由於 Consul 的高可用性、豐富的API、友好的 Web 控制檯介面等特點,Consul 的發展非常迅猛,得益於 .NETCore 社群的快速發展和社群成員的貢獻,我們現在可以非常方便快速的將 Consul 整合到 .NETCore 中,在 Ocelot 的整合方面也是非常的便捷,在 API Gateway 專案中,只需要通過引用一個包,就可以在專案中服務發現了。
今天要完成的架構圖
上面就是今天要完成的業務架構圖,客戶端、Ocelot 閘道器、Consul 叢集、計算器服務叢集,這幾個模組組成了基本的分散式閘道器模型。
建立 APIGateway 專案
建立空專案
首先我們建立一個空的 Asp.NetCore WebApplication 程式,對於一個簡單的閘道器程式來說,空專案足夠了,因為我們寫程式碼的地方不多
Ocelot 的包引用
我們只需要引用 Ocelot.Provider.Consul ,即可完成 ocelot 和 consul 的依賴引用
配置閘道器
首先,我們需要為 ocelot 閘道器編寫一個配置檔案,ocelot 的配置功能非常豐富,具體參考:https://ocelot.readthedocs.io/en/latest/,本次我們只編寫一個最簡單的 ocelot.json 檔案,該配置檔案決定了客戶端的請求該如何轉發到從 Consul 發現到真正的服務例項中。
{ "ReRoutes": [ { "UseServiceDiscovery": true, // 使用服務發現 "DownstreamPathTemplate": "/{url}", // 轉發路由規則 "DownstreamScheme": "http", // 協議 "ServiceName": "node-1", // 服務名稱 "LoadBalancerOptions": { // 負載均衡的演算法(這裡使用平均) "Type": "RoundRobin" }, "UpstreamPathTemplate": "/{url}", // 下游請求路由 "UpstreamHttpMethod": [ "Get", "Post" ], // 支援請求方法 "ReRoutesCaseSensitive": false // 路由大小寫敏感設定 } ], "GlobalConfiguration": { // 閘道器全域性配置 "RequestKey": "OcRequestId", "ServiceDiscoveryProvider": { // 服務發現的配置 "Host": "172.16.1.218", "Port": 8500, "ConfigurationKey": "node-1" } } }
上面就是 ocelot 閘道器的配置,接下來,還需要在 Startup.cs 類中進行簡單的配置。
進行服務注入
public void ConfigureServices(IServiceCollection services) { var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build(); services.AddOcelot(ocelotConfig) .AddConsul() .AddConfigStoredInConsul(); }
首先載入 ocelot.json 檔案,然後將配置注入到服務中
設定路由轉發
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHttpsRedirection()
.UseOcelot()
.Wait();
}
通過上面的程式碼,將 ocelot 注入請求管道中,到這裡,配置的工作就已經完成了
建立一個計算器服務
為了演示閘道器轉發和服務發現,我們需要構建一個簡單的計算器服務,我準備使用該計算器服務執行兩個例項,兩個例項運行於同一臺伺服器上,分別偵聽 12008/12009 埠,在服務啟動後,該計算器服務將會自動的把自己註冊到 Consul 代理伺服器叢集中,然後 APIGateway 閘道器從 Consul 發現 12008/12009 服務,並使用負載均衡的機制對兩個服務進行呼叫。
為了方便演示,這裡的計算器服務就使用上一篇的程式碼 進行測試了
執行計算器服務(12008/12009)
我們需要啟動兩個服務例項,然後註冊到 Consul 中,啟動服務
檢視 Consul 代理伺服器叢集的狀態
服務註冊正常
啟動 ocelot 閘道器
訪問 Ocelot 閘道器
計算器服務(12008/12009) 服務例項提供的路由地址為:/home/add/{x:int}/{y:int} ,ocelot 閘道器的偵聽地址為:http://172.16.10.227:12200 ,根據路由轉發規則,ocelot 閘道器會把客戶端的請求完整的轉發到 12008/12009 服務例項上,所以我們可以通過下面的 url 請求服務,即:ocelot閘道器+12008/12009 路由,組合起來就是:http://172.16.10.227:12200/home/add/{x:int}/{y:int},那麼真正的請求 url 為:http://172.16.10.227:12200/home/add/10/10,預期輸出結果為:30
通過上面的輸出,可以看到,從閘道器到真正的服務例項,這個環節已經打通了,通過不斷的重新整理網頁請求,下方的兩個服務例項總是一前一後的持續輸出日誌,這就足以證明我們在 ocelot 服務閘道器配置的負載均衡演算法 "Type": "RoundRobin" 發揮了作用。
ocelot 配置檔案管理
通過檢視 Consul Web 控制檯的介面的 Key/Value 選單,發現 ocelot 將配置檔案 ocelot.json 儲存到 Consul 中了,我們可以在 Consul 中對閘道器進行視覺化管理,修改儲存即可。
結束語
從實驗結果看,在 .NETCore 中整合 APIGateway 和 Consul 還是比較簡單的事情,當然,大部分的專案在專案開放程序中,大概率是不會一次性使用到這麼多元件的,不過我相信,隨著架構的演進,這些專案最終也不得不考慮服務註冊、發現、排程、負載均衡等這些問題,引入閘道器,就勢在必行了。
.NETCore 整合 Consul 導讀
- 1、Consul初探-在深交之前先認識
- 2、Consul初探-從安裝到執行
- 3、Consul初探-服務註冊和發現
- 4、Consul初探-整合ocelot
原始碼下載
本文所有原始碼已託管到 Github ,歡迎下載測試 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,如果覺得還行,請點選 star ,謝謝支援