Ocelot(九)- 教你如何配置Ocelot?


配置

可以在此處找到示例配置配置有兩個部分。一組ReRoutes和一個GlobalConfiguration。ReRoutes是告訴Ocelot如何處理上游請求的對象。全局配置有點hacky並允許覆蓋ReRoute特定設置。如果您不想管理大量ReRoute特定設置,這將非常有用。

{
    "ReRoutes": [], "GlobalConfiguration": {} } 

這是一個示例ReRoute配置,您不需要設置所有這些內容,但這是目前可用的所有內容: 

{
          "DownstreamPathTemplate": "/", "UpstreamPathTemplate": "/", "UpstreamHttpMethod": [ "Get" ], "AddHeadersToRequest": {}, "AddClaimsToRequest": {}, "RouteClaimsRequirement": {}, "AddQueriesToRequest": {}, "RequestIdKey": "", "FileCacheOptions": { "TtlSeconds": 0, "Region": "" }, "ReRouteIsCaseSensitive": false, "ServiceName": "", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 51876, } ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 0, "DurationOfBreak": 0, "TimeoutValue": 0 }, "LoadBalancer": "", "RateLimitOptions": { "ClientWhitelist": [], "EnableRateLimiting": false, "Period": "", "PeriodTimespan": 0, "Limit": 0 }, "AuthenticationOptions": { "AuthenticationProviderKey": "", "AllowedScopes": [] }, "HttpHandlerOptions": { "AllowAutoRedirect": true, "UseCookieContainer": true, "UseTracing": true }, "DangerousAcceptAnyServerCertificateValidator": false } 

有關如何使用這些選項的更多信息如下。

多種環境

像任何其他asp.net核心項目一樣,Ocelot支持配置文件名,例如configuration.dev.json,configuration.test.json等。為了實現這一點,請向您添加以下內容

.ConfigureAppConfiguration((hostingContext, config) =>
        {
            config
                .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                .AddJsonFile("appsettings.json", true, true)
                .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
                .AddJsonFile("ocelot.json")
                .AddJsonFile($"configuration.{hostingContext.HostingEnvironment.EnvironmentName}.json")
                .AddEnvironmentVariables();
        })

Ocelot現在將使用特定於環境的配置,如果沒有,則返回ocelot.json。

您還需要設置相應的環境變量ASPNETCORE_ENVIRONMENT。有關這方面的更多信息可以在asp.net核心文檔中找到

合並配置文件

問題296中請求了此功能,並允許用戶擁有多個配置文件,以便更輕松地管理大型配置。

您可以像下面一樣調用AddOcelot(),而不是直接添加配置,例如AddJsonFile(“ocelot.json”)。

.ConfigureAppConfiguration((hostingContext, config) =>
    {
        config
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
            .AddOcelot(hostingContext.HostingEnvironment)
            .AddEnvironmentVariables();
    })

在這種情況下,Ocelot將查找與模式(?i)ocelot匹配的任何文件。([a-zA-Z0-9] *。)json然后將它們合並在一起。如果要設置GlobalConfiguration屬性,則必須具有名為ocelot.global.json的文件。

Ocelot合並文件的方式基本上是加載它們,循環它們,添加任何ReRoutes,添加任何AggregateReRoutes,如果文件名為ocelot.global.json,則添加GlobalConfiguration以及任何ReRoutes或AggregateReRoutes。然后,Ocelot會將合並的配置保存到名為ocelot.json的文件中,這將在ocelot運行時用作事實的來源。

目前在此階段沒有驗證,只有在Ocelot驗證最終合並配置時才會發生。在調查問題時,需要注意這一點。如果你有任何問題,我建議你一直檢查ocelot.json中的內容。

您還可以為Ocelot提供特定路徑以查找下面的配置文件。

.ConfigureAppConfiguration((hostingContext, config) =>
    {
        config
            .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
            .AddOcelot("/foo/bar", hostingContext.HostingEnvironment)
            .AddEnvironmentVariables();
    })

Ocelot需要HostingEnvironment,因此它知道從算法中排除任何特定的環境。

在consul中存儲配置

您需要做的第一件事是安裝在Ocelot中提供Consul支持的NuGet包。

Install-Package Ocelot.Provider.Consul

然后在注冊服務時添加以下內容:Ocelot將嘗試在consul KV商店中存儲和檢索其配置。

services
   .AddOcelot() .AddConsul() .AddConfigStoredInConsul(); 

您還需要將以下內容添加到ocelot.json中。這就是Ocelot如何找到您的Consul代理並進行交互以從Consul加載和存儲配置。

"GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
        "Host": "localhost",
        "Port": 9500
    }
}

我決定在使用Raft一致性算法並發現其超級難度之后創建此功能。為什么不利用領事已經給你這個事實!我想這意味着如果你想充分利用Ocelot,你現在就把領事當作一個依賴。

在向當地領事代理發出新請求之前,此功能具有3秒ttl緩存。

更改時重新加載JSON配置

Ocelot支持在更改時重新加載json配置文件。例如,當手動更新ocelot.json文件時,以下內容將重新創建Ocelots內部配置。

config.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

配置密鑰

如果您使用Consul進行配置(或將來使用其他提供程序),您可能需要鍵入配置,以便可以進行多項配置:) 問題346中請求了此功能為了指定密鑰,您需要在配置json文件的ServiceDiscoveryProvider部分中設置ConfigurationKey屬性,例如

"GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
        "Host": "localhost",
        "Port": 9500,
        "ConfigurationKey": "Oceolot_A"
    }
}

在此示例中,Ocelot將在Consul中查找時使用Oceolot_A作為配置的關鍵。

如果未設置ConfigurationKey,則Ocelot將使用字符串InternalConfiguration作為鍵。

跟蹤重定向/使用的CookieContainer 

在ReRoute配置中使用HttpHandlerOptions來設置HttpHandler行為:

1. AllowAutoRedirect是一個值,指示請求是否應遵循重定向響應。如果請求應自動遵循來自下游資源的重定向響應,則將其設置為true; 否則是假的。默認值為false。

2. UseCookieContainer是一個值,指示處理程序是否使用CookieContainer屬性存儲服務器cookie並在發送請求時使用這些cookie。默認值為false。請注意,如果您使用CookieContainer,則Ocelot會為每個下游服務緩存HttpClient。這意味着對該DownstreamService的所有請求將共享相同的cookie。問題274是因為用戶注意到cookie正在共享而創建的。我試着想辦法解決這個問題,但我認為這是不可能的。如果不緩存客戶端,則意味着每個請求都會獲得一個新客戶端,從而獲得一個新的cookie容器。如果您從緩存的客戶端容器中清除cookie,則會因飛行請求而獲得競爭條件。這也意味着后續請求不使用先前響應中的cookie!總而言之,情況並非如此。除非你有一個非常好的理由,否則我會避免將UseCookieContainer設置為true。只需查看您的回復標題,並在下次請求時將Cookie轉發回來!

SSL錯誤

如果要忽略SSL警告/錯誤,請在ReRoute配置中設置以下內容。

"DangerousAcceptAnyServerCertificateValidator": true

我不建議這樣做,我建議您創建自己的證書,然后如果可以的話,讓本地/遠程計算機信任它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM