Gin API系列 實現動態路由分組(七)

2022-07-04 20:48:07 字數 3528 閱讀 4404

在之前的文章介紹中我們已經完成了乙個api服務的全鏈路請求設計。呼叫方式可以看test目錄的**

// src/test/request_test.go

func testapi_request(t *testing.t)

if result, err := api.request("/", "get", params); err != nil else

}

截至目前我們只定義了乙個路由(在main函式中),但現實中往往會定義多個路由實現多個api介面,而為了風格統一化(或是模組化、版本區分等原因),我們也往往會將多個路由歸為一類,這就會導致很多路由的字首相同。

所以,本文將介紹如何通過分組路由,減少路由重複**並實現動態路由。

func main()
/sdk/search_ip

/sdk/search_mac

/object/host

/object/switch

/v1/object/host

/v1/object/switch

/v2/object/host

/v2/object/switch

通過group方法來生成乙個分組,然後使用這個分組來註冊多個統一分類的路由

/*

/sdk/search_ip

/sdk/search_mac

/object/host

/object/switch

*/route := gin.default()

// sdk 類別

sdkgroup := route.group("/sdk")

sdkgroup.get("/search_mac", func(c *gin.context) )

sdkgroup.get("/search_ip", func(c *gin.context) )

// object

objgroup := route.group("/object")

objgroup.get("/host", func(c *gin.context) )

objgroup.post("/switch", func(c *gin.context) )

如果需要對sdk類別的路由進行統一呼叫某個中介軟體,也可以使用group的第二個引數。則不管是search_ip還是search_mac都會呼叫這個中介軟體

sdkgroup := route.group("/sdk", func(c *gin.context) )
分組路由也可以繼續分組,達到巢狀分組的目的

/*

/v1/object/host

/v1/object/switch

/v2/object/host

/v2/object/switch

*/v1group := route.group("/v1")

v1objgroup := v1group.group("/object")

v1objgroup.get("/host", func(c *gin.context) )

v1objgroup.post("/switch", func(c *gin.context) )

v2group := route.group("/v2")

v2objgroup := v2group.group("/object")

v2objgroup.get("/host", func(c *gin.context) )

v2objgroup.post("/switch", func(c *gin.context) )

有了上面路由分組和巢狀分組的基礎後,我們就可以通過自定義函式來組裝路由,實現路由的動態分發了

type route map[string]func(c *gin.context) // key:uri路徑, value: 中介軟體函式

type method int

const (

get method = iota

post

delete

put)// devpkg 對應的路由

type devpkggroup struct

// 版本對應的路由

type group struct

var rgroups group

func initroutegroups() ,

},} /*---------- 更新 v1 路由 ----------*/

// object 路由,根據oid遍歷多個

var objectroutes map[method]route

for _, oid := range configure.oidarray

// sdk 路由

var sdkroutes map[method]route

// sdk get 路由

sdkgetfuncarr := func() (string, func(c *gin.context))

for _, sdkgetfunc := range sdkgetfuncarr

} if method == get

if method == post

if method == delete

if method == put

return group.any

}// 路由解析

for _, group := range rgroups }}

} }}

[gin-debug] post   /v1/object/host           --> gin-ips/src/route/v1/object.glob..func1.1 (4 handlers)

[gin-debug] get /v1/object/host/:id --> gin-ips/src/route/v1/object.glob..func2.1 (4 handlers)

[gin-debug] post /v1/object/switch --> gin-ips/src/route/v1/object.glob..func1.1 (4 handlers)

[gin-debug] get /v1/object/switch/:id --> gin-ips/src/route/v1/object.glob..func2.1 (4 handlers)

[gin-debug] get /v1/sdk/search_ip --> gin-ips/src/route/v1/sdk.glob..func1.1 (4 handlers)

實現了動態路由之後我們的路由管理變得非常簡單,且很多**可以重複利用。而且在此基礎上,我們還可以通過對不同的路由進行許可權控制,以實現許可權的精細管理。

vue quasar 實現動態路由

在之前的版本中,許可權的操作是預先在前端的路由元資訊中設定好的,像這樣 component import views home home 但是最近有不少同學想看看我是如何實現後端返回路由,並在前端顯示的。於是就寫了個demo,來互相學習。tip 在使用後端返回的路由之前,我們能確定的是,之前我們在路...

vue動態路由的實現

路由動態渲染,即路由是變動的,由後端返回,故資料不是唯一不變的 實現方法 route.index.js 需要許可權的頁面應該放在非同步路由裡面,登入頁 404頁等放在同步路由裡面,再拼接 實現過程 不需要許可權的頁面 export const asyncroutes redirect account...

通過微服務名實現動態路由

預設情況下gateway會根據註冊中心的服務列表,以註冊中心上微服務名為路徑建立動態路由進行 從而實現動態路由的功能。1 修改9527的yml 需要注意的是uri的協議為lb,表示啟用gateway的負載均衡功能。lb servicename是spring cloud gateway在微服務中自動為...