Consul初探-集成ocelot

前言

因爲 Consul 的高可用性、豐富的API、友好的 Web 控制檯界面等特色,Consul 的發展很是迅猛,得益於 .NETCore 社區的快速發展和社區成員的貢獻,咱們如今能夠很是方便快速的將 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是很是的便捷,在 API Gateway 項目中,只須要經過引用一個包,就能夠在項目中服務發現了。html

今天要完成的架構圖

上面就是今天要完成的業務架構圖,客戶端、Ocelot 網關、Consul 集羣、計算器服務集羣,這幾個模塊組成了基本的分佈式網關模型。node

創建 APIGateway 項目

創建空項目

首先咱們創建一個空的 Asp.NetCore WebApplication 程序,對於一個簡單的網關程序來講,空項目足夠了,由於咱們寫代碼的地方很少git

Ocelot 的包引用

咱們只須要引用 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 服務,並使用負載均衡的機制對兩個服務進行調用。架構

爲了方便演示,這裏的計算器服務就使用上一篇的代碼 進行測試了app

運行計算器服務(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 ,謝謝支持。

相關文章
相關標籤/搜索