在之前的文章介紹中我們已經完成了乙個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在微服務中自動為...