配置
一個關於Ocelot配置例子在這里。配置有兩個部分。一個數組類型的ReRoutes和一個全局配置。ReRoutes是個對象,告訴Ocelot怎么去處理一個上游請求。全局配置有點繁瑣(is a hacky)並且允許復寫ReRoutes指定的配置。如果你不想管理太多的ReRoutes那些設置那么這是非常有用的。
{
"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
}
更多關於如何使用這些選項的信息如下:.
多環境(Mutilple environments)
像其他任何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 docs.
合並配置文件
這個特征是在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屬性,那么你必須有一個文件並命名為coelot.global.json。
Ocelot合並文件的方式就是加載它們,遍歷它們,添加ReRoutes以及AggregateReRoutes ,如果文件是ocelot.global.json,能很好的添加到GlobalConfiguration以及ReRoutes或者AggregateReRoutes。然后Ocelot將合並的配置保存到ocelot.json文件中。當Ocelot運行的時候,這將被用作真正的來源
到目前為止這里沒有驗證,它只發生在當Ocelot驗證最終合並配置的時候。這里有一些事情值得注意當你調查問題的時候。我建議總是檢查ocelot.json如果你有任何問題。
在Consul存儲配置
如果你添加下面的代碼來注冊你自己的Ocelot服務,Ocelot將企圖在Consul 鍵值對存儲中存儲並檢索它的配置
services
.AddOcelot()
.AddStoreOcelotConfigurationInConsul();
你還需要在你的ocelot.json添加下面的代碼。這樣Ocelot會發現你的Consul代理並且交互去加載和存儲從Consul的配置。
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 9500
}
}
在我研究Raft一致性算法,並且發現非常困難,之后我決定新建這個特征。為什么我不用Consul已經給你們的這些優勢呢!我猜這意味如果你想重復利用Ocelot,就要依賴Consul
在你的本地Consul代理發出一個新請求之前,這個特性有3秒的ttl緩存。
配置鍵
如果你使用了Consul配置(或者其他提供器在這個特征里)你可能想配置你的鍵以便用多個配置。這個特征在 issue 346 被要求。為了指定Key,你需要在配置文件中設置ConfigurationKey屬性在ServiceDiscoveryProvider節點,如下:
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 9500,
"ConfigurationKey": "Oceolot_A"
}
}
在這個例子中,當在Consul查詢它的時候,Ocelot將使用Ocelot_A 為你的配置作為鍵。
如果你沒有設置ConfigurationKey,Ocelot將使用字符串InternalConfiguration 作為鍵。
跟隨重定向/使用Cookie容器
在ReRoutes配置中使用HttpHandlerOptions 來設置上游HttpHandler行為:
- AllowAutoRedirect 表明該請求是否應該跟隨重定向響應的一個值。如果請求自動遵循來自下游的重定向響應,設置為true。否則為false。默認值為false。
- UseCookieContainer 是一個表明當發送請求時是否處理使用CookieContainer 屬性存儲服務器cookies 並且用這些cookies。默認值false。請注意,如果你為每一個下游服務使用CookieContainer,Ocelot會緩存HttpClient。這就意味着所有下游服務請求都講共享一個cookies。Issue 274 被創建是因為用戶注意到cookies是可以被共享的。我嘗試考慮一種好的方式去處理這個,但是我認為這是不可能的。如果你不緩存client那就是說每個請求都獲得一個新的client並因此都有一個新的cookies container。如果你清楚了來自緩存客戶端容器的緩存,那么你將獲得競爭條件在請求中(並發)。這也就是說后面的請求不會使用來自前一個響應的cookies!總而言之,這是不好的。我建議設置UseCookieContainer 為true 除非你有足夠的好理由。只需查看你的響應頭並在你的下個請求轉發回cookies!
SSL 錯誤
要忽略SSL警告或者是錯誤的ID,請再ReRoutes設置一下內容:
"DangerousAcceptAnyServerCertificateValidator": false
我不推薦這么做,我建議創建你自己的憑證信息,然后獲取它的信任通過本地/遠程匹配,如果你可以的話。