Ocelot的主要功能是接管進入的http請求並把它們轉發給下游服務。目前是以另外一個http請求的形式(未來多是任何傳輸機制)。html
Ocelot將路由一個請求到另外一個請求描述爲ReRoute。爲了在Ocelot作任何工做,都須要在配置中設置一個ReRoute。git
{ "ReRoutes": [ ] }
爲了設置ReRoute,你須要以下所示添加一個ReRoute到ReRoutes的json數組。github
{ "DownstreamPathTemplate": "/api/posts/{postId}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 80, } ], "UpstreamPathTemplate": "/posts/{postId}", "UpstreamHttpMethod": [ "Put", "Delete" ] }
DownstreamPathTemplate、DownstreamScheme和DownstreamHostAndPorts 肯定請求的轉發。json
DownstreamHostAndPorts是一個數組,包含請求要轉發的主機和端口。一般這隻包含一個條目,但有時您可能須要將請求負載平衡到您的下游服務,這是Ocelot容許咱們添加多個條目,而後選擇一個負載均衡器。api
UpstreamPathTemplate是Ocelot用來標識哪一個DownstreamPathTemplate用於給定的請求URL。 最後,UpstreamHttpMethod的使用,可讓Ocelot區分對同一個URL的請求,而且顯然這是須要的工做。數組
你能夠指定一個Http請求方法列表,或者一個空的列表以容許任務Http請求方法。在Ocelot中,你可使用{something}的方式在模板中添加變量佔位符。佔位符須要在DownstreamPathTemplate 和UpstreamPathTemplate中都添加。若是是這樣,當請求到達時Ocelot將試圖使用上游url中的正確的變量值來替換佔位符。負載均衡
你也能夠想這樣使用一個ReRoute處理全部請求:dom
{ "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "https", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 80, } ], "UpstreamPathTemplate": "/{everything}", "UpstreamHttpMethod": [ "Get", "Post" ] }
這將轉發全部請求到下游服務路徑/api。post
目前在沒有任何配置的請求下,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!)。