Gateway雜談:線上引流和灰度發佈

前言

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()

瞭解更多Gateway特性

更多特性debug

相關文章
相關標籤/搜索