Gateway杂谈:线上引流和灰度发布

前言

Gateway目前支持路由,使用路由可以用来实现很多高级功能,比如线上引流和灰度发布。

线上引流

很多时候,开发的小伙伴定位线上问题的时候,查看日志不能满足要求,总是想着如果能够和开发环境一样,打个断点,debug一下该有多好啊。但是现实是残酷的,线上环境在绝大部分情况下是不允许开发人员上去打个断点调试的。这个时候Gateway的线上引流功能就非常有用。

问题实例

API
Path /api/v1/users/{id}
Method POST
Body JSON

JsonBody

{
    "id": 1, 
    "name": "zhangsan", 
    "account": "123456"
}

如何解决

这个时候,利用Gateway的路由功能创建一个路由,把流量复制一份到自己的测试系统,测试完毕后,关闭路由,创建路由的代码如下:

	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使用路由功能可以实现这个功能。

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特性

更多特性

猜你喜欢

转载自my.oschina.net/u/2244142/blog/1620724