介紹:
Ocelot是一個.NET API網關。該項目針對的是使用.NET運作微服務/面向服務架構的人員,他們需要一個統一的入口進入他們的系統。然而,它可以處理任何說HTTP并在ASP.NET Core支援的任何平台上運作的任何東西。
Ocelot是一組按特定順序的中間件,Ocelot操縱HttpRequest對象進入由其配置指定的狀态,直到它到達請求生成器中間件,在該中間件中建立HttpRequestMessage對象,該對象用于向下遊服務送出請求。提出請求的中間件是Ocelot管道中的最後一件事。它不叫下一個中間件。來自下遊服務的響應存儲在每個請求作用域存儲庫中,并在請求傳回到Ocelot管道時進行恢複。有一件中間件将HttpResponseMessage映射到HttpResponse對象上,并傳回給用戶端。這基本上是與其他一些功能。
Ocelot隻能用于.NET Core,并且目前已經建構到netstandard2.0。所有下面 我們使用.NET Core 2.1做示範。
建立一個基本示例:
首先我們建立一個.NET Core 2.1空項目。
當然我們還是要先引用的拉, Nuget 指令行: Install-Package Ocelot
配置:添加一個json檔案實作最基本的配置:
{
"ReRoutes": [],
"GlobalConfiguration": {
"BaseUrl": "urladdress"
}
}
這裡最重要的是BaseUrl。Ocelot需要知道它正在運作的URL,以便執行标題查找和替換以及某些管理配置。當設定這個URL時,它應該是用戶端将看到的Ocelot運作的外部URL。
然後我們将剛才的配置檔案加入到ASP.NET Core Configuration:Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) =>
{
builder
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("ocelot.json");
})
.UseStartup<Startup>();
View Code
最後在添加服務以及設定中間件:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot();//添加ocelot服務
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseOcelot().Wait();//設定所有的Ocelot中間件
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
這些就是基本的所需程式設計代碼。
配置檔案的詳細分析:
Ocelot的主要功能是收取HTTP請求并将它們轉發到下遊服務。目前以另一個http請求的形式出現。Ocelot描述了将一個請求作為ReRoute路由到另一個請求。為了在Ocelot中獲得任何工作,您需要在配置中設定ReRoute。
說道這裡我們補充一下剛才寫的json檔案的兩個根節點:ReRoutes和GlobalConfiguration。
ReRoutes:是一個數組,其中的每一個元素代表了一個路由,我們可以針對每一個路由進行以上功能配置,告訴Ocelot如何處理上遊請求的對象。
GlobalConfiguration:全局配置,可以适當的節約配置,比如baseurl節點,服務發現配置。
這樣我們就實作了通過配置檔案可以完成對Ocelot的功能配置:路由、服務聚合、服務發現、認證、鑒權、限流、熔斷、緩存、Header頭傳遞等。
配置一個示例:下面這個配置資訊就是将使用者的請求 /ProductService/1 轉發到 localhost:8001/api/Test/1

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/Test/{postId}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 8001
}
],
"UpstreamPathTemplate": "/ProductService/{postId}",
"UpstreamHttpMethod": [ "Get", "Delete" ]
}
],
"GlobalConfiguration": {
// "BaseUrl": "http://127.0.0.1:8887/"
}
}
- DownstreamPathTemplate:下遊方位url路徑
- DownstreamScheme:下遊服務http schema
- DownstreamHostAndPorts:下遊服務的位址,如果使用LoadBalancer的話這裡可以填多項
- UpstreamPathTemplate: 上遊也就是使用者輸入的請求Url模闆
- UpstreamHttpMethod: 上遊請求http方法,可使用數組:Get ,Delete等
好了這樣就實作了一個基本的Ocelot網關的轉發示例。
下面讓我們來看一下效果吧:
首先我們運作起來webapi項目釋出在8001端口。然後通路位址是:http://127.0.0.1:8001/api/Test/5
我們看到的結果是:
然後我們啟動我們的網關服務;釋出在端口8888下,根據以上配置我們可以看到方位位址為:http://127.0.0.1:8888/ProductService/5
然後同樣的請求結果是:
這樣我們就實作使用統一網關來通路不同的位址,以便我們以後實作微服務的分發部署,雖然是不是多個接口,但是我們給上遊通路還是提供一個接口,我們内部實作通路該通路那個接口。
至于具體怎釋出也可參考這篇文章:http://www.cnblogs.com/yanbigfeg/p/9198345.html
路由小知識:
UpstreamHost=>"UpstreamHost": "baidu.com":上遊主機
此功能允許您基于上遊主機進行ReRoutes。這通過檢視用戶端使用的主機頭來工作,然後将其用作我們用來識别ReRoute的資訊的一部分。這樣就是顯示了隻有在主機頭值為baidu.com時才會比對。
Priority=> "Priority": 0:優先級
此功能設定通路路由的優先級,假設在同一個路由下有多個路由,會根據優先級比對優先級最高的,0是最低的。
Dynamic Routing:動态路由
這個主要是為了服務發現而實作的,在這種模式下,Ocelot将使用上遊路徑的第一個分段來查找服務發現提供商的下遊服務。官網給出的大概配置效果:

{
"ReRoutes": [],
"Aggregates": [],
"GlobalConfiguration": {
"RequestIdKey": null,
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8510,
"Type": null,
"Token": null,
"ConfigurationKey": null
},
"RateLimitOptions": {
"ClientIdHeader": "ClientId",
"QuotaExceededMessage": null,
"RateLimitCounterPrefix": "ocelot",
"DisableRateLimitHeaders": false,
"HttpStatusCode": 429
},
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 0,
"DurationOfBreak": 0,
"TimeoutValue": 0
},
"BaseUrl": null,
"LoadBalancerOptions": {
"Type": "LeastConnection",
"Key": null,
"Expiry": 0
},
"DownstreamScheme": "http",
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
"UseCookieContainer": false,
"UseTracing": false
}
}
}
Ocelot實作多個端口的輪詢:
以上實作的這個有什麼用啊,單獨釋出了接口,然後使用另外一個接口去複制他嗎?别急,這隻是其中的一個基本使用,現在我們有了基本步驟,我們改一改,實作webapi釋出兩個接口,8001,8002.然後還使用網關位址通路,可以循環的通路到8001端口和8002端口。
說起來簡單,做起來也簡單,我們隻需要在我們上面的配置上修改一下即可:

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/Test/{postId}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 8001
},
{
"Host": "127.0.0.1",
"Port": 8002
}
],
"UpstreamPathTemplate": "/ProductService/{postId}",
"UpstreamHttpMethod": [ "Get" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
// "BaseUrl": "http://127.0.0.1:8887/"
}
}
啟動兩個端口:
重複請求網關兩次結果:
Ocelot+ Consul:
實作目标:啟動服務發現然後模拟叢集釋出功能,實作釋出端口8001,8002後,啟動服務發現,然後配置Ocelot網關。實作通路統一接口可以輪詢通路8001,8002,8001,8002,...這樣。然後可以在添加8003,繼續規則。
實作以上目标我們不需要該我們的示例代碼,隻需要修改配置json檔案即可:

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/Test/{postId}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/Product123Service/{postId}",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "ProductService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UseServiceDiscovery": true
}
],
"GlobalConfiguration": {
// "BaseUrl": "http://127.0.0.1:8887/"
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8500,
"Type": "PollConsul",
"PollingInterval": 100
}
}
}
這個就是我們的服務功能:
Ocelot允許您指定服務發現提供程式,并使用它來查找Ocelot正在将請求轉發給下遊服務的主機和端口。目前,這僅在GlobalConfiguration部分中受支援,這意味着将為所有的ReRoute使用相同的服務發現提供程式,以便在ReRoute級别指定ServiceName。
- ServiceName:consul的服務名稱
- LoadBalancerOptions:使用的算法,目前有兩種RoundRobin(輪詢方式)和LeastConnection(最小連接配接)
- UseServiceDiscovery:是否啟用服務發現功能 true:為啟動
- ServiceDiscoveryProvider:配置服務發現的一些配置
- Host:主機位址
- Port:端口
- PollingInterval:輪詢的間隔時間,以毫秒為機關。并告訴Ocelot多久可以向Consul調用服務配置的更改
想要了解更多可以通路Ocelot官網:http://ocelot.readthedocs.io/en/latest/features/servicediscovery.html
系列目錄:
微服務系列文章主要介紹微服務所使用到的一些技術和一些技術示例:
- 微服務——微服務的介紹和目錄
- 微服務——【Consul】服務發現在windows下簡單使用(一)
- 微服務——【polly】微服務故障處理庫(二)
- 微服務——動态代理AspectCore的使用(三)
- 微服務——網關Ocelot+Consul實作叢集輪詢(四)
作者:YanBigFeg ——
顔秉鋒出處:http://www.cnblogs.com/yanbigfeg
本文版權歸作者和部落格園共有,歡迎轉載,轉載請标明出處。如果您覺得本篇博文對您有所收獲,覺得小弟還算用心,請點選右下角的 [推薦],謝謝!