三、Ocelot請求聚合與負載均衡

2022-11-02 12:00:23

上一篇文章介紹了在.Net Core中如何使用Ocelot:https://www.cnblogs.com/yangleiyu/p/16847439.html

本文介紹在ocelot的請求聚合與負載均衡設定。

一、請求聚合

1、概念

Ocelot可以定義多組路由,然後根據優先順序對上游服務發出的請求進行不同的轉發處理,每個路由轉發都匹配唯一的一個下游服務API介面。但是有時候,上游服務想要獲得來自兩個API介面返回的結果。Ocelot允許我們在組態檔中宣告聚合路由Aggregates,從而實現這樣的效果

2、路由設定

 

 

 

 可以看到這裡多加了一個Key屬性。Aggregates跟Routes是同級的,而且也是一個陣列,這代表著我們可以宣告多個聚合路由,而在我們宣告的這一組聚合路由中的屬性RouteKeys,它包含的元素就是我們真正需要響應的路由的Key屬性值。

3、結果

 

 

 

 

 

 

 

4、注意事項

僅支援GET方式

下游服務返回型別要求為application/json

返回內容型別為application/json,不會返回404請求

此處必須返回Json,下游介面返回型別必須為IActionResult,如果返回String,那麼聚合返回的下游json就會是亂碼(別問我怎麼知道的,又踩坑了)

二、高階請求聚合

自定義請求聚合,此處暫不過多說明,後續介紹

三、負載均衡

我們全部的路由設定中都是一組路由設定一個下游服務地址,也就說明當上游服務請求一個Url,Ocelot就必定轉發給某一個固定的下游服務,這樣其實是不安全的,因為有可能某一個下游服務阻塞,甚至掛掉了,那就可能導致整個服務癱瘓了,這肯定是不行的。Ocelot能夠通過可用的下游服務對每個路由進行負載平衡。我們來看看具體的路由設定

 

LeadConnection負載均衡器演演算法共有4種:

LeastConnection 把新請求傳送到現有請求最少的服務上

RoundRobin 輪詢可用的服務並行送請求

NoLoadBalancer 不負載均衡,總是發往第一個可用的下游服務

CookieStickySessions 使用cookie關聯所有相關的請求到制定的服務

注意:經測,官網上面說的時輪詢可用的服務,但是測試發現並不是,不可用的會報錯

四、設定

{
  "GlobalConfiguration": {
    "BaseUrl": "http://192.168.50.118:8003/" //閘道器暴露的的地址。
  },
  "Routes": [
    {
      "UpstreamPathTemplate": "/QiantoonService/Oam", //上游Api請求路由規則
      "DownstreamPathTemplate": "/QiantoonService/Oam/Oam", //閘道器轉發到下游路由規則
      "UpstreamHttpMethod": [ "Get" ], //上下游支援請求方法
      "DownstreamScheme": "http", //下游服務設定
      "DownstreamHostAndPorts": [
        {
          "Host": "192.168.50.118", //下游地址
          "Port": 8001 //下游埠號
        }
      ],
      "Key": "Oam"
    },
    {
      "UpstreamPathTemplate": "/QiantoonService/SelfReg", //上游Api請求路由規則
      "DownstreamPathTemplate": "/QiantoonService/SelfReg/SelfReg", //閘道器轉發到下游路由規則
      "UpstreamHttpMethod": [ "Get" ], //上下游支援請求方法
      "DownstreamScheme": "http", //下游服務設定
      "DownstreamHostAndPorts": [
        {
          "Host": "192.168.50.118", //下游地址
          "Port": 8002 //下游埠號
        },
        {
          "Host": "192.168.50.118", //下游地址
          "Port": 8004 //下游埠號
        }
      ],
      "Key": "Reg",
      "LoadBalancerOptions": { "Type": "RoundRobin" }
    }
  ],
  "Aggregates": [
    {
      "RouteKeys": [
        "Oam",
        "Reg"
      ],
      "UpstreamPathTemplate": "/QiantoonService"
    }
  ]
}