2019独角兽企业重金招聘Python工程师标准>>>
前言
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特性
更多特性