前言
由於 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 導讀
源代碼下載
本文所有源代碼已托管到 Github ,歡迎下載測試 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,如果覺得還行,請點擊 star ,謝謝支持。