.Net Core微服務——閘道器(2):ocelot整合consul

Max發表於2021-11-08

有consul基礎的都知道,consul可以發現新增的服務,剔除掉無效的服務,賦予應用自動伸縮的能力。而ocelot如果整合了consul,那ocelot也能擁有這些能力,還可以自主選擇負載均衡策略,靈活性更強。

(建議看完前一篇文章再來實踐這一篇,不然可能有難度)

上乾貨。

首先開啟上一篇新建好的專案,繼續新增nuget包:

然後註冊相關服務:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOcelot()
                .AddConsul()
                .AddConfigStoredInConsul();
        }

接下來還需要修改下配置檔案:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/{url}",
      "DownstreamScheme": "http",
      //"DownstreamHostAndPorts": [
      //  {
      //    "Host": "123.123.123.123",
      //    "Port": 5050
      //  }
      //],
      "UpstreamPathTemplate": "/MJ/{url}",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "ServiceName": "study_consul",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      }
    }
  ],
  "GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
      "Host": "42.193.182.64",
      "Port": 88
    }
  }
}

註釋部分是原先常規的轉發規則,變色部分是整合consul以後新增的配置。

這裡說下配置項LoadBalancerOptions(負載均衡),官方實現了4個負載均衡器,分別是:

1、LeastConnection - 跟蹤哪些服務正在處理請求,並向現有請求最少的服務傳送新請求。

2、RoundRobin - 輪詢。

3、NoLoadBalancer - 從配置或服務發現中獲取第一個可用服務。

4、CookieStickySessions - 使用 cookie 將所有請求貼上到特定伺服器。

如果選擇了第四個,那麼需要額外的引數來描述cookie,比如:

"LoadBalancerOptions": {
        "Type": "CookieStickySessions",
        "Key": "ASP.NET_SessionId",
        "Expiry": 1800000 //過期時間
    },

關於負載均衡器,本文不多做詳解,回到主題。

consul需要單獨搭建,所以我準備了一個擁有6個節點的consul叢集:

然後在叢集下注冊了3個服務:

這時執行閘道器並請求,閘道器會把請求自動轉到遠端的consul,並且在已有的consul服務中輪詢呼叫。來看一下執行結果:

多重新整理幾下:

如果你得到了類似的結果,恭喜你,已經完成了整合的操作。同時,還可以解鎖一個新操作:熱更新。

熱更新

開啟consul控制皮膚,找到Key/Value,你會發現這裡多了一個鍵值對:

進入檢視會發現,這是ocelot的配置:

這一份配置檔案裡包含了當前版本的ocelot支援的所有配置項,並且修改後即時生效。

改個路由證明下:

原來:"UpstreamPathTemplate": "/MJ/{url}"
現在:"UpstreamPathTemplate": "/{url}"

save以後再請求:

這感覺,酸爽。

既然是搞技術,自然不能脫離實際。上面的consul叢集、consul客戶端、閘道器程式都部署在不同的阿里雲伺服器上,和生產環境一樣。學習的話,部署到本機也可以,consul單機也可以。如果你沒有consul基礎或者理解的不清晰,可以看我之前的系列文章,應該有幫助,往前翻一翻就有。友情提醒一下,單體的ocelot、consul禁止上生產,太脆弱,一掛全完。

相關文章