Ocelot简易教程(四)之请求聚合以及服务发现
上篇文章給大家講解了Ocelot的一些特性并對路由進行了詳細的介紹,今天呢就大家一起來學習下Ocelot的請求聚合以及服務發現功能。希望能對大家有所幫助。
作者:依樂祝
原文地址:https://www.cnblogs.com/yilezhu/p/9695639.html
請求聚合
Ocelot允許你聲明聚合路由,這樣你可以把多個正常的ReRoutes打包并映射到一個對象來對客戶端的請求進行響應。比如,你請求訂單信息,訂單中又包含商品信息,這里就設計到兩個微服務,一個是商品服務,一個是訂單服務。如果不運用聚合路由的話,對于一個訂單信息,客戶端可能需要請求兩次服務端。實際上這會造成服務端額外的開銷。這時候有了聚合路由后,你只需要請求一次聚合路由,然后聚合路由會合并訂單跟商品的結果都一個對象中,并把這個對象響應給客戶端。使用Ocelot的此特性可以讓你很容易的實現前后端分離的架構。
為了實現Ocelot的請求功能,你需要在ocelot.json中進行如下的配置。這里我們指定了了兩個正常的ReRoutes,然后給每個ReRoute設置一個Key屬性。最后我們再Aggregates節點中的ReRouteKeys屬性中加入我們剛剛指定的兩個Key從而組成了兩個ReRoutes的聚合。當然我們還需要設置UpstreamPathTemplate匹配上游的用戶請求,它的工作方式與正常的ReRoute類似。
注意:不要把Aggregates中UpstreamPathTemplate設置的跟ReRoutes中的UpstreamPathTemplate設置成一樣。
下面我們先上個實例例子先!演示代碼已經同步更新Github上。有興趣的朋友可以查看源碼:https://github.com/yilezhu/OcelotDemo
在開始實例前先把我們的ocelot Nuget包升級到最新的12.0.0版本,當然你也可以不進行升級。這里需要注意一下,如果你升級到12.0.0的版本的話,那么你config.AddOcelot()的用法會發生改變,需要傳入參數config.AddOcelot(hostingContext.HostingEnvironment)
1.為了演示的需要這里我們新增一個類庫項目,分別新建兩個類,一個是商品Good類,一個是訂單Order類(這里只是為了演示的需要,所以代碼很簡陋)如下所示:
接下來我們給OrderApi以及GoodApi分別新建一個控制器,并返回相應的實體。如下所示:
接下來我們分別在ocelot.good.json以及ocelot.order.json中新增一個路由,并給出Keys.如下所示:
這里注意,跟上篇文章中的路由不同的是,這里多了一個Key屬性。
在ocelot.all.json中加入聚合配置,如下所示:
注意:這里Aggregates跟ReRoutes同級,ReRouteKeys中填寫的數組就是上面步驟3中設置的Key屬性對應的值。
我們分別運行起來三個項目,然后訪問接口地址:http://localhost:1000/GetOrderDetail/1?會得到如下的聚合響應內容:
格式化后代碼如下:
眼尖的朋友可能已經猜到了。聚合路由返回的內容就是json串。json串由ReRouteKeys組成,每個Key的內容就是具體下游響應的內容了!實例代碼已經同步更新到Github上,地址:https://github.com/yilezhu/OcelotDemo
Ocelot將始終使用聚合請求返回內容類型application/json。還有需要注意的是聚合請求不會返回404請求。如果兩個下游都返回404狀態碼的話,這里聚合后的響應也不會返回404,只會返回空的json串,拿上面的實例,如果兩個下游都返回404的話,那么他的響應代碼類似下面這樣:
{ ? "Good": , ? "Order": }如果下游服務返回404,則聚合將僅為該下游服務返回任何內容。即使所有下游都返回404,它也不會將聚合響應更改為404。
服務發現
Ocelot允許您指定服務發現提供程序,并將使用它來查找Ocelot將請求轉發到的下游服務的主機和端口。目前,這僅在GlobalConfiguration部分中受支持,這意味著相同的服務發現提供程序將用于為ReRoute級別指定ServiceName的所有ReRoutes。
Consul
在使用Consul前你首先要做的就是安裝在Ocelot中提供Consul支持的NuGet包
Install-Package Ocelot.Provider.Consul
然后將下面的內容添加在ConfigureServices方法中
GlobalConfiguration中需要加入以下內容。如果您未指定主機和端口,則將使用Consul默認值。
注意:如果你采用AddOcelot()這種方式來自動加載ocelot配置文件的方式,那么你需要新建一個ocelot.global.json文件,然后加入上面的配置:如下所示:
這個上篇文章中已經進行了相關的介紹。
為了告訴Ocelot ReRoute是為其主機和端口使用服務發現提供程序,您必須在下游請求時添加要使用的ServiceName和負載均衡器。目前,Ocelot可以使用RoundRobin和LeastConnection算法。如果未指定負載均衡器,則Ocelot將不會對請求進行負載均衡。
設置此項后,Ocelot將從服務發現提供程序中查找下游主機和端口,并跨任何可用服務進行負載平衡請求。
動態路由
作者的想法是在使用服務發現提供程序時啟用動態路由。在此模式下,Ocelot將使用上游路徑的第一個段來與服務發現提供程序一起查找下游服務。
例如,使用https://api.yilezhu.cn/product/products 等網址調用ocelot 。Ocelot將采用產品路徑的第一部分product,并將其用作在Consul中查找服務的Key。如果consul返回一個服務,Ocelot將使用從consul返回的主機和端口以及剩余路徑段組合后的Url來進行請求的響應。,如:http:// hostfromconsul:portfromconsul/products。Ocelot將正常向下游URL轉發查詢字符串。即query
要啟用動態路由,您需要在配置中保留0個ReRoutes。目前您無法混合動態和配置ReRoutes。除此之外,您還需要指定上面概述的Service Discovery提供程序詳細信息和下游http / https方案作為DownstreamScheme。
除此之外,您還可以設置RateLimitOptions,QoSOptions,LoadBalancerOptions和HttpHandlerOptions,DownstreamScheme(您可能希望在https上調用Ocelot,但可以通過http與私有服務進行通信),這些將應用于所有動態ReRoutes。
配置可能看起來像:
Ocelot還允許您設置DynamicReRoutes,允許您為每個下游服務設置速率限制規則。如果您有一個產品和搜索服務,并且您希望對另一個進行速率限制,則此功能非常有用。這方面的一個例子如下。
此配置意味著如果您在/product/上進入Ocelot請求,則動態路由將啟動,并且ocelot將使用針對DynamicReRoutes部分中的產品服務的速率限制設置。
GitHub地址
https://github.com/yilezhu/OcelotDemo
總結
本文接著上篇文章進行了Ocelot請求聚合功能以及服務發現功能的介紹,并且對Ocelot動態路由功能也進行了簡單的闡述。對于請求聚合這塊進行了相關實例代碼的演示,并已經更新到Github上面了!希望能對大家有所幫助!
相關文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的開源網關實現
.NET Core微服務之基于Ocelot+IdentityServer實現統一驗證與授權
Swagger如何訪問Ocelot中帶權限驗證的API
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
.NET Core微服務之基于Ocelot實現API網關服務
.NET Core微服務之基于Ocelot實現API網關服務(續)
.NET微服務體系結構中為什么使用Ocelot實現API網關
Ocelot簡易教程(一)之Ocelot是什么
Ocelot簡易教程(二)之快速開始1
Ocelot簡易教程(二)之快速開始2
Ocelot簡易教程(三)之主要特性及路由詳解
原文地址:?https://www.cnblogs.com/yilezhu/p/9664977.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的Ocelot简易教程(四)之请求聚合以及服务发现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【活动(广州)】office365的开发
- 下一篇: HttpClientFactory系列二