Gateway目前支持路由,使用路由能夠用來實現不少高級功能,好比線上引流和灰度發佈。git
不少時候,開發的小夥伴定位線上問題的時候,查看日誌不能知足要求,老是想着若是可以和開發環境同樣,打個斷點,debug一下該有多好啊。可是現實是殘酷的,線上環境在絕大部分狀況下是不容許開發人員上去打個斷點調試的。這個時候Gateway的線上引流功能就很是有用。github
API | |
---|---|
Path | /api/v1/users/{id} |
Method | POST |
Body | JSON |
JsonBody |
{ "id": 1, "name": "zhangsan", "account": "123456" }
這個時候,利用Gateway的路由功能建立一個路由,把流量複製一份到本身的測試系統,測試完畢後,關閉路由,建立路由的代碼以下:api
rb := c.NewRoutingBuilder().Name("test-api-1").API(apiID).Up() // 設置策略爲流量複製 rb.Strategy(metapb.Copy) // 設置流量是100%(100%表明全部的流量都會被copy,10%表示只有10%的流量被複制) rb.TrafficRate(100) // 流量複製到測試集羣 rb.To(testCluster) // 知足id是1的用戶,才複製流量 param := metapb.Parameter{ Name: "id", Source: metapb.JSONBody, } rb.AddCondition(param, metapb.CMPEQ, "1") id,_ := rb.Commit() // 測試完畢後,下線這個路由 old,_ := c.GetRouting(id) c.NewRoutingBuilder().Use(old).Down().Commit()
有些時候,咱們須要發佈一些新功能或者修改一些老功能,但願在小範圍內,或者給指定的用戶試用。這個時候就須要灰度發佈。測試
Gateway使用路由功能能夠實現這個功能。ui
c, err := getClient() if err != nil { return err } rb := c.NewRoutingBuilder().Name("ab-api-1").API(apiID).Up() // 設置策略爲流量複製 rb.Strategy(metapb.Split) // 設置流量是10%(10%表示只有10%的流量被分流到新特性集羣) rb.TrafficRate(10%) // 流量分流到新特性集羣 rb.To(newFeatureCluster) // 知足id是1,2,3,4開頭的用戶 param := metapb.Parameter{ Name: "id", Source: metapb.JSONBody, } rb.AddCondition(param, metapb.CMPMatch, "^[1234][0-9]+$") rb.Commit()
更多特性debug