使用 Ocelot 匹配路由的方法匹配路由

2022-01-10 07:53:00 字數 2839 閱讀 9217

之前我們在 ocelot 閘道器的基礎上自定義了乙個認證授權的 ocelot 中介軟體,根據請求的路徑和 method 進行匹配,找到對應的許可權配置,並判斷是否可以擁有訪問資源的角色,如果沒有則返回 401/403,如果有許可權則**到下游服務。

原來的匹配方式是首先根據請求路徑和方法完全匹配,如果匹配不到則嘗試使用正則匹配。

我們這次要做的就是將原來的正則匹配替換成 ocelot 內部的路由匹配方式,這樣我們在配置的時候就不再需要配置兩套了,一邊寫 ocelot 路由的配置,一邊寫許可權的配置,這樣能減少不少工作量

我們想使用 ocelot 的路由匹配,首先應該了解 ocelot 的執行過程,然後找到對應的路由匹配的地方,看路由匹配使用到了哪乙個服務,用這個服務在我們自己的業務邏輯裡匹配即可。

先來看一下 ocelot 的服務註冊,ocelot 的服務註冊

可以看到主要的服務註冊**應該在ocelotbuilder中,檢視ocelotbuilder

可以看到,ocelot 的服務註冊都在這裡, ocelot 內部好多都是基於介面的,所以需要找對應的實現的話可以看它的服務註冊是註冊的哪乙個服務即可。

簡單分析一下,ocelot 的路由匹配過程一定在尋找下游位址的時候,根據上游的請求資訊(直接請求閘道器的請求)匹配,所以我們首先找到downstreamroutefindermiddleware

由上面的**,我們可以看到,下游路由位址是通過idownstreamroutefinder來找下游路由的,轉到對應的實現**:

這裡我們可以看到是通過iurlpathtourltemplatematcher來進行路由匹配的,所以我們需要用到這個服務,然後看這個match方法的引數,前兩個引數比較明確,第乙個引數是上游請求的位址,第二個引數是請求的 querystring,第三個引數則是 ocelot 內部構建出來的路由模板資訊upstreampathtemplate,然後我們就需要知道怎麼構建乙個upstreampathtemplate物件,繼續探索

直接看upstreampathtemplate,表示一臉懵逼,不知道怎麼構建, 全域性搜素了一下,發現有乙個iupstreamtemplatepatterncreator裡面定義了乙個create的方法

這個方法看上去簡單了好多,檢視ireroute的定義

我們只需要根據路徑模板構建乙個ireroute物件即可,ocelot 中有乙個實現了ireroute的類filereroute,但是感覺有些複雜,就沒有用,自定義了乙個型別實現了ireroute

自此,我們就已經找到了要使用 ocelot 路由匹配所需要的服務了:

上面提到了我們沒有使用filereroute物件,所以我們就需要自定義乙個ireroute物件:

private class fakereroute : ireroute

public bool rerouteiscasesensitive

public int priority

}

使用 ocelot 路由匹配示例:

這樣,apipermission 的 path 配置基本可以使用和 ocelot 配置一樣的路由,可以更方便的配置,避免 996 咯

Ocelot的使用 基本使用

ocelot是在.net core下閘道器的實現類庫,通過ocelot可以統一管理我們的webapi,不用再 中調來調去的很多api位址,統一從閘道器呼叫就行了。記錄下如何簡單的使用ocelot 1.新建gateway的閘道器專案,以及webapi的示例專案service1和service2 在ga...

Vue路由的使用方法

作為乙個vue的初學者,今天主要分享一下vue路由的基本使用方法,以及如何使用vue cil快速的建立乙個vue專案,若有那點不對,請及時提出,謝謝各位。全域性安裝 npm install g vue cli建立專案 vue create 專案名專案目錄大概如下 1 vue中路由的安裝 npm i ...

路由的方法,動態路由的配置方法

1 路由元件 實際上還是元件配置物件,不需要註冊,只需要在路由配置中設定給component即可 2 路由配置 const routes 這裡的每乙個物件都是乙個路由配置 3 動態路由 const routes 這種路由可以配置n多個路由位址 自定義路由 屬性名?比不寫問號多匹配乙個路由 自定義路由...