【前言】
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作為微服務的網關
- Ocelot網關api的創建
- 三個下游Demo微服務接口的創建
- 網關輪詢負載均衡的演示
【實現過程】
一、創建下游微服務
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及負載均衡的配置”