Ocelot中文文件-路由
Ocelot的主要功能是接管進入的http請求並把它們轉發給下游服務。目前是以另一個http請求的形式(將來可能是任何傳輸機制)。
Ocelot將路由一個請求到另一個請求描述為ReRoute。為了在Ocelot做任何工作,都需要在配置中設定一個ReRoute。
{
"ReRoutes": [
]
}
為了設定ReRoute,你需要如下所示新增一個ReRoute到ReRoutes的json陣列。
{ "DownstreamPathTemplate": "/api/posts/{postId}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 80, } ], "UpstreamPathTemplate": "/posts/{postId}", "UpstreamHttpMethod": [ "Put", "Delete" ] }
DownstreamPathTemplate、DownstreamScheme和DownstreamHostAndPorts 確定請求的轉發。
DownstreamHostAndPorts是一個數組,包含請求要轉發的主機和埠。通常這隻包含一個條目,但有時您可能需要將請求負載平衡到您的下游服務,這是Ocelot允許我們新增多個條目,然後選擇一個負載均衡器。
UpstreamPathTemplate是Ocelot用來標識哪個DownstreamPathTemplate用於給定的請求URL。 最後,UpstreamHttpMethod的使用,可以讓Ocelot區分對同一個URL的請求,並且顯然這是需要的工作。
你可以指定一個Http請求方法列表,或者一個空的列表以允許任務Http請求方法。在Ocelot中,你可以使用{something}的方式在模板中新增變數佔位符。佔位符需要在DownstreamPathTemplate 和UpstreamPathTemplate中都新增。如果是這樣,當請求到達時Ocelot將試圖使用上游url中的正確的變數值來替換佔位符。
你也可以想這樣使用一個ReRoute處理所有請求:
{ "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 80, } ], "UpstreamPathTemplate": "/{everything}", "UpstreamHttpMethod": [ "Get", "Post" ] }
這將轉發所有請求到下游服務路徑/api。
目前在沒有任何配置的請求下,Ocelot將預設所有ReRoutes不區分大小寫。 為了改變這種情況,您可以在每個ReRoute中指定以下設定:
"ReRouteIsCaseSensitive": true
這意味著,當Ocelot嘗試將上行url與上游模板匹配時將區分大小寫。 此設定預設為false,這也是我的建議。因此只有在您希望ReRoute區分大小寫時才用設定它。
捕獲所有
Ocelot的路由還支援捕獲所有樣式的路由,使用者可以指定他們想要匹配所有流量。如果你像下面那樣設定你的配置,請求將被直接代理(它不一定叫url,任何佔位符名稱都可以)。
{
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 80,
}
],
"UpstreamPathTemplate": "/{url}",
"UpstreamHttpMethod": [ "Get" ]
}
該捕獲所有的優先順序低於其他任何ReRoute。 如果你的配置中還有下面的ReRoute,那麼Ocelot會在捕獲所有配置之前先匹配它。
{
"DownstreamPathTemplate": "/",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "10.0.10.1",
"Port": 80,
}
],
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": [ "Get" ]
}
上游主機
此功能允許您基於上游主機進行ReRoutes。 這是通過檢視客戶端使用的主機頭來工作,然後將其用作識別ReRoute的資訊的一部分。
為了使用這個功能,在你的配置中加上如下配置。
{
"DownstreamPathTemplate": "/",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "10.0.10.1",
"Port": 80,
}
],
"UpstreamPathTemplate": "/",
"UpstreamHttpMethod": [ "Get" ],
"UpstreamHost": "somedomain.com"
}
上面的ReRoute只會匹配主機頭是somedomain.com的請求。
如果您沒有在ReRoue上設定UpstreamHost,則任何主機頭都可以匹配它。 這基本上是一個捕獲所有功能並保留構建功能時的現有功能。這意味著如果您有兩個相同的ReRoute,其中一個與UpstreamHost是null,另一個有值。 Ocelot會傾向於設定值的那個。
這個功能在問題 216提出要求。
優先順序
在問題 270中,我最終決定在ocelot.json中公開ReRoute的優先順序。這意味著您可以決定上游HttpRequest與你的ReRoutes的匹配順序。
為了是其起作用,將以下內容新增到ocelot.json的ReRoute中,0僅僅是一個示例值,將在下面解釋。
{
"Priority": 0
}
0是最低優先順序,Ocelot將始終使用0作為/{catchAll}路由條目,並且可以硬編碼。之後,你可以自由設定你想要的任何優先順序。
例如你可以這樣:
{
"UpstreamPathTemplate": "/goods/{catchAll}",
"Priority": 0
}
還可以:
{
"UpstreamPathTemplate": "/goods/delete",
"Priority": 1
}
在上面的例子中,如果您向Ocelot請求/goods/delete,Ocelot將匹配/goods/delete這個ReRoute。不過在不設定優先順序以前它會匹配/goods/{catchAll}(因為這是列表中的第一個ReRoute!)。