因爲 Consul 的高可用性、豐富的API、友好的 Web 控制檯界面等特色,Consul 的發展很是迅猛,得益於 .NETCore 社區的快速發展和社區成員的貢獻,咱們如今能夠很是方便快速的將 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是很是的便捷,在 API Gateway 項目中,只須要經過引用一個包,就能夠在項目中服務發現了。html
上面就是今天要完成的業務架構圖,客戶端、Ocelot 網關、Consul 集羣、計算器服務集羣,這幾個模塊組成了基本的分佈式網關模型。node
首先咱們創建一個空的 Asp.NetCore WebApplication 程序,對於一個簡單的網關程序來講,空項目足夠了,由於咱們寫代碼的地方很少git
咱們只須要引用 Ocelot.Provider.Consul ,便可完成 ocelot 和 consul 的依賴引用github
首先,咱們須要爲 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 類中進行簡單的配置。json
public void ConfigureServices(IServiceCollection services) { var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build(); services.AddOcelot(ocelotConfig) .AddConsul() .AddConfigStoredInConsul(); }
首先加載 ocelot.json 文件,而後將配置注入到服務中api
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHttpsRedirection() .UseOcelot() .Wait(); }
經過上面的代碼,將 ocelot 注入請求管道中,到這裏,配置的工做就已經完成了服務器
爲了演示網關轉發和服務發現,咱們須要構建一個簡單的計算器服務,我準備使用該計算器服務運行兩個實例,兩個實例運行於同一臺服務器上,分別偵聽 12008/12009 端口,在服務啓動後,該計算器服務將會自動的把本身註冊到 Consul 代理服務器集羣中,而後 APIGateway 網關從 Consul 發現 12008/12009 服務,並使用負載均衡的機制對兩個服務進行調用。架構
爲了方便演示,這裏的計算器服務就使用上一篇的代碼
咱們須要啓動兩個服務實例,而後註冊到 Consul 中,啓動服務
服務註冊正常
計算器服務(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" 發揮了做用。
經過查看 Consul Web 控制檯的界面的 Key/Value 菜單,發現 ocelot 將配置文件 ocelot.json 存儲到 Consul 中了,咱們能夠在 Consul 中對網關進行可視化管理,修改保存便可。
從實驗結果看,在 .NETCore 中集成 APIGateway 和 Consul 仍是比較簡單的事情,固然,大部分的項目在項目開放進程中,大機率是不會一次性使用到這麼多組件的,不過我相信,隨着架構的演進,這些項目最終也不得不考慮服務註冊、發現、調度、負載均衡等這些問題,引入網關,就勢在必行了。
本文全部源代碼已託管到 Github ,歡迎下載測試 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,若是以爲還行,請點擊 star ,謝謝支持。