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