1. 程式人生 > >Ocelot中文文件-路由

Ocelot中文文件-路由

原文: 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!)。