Ocelot是一個用.NET Core實現而且開源的API網關,它功能強大,包括了:路由、請求聚合、服務發現、認證、鑑權、限流熔斷、並內置了負載均衡器與Service Fabric、Butterfly Tracing集成。這些功能只都只須要經過一個統一的Ocelot.Json配置文件簡單的配置便可完成。git
簡單的來講Ocelot是一堆的asp.net core middleware組成的一個管道。github
當它拿到請求以後會用一個request builder來構造一個HttpRequestMessage發到下游的真實服務器,等下游的服務返回response以後再由一個middleware將它返回的HttpResponseMessage映射到HttpResponse上。web
用一臺web service來host Ocelot,在這裏有一個json配置文件,裏面設置了全部對當前這個網關的配置。它會接收全部的客戶端請求,並路由到對應的下游服務器進行處理,再將請求結果返回。而這個上下游請求的對應關係也被稱之爲路由。算法
當咱們涉及到認證和鑑權的時候,咱們能夠跟Identity Server進行結合。當網關須要請求認證信息的時候會與Identity Server服務器進行交互來完成。json
只有一個網關是很危險的,也就是咱們一般所講的單點,只要它掛了,全部的服務全掛。這顯然沒法達到高可用,因此咱們也能夠部署多臺網關。固然這個時候在多臺網關前,你還須要一臺負載均衡器。api
在Ocelot已經支持簡單的負載功能,也就是當下遊服務存在多個結點的時候,Ocelot可以承擔起負載均衡的做用。可是它不提供健康檢查,服務的註冊也只能經過手動在配置文件裏面添加完成。這不夠靈活而且在必定程度下會有風險。這個時候咱們就能夠用Consul來作服務發現,它能與Ocelot完美結合。瀏覽器
本篇文章爲Ocelot入門的第一步要走的步驟,使用Ocelot做爲微服務的網關服務器
1、建立下游微服務負載均衡
1. 新建3個asp.net core webapi項目,分別命名爲Service1,Service2,Service3asp.net
2. 將三個項目的啓動端口分別設置爲39991,39992,39993
在每一個服務的屬性設置中將服務的host端口略做修改,分別叫作39991,39992,39993
3. 將默認的/api/values接口的返回值稍作修改,讓其比較明顯對應三個端口
打開默認生成的/api/Values控制器Action,改造原來的Get方法返回值,讓其對應三個端口以便提升區分度
例如Service1:
Service2和Service3依次修改
2、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 }
裏面指定了相關配置項:
4. 調整OcelotGateway項目的Programe和Start須要配置的相關代碼(詳情見代碼)
修改Program.cs文件,引入Ocelot.Json
改造StartUp.cs文件的配置項,.netcore請求管道內加入Ocelot
3、運行
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及負載均衡的配置」