Ocelot中文文件-配置
這裡有一個配置的列子。其中有兩個配置塊。一個ReRoutes陣列和一個GlobalConfiguration。ReRoutes配置塊是一些告訴Ocelot如何處理上游請求的物件。Globalconfiguration有些奇特,可以覆蓋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 }, "UseServiceDiscovery": false, "DangerousAcceptAnyServerCertificateValidator": false }
有關如何使用這些選項的更多資訊如下..
多環境
和其他任何asp.net core專案一樣,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 core 文件.
合併配置檔案
此功能在問題Issue 296提出要求,並允許使用者有多個配置檔案,以便管理大型配置。
不直接使用.AddJsonFile("ocelot.json")這樣新增配置,還可以使用AddOcelot()方法新增
.ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("appsettings.json", true, true) .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true) .AddOcelot() .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中的內容。
將配置儲存在consul中
如果您在註冊服務時新增以下內容,Ocelot將嘗試在consul的KV資料中儲存和檢索其配置。
services
.AddOcelot()
.AddStoreOcelotConfigurationInConsul();
您還需要將以下內容新增到您的ocelot.json中。 這使Ocelot知道如何找到您的Consul代理並進行互動以及從Consul載入和儲存配置。
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 9500
}
}
我在研究過raft演算法並發現其超級之難後決定建立此功能。 為什麼不利用Consul已經給你的這個便利呢!我想這意味著如果你想最大限度地使用Ocelot,你現在就需要將Consul作為依賴。
此功能在向本地consul代理髮出新請求之前有3秒TTL快取。
重定向 / 使用CookieContainer
在ReRoute配置中使用HttpHandlerOptions來設定HttpHandler行為:
AllowAutoRedirect的值指示請求是否應該遵循重定向響應。 如果請求應該自動重定向來自下游資源的響應,請將其設定為true; 否則為false。 預設值是false。
UseCookieContainerd的值指示處理程式是否使用CookieContainer屬性儲存伺服器cookie,並在傳送請求時使用這些cookie。預設值是false。值得注意的是,如果您使用CookieContainer,Ocelot為每個下游服務快取HttpClient。這意味著對該下游的所有請求都將共享相同的Cookie。 問題274的提出是因為使用者觀察到Cookie被共享了。我試圖想出一個好的解決方案,但我認為是不可能的。如果您不快取客戶端,這意味著每個請求都獲得一個新客戶端並因此獲得一個新的cookie容器。如果您清除快取客戶端容器中的Cookie,則會因為正在進行的請求而競爭。這也意味著後續請求不能使用以前響應中的cookie!總而言之,這不是一個好的局面。我會避免將UseCookieContainer設定為true,除非有一個非常好的理由。只需檢視您的響應頭,並在您的下一個請求把cookie轉發回來!
SSL錯誤
如果您想忽略SSL警告/錯誤,請在ReRoute配置中設定以下內容。
"DangerousAcceptAnyServerCertificateValidator": false
我不建議這麼做,如果可以我建議你建立自己的證書,然後讓本地/遠端的機器信任它。