Skip to content

Instantly share code, notes, and snippets.

@axiaoxin
Created December 5, 2023 03:59
Show Gist options
  • Save axiaoxin/d92d923de79581568fb70a62aa66d355 to your computer and use it in GitHub Desktop.
Save axiaoxin/d92d923de79581568fb70a62aa66d355 to your computer and use it in GitHub Desktop.
使用golang实现一个灰度策略函数
/*使用golang实现一个灰度策略函数
实际开发中,我们通常会组合使用上文中提到的灰度策略,实现灵活的灰度配置,以应对复杂业务场景。
具体的过程,用语言描述就是:
首先外层还是要有全局开关,用于紧急情况下执行急停;
当请求到来后,先校验全局开关是否打开,如果打开,则继续判断是否满足白名单;否则直接返回,继续执行原有逻辑​;
如果命中白名单,则直接执行灰度业务逻辑;否则继续判断是否满足百分比灰度;
计算当前灰度维度id对100取模结果,判断结果是否小于等于百分比阈值,如果满足,则表示命中灰度,执行灰度业务逻辑,反之则表示其不满足当前灰度,继续执行原有业务逻辑。
*/
package main
import (
"fmt"
"math/rand"
"time"
)
// 定义灰度策略结构体
type GrayStrategy struct {
// 全局开关
GlobalSwitch bool
// 白名单
WhiteList []string
// 百分比灰度
Percent int
}
// 定义灰度维度id
type GrayDimensionId string
// 定义灰度业务逻辑函数
func GrayBusinessLogic() {
fmt.Println("执行灰度业务逻辑")
}
// 定义原有业务逻辑函数
func OriginalBusinessLogic() {
fmt.Println("执行原有业务逻辑")
}
// 定义灰度策略函数
func GrayStrategyFunc(id GrayDimensionId, strategy GrayStrategy) {
// 判断全局开关是否打开
if strategy.GlobalSwitch {
// 判断是否满足白名单
for _, whiteId := range strategy.WhiteList {
if id == GrayDimensionId(whiteId) {
// 命中白名单,执行灰度业务逻辑
GrayBusinessLogic()
return
}
}
// 判断是否满足百分比灰度
// 计算当前灰度维度id对100取模结果
mod := int(id) % 100
// 判断结果是否小于等于百分比阈值
if mod <= strategy.Percent {
// 命中百分比灰度,执行灰度业务逻辑
GrayBusinessLogic()
return
}
}
// 不满足灰度条件,执行原有业务逻辑
OriginalBusinessLogic()
}
func main() {
// 初始化一个灰度策略
strategy := GrayStrategy{
GlobalSwitch: true,
WhiteList: []string{"1", "2", "3"},
Percent: 50,
}
// 模拟10个请求
for i := 0; i < 10; i++ {
// 随机生成一个灰度维度id
id := GrayDimensionId(rand.Intn(100))
fmt.Printf("灰度维度id: %s\n", id)
// 调用灰度策略函数
GrayStrategyFunc(id, strategy)
fmt.Println()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment