歡迎光臨
每天分享高質量文章

Ocelot 入門Demo系列(01-Ocelot極簡單Demo及負載均衡的配置)

來源:https://www.cnblogs.com/7tiny/p/10493805.html

【前言】

Ocelot是一個用.NET Core實現並且開源的API網關,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑒權、限流熔斷、並內置了負載均衡器與Service Fabric、Butterfly Tracing集成。這些功能只都只需要通過一個統一的Ocelot.Json配置檔案簡單的配置即可完成。

簡單的來說Ocelot是一堆的asp.net core middleware組成的一個管道。

當它拿到請求之後會用一個request builder來構造一個HttpRequestMessage發到下游的真實服務器,等下游的服務傳回response之後再由一個middleware將它傳回的HttpResponseMessage映射到HttpResponse上。

Ocelot的基本使用

用一臺web service來host Ocelot,在這裡有一個json配置檔案,裡面設置了所有對當前這個網關的配置。它會接收所有的客戶端請求,並路由到對應的下游服務器進行處理,再將請求結果傳回。而這個上下游請求的對應關係也被稱之為路由。

集成Identity Server

當我們涉及到認證和鑒權的時候,我們可以跟Identity Server進行結合。當網關需要請求認證信息的時候會與Identity Server服務器進行交互來完成。

網關集群

只有一個網關是很危險的,也就是我們通常所講的單點,只要它掛了,所有的服務全掛。這顯然無法達到高可用,所以我們也可以部署多台網關。當然這個時候在多台網關前,你還需要一臺負載均衡器。

Consul 服務發現

在Ocelot已經支持簡單的負載功能,也就是當下游服務存在多個結點的時候,Ocelot能夠承擔起負載均衡的作用。但是它不提供健康檢查,服務的註冊也只能通過手動在配置檔案裡面添加完成。這不夠靈活並且在一定程度下會有風險。這個時候我們就可以用Consul來做服務發現,它能與Ocelot完美結合。

【Demo】

  本篇文章為Ocelot入門的第一步要走的步驟,使用Ocelot作為微服務的網關

  1. Ocelot網關api的創建
  2. 三個下游Demo微服務接口的創建
  3.  網關輪詢負載均衡的演示

【實現過程】

一、創建下游微服務

1. 新建3個asp.net core webapi專案,分別命名為Service1,Service2,Service3

2. 將三個專案的啟動端口分別設置為39991,39992,39993

在每個服務的屬性設置中將服務的host端口略作修改,分別叫做39991,39992,39993

3. 將預設的/api/values接口的傳回值稍做修改,讓其比較明顯對應三個端口

 打開預設生成的/api/Values控制器Action,改造原來的Get方法傳回值,讓其對應三個端口以便提高區分度

例如Service1:

Service2和Service3依次修改

二、Ocelot網關Api

1. 新建一個asp.net core webapi專案,命名為OcelotGateway

2. 該專案引入Nuget: Ocelot 最新穩定版

3. 根目錄添加配置檔案Ocelot.json,添加上述三個api地址信息

根目錄下新建一個Jso檔案

內容如下(最簡單的配置,採用預設路由模板):

 1 {
 2   "ReRoutes": [
 3     {
 4       // - 上游服務配置
 5       "UpstreamPathTemplate": "/{url}",
 6       "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
 7 
 8       // - 下游服務配置
 9       "DownstreamPathTemplate": "/{url}",
10       "DownstreamScheme": "http",
11       "DownstreamHostAndPorts": [
12         {
13           "Host": "localhost",
14           "Port": 39991
15         },
16         {
17           "Host": "localhost",
18           "Port": 39992
19         },
20         {
21           "Host": "localhost",
22           "Port": 39993
23         }
24       ],
25 
26       // - LoadBalancer將決定負載均衡的演算法,三種取值
27       // RoundRobin:輪流發送
28       // LeastConnection:將請求發往最空閑的那個服務器
29       // NoLoadBalance:總是發往第一個請求或者是服務發現
30       "LoadBalancerOptions": {
31         "Type": "RoundRobin"
32       }
33     }
34   ],
35   "GlobalConfiguration": {
36     "BaseUrl": "https://api.mybusiness.com"
37   }
38 }

裡面指定了相關配置項:

  • 上游服務器請求路由模板
  • 下游服務器轉發時的請求路由模板
  • 下游服務器的三個相同api的不同地址(模擬負載均衡)
  • 負載均衡的策略(輪詢)

4. 調整OcelotGateway專案的Programe和Start需要配置的相關代碼(詳情見代碼)

 修改Program.cs檔案,引入Ocelot.Json

改造StartUp.cs檔案的配置項,.netcore請求管道內加入Ocelot

三、運行

1. 先同時運行三個下游微服務,可以看到三個瀏覽器視窗分別傳回了三個接口對應的傳回值

可以在vs中設置多啟動項,讓三個服務同時啟動

然後我們運行三個服務,可以看到三個瀏覽器視窗分別打開了三個服務,並傳回了Demo api的傳回值

三個微服務啟動成功

2. 運行OcelotGateway專案,可以看到傳回了第一個下游微服務的傳回值

我們單獨運行OcelotGateway專案

可以看到Ocelot服務也被host成功

並且通過通用模板轉發到了其中一個微服務上,傳回了響應值。

3. 掃清Gateway專案的視窗,可以看到根據我們配置的輪詢複雜均衡策略分別輪詢地傳回了三個接口的結果

 既然我們配置了輪詢的負載均衡,那麼我們掃清Gateway專案地址看是否會分別請求到三個微服務上。

 Gif版本:

可以看到,相同的請求被轉發到了不通的api接口上,且是按我們配置的負載均衡策略順序輪詢轉發

【專案原始碼】

專案原始碼已托管至GitHub:https://github.com/sevenTiny/Demo.Ocelot

說明:為了更好地展示我們的專案配置是漸進性的,我們採用分支策略來展示不同階段的Demo成果,master分支為當前所有配置的功能總和

例如:roadmap-01分支對應我們本篇文章的原始碼,對應說明文件 “01-Ocelot極簡單Demo及負載均衡的配置

原文地址:https://www.cnblogs.com/7tiny/p/10493805.html

    赞(0)

    分享創造快樂