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

相关文章
相关标签/搜索