迭代用户限免权限校验业务 新增限免开关实现普通用户权益更新,实施版本保护措施,保证项目灰度发布安全;
Go
// 是否展示限免标识
func (t *BasePrivilegeService) IsPromotionFree(p consumParams) bool {
// 限免开关
isFreeUseOpen := p.cfg.VipConfigMap[p.userVip].ShowFreeuse == int64(ShowFreeuseOpen)
t.SLog.Info("check is promition free").
Set("uid", p.uid).Set("userVip", p.userVip).
Set("scene", p.scene).Set("clientType", p.clientType).
Set("version", p.version).Set("isFreeUseOpen", isFreeUseOpen).
Print()
if !isFreeUseOpen {
return false
}
// 限免开关 -> open
// web 放行
if p.clientType == client.CLIENTTYPE_WEB {
return true
}
// an,ios 版本 >= 3.44 放行
compareRes, err := util.VersionCompare(p.version, conf.Privilege.FreeSwitchVersion)
if err != nil {
t.SLog.Warning("check is promition free version compare error").SetErr(err).Print()
return false
}
return compareRes >= 0
}
这段代码是一个判断是否展示限免标识的函数,我来详细解释一下:
- 函数功能:
-
判断用户是否应该看到限免标识
-
根据用户的 VIP 等级、客户端类型、版本号等条件进行判断
- 主要逻辑:
// 第一步:检查限免开关
isFreeUseOpen := p.cfg.VipConfigMap[p.userVip].ShowFreeuse == int64(ShowFreeuseOpen)
-
从配置中获取用户 VIP 等级对应的限免开关状态
-
判断是否开启了限免功能
- 日志记录:
t.SLog.Info("check is promition free").
Set("uid", p.uid).Set("userVip", p.userVip).
Set("scene", p.scene).Set("clientType", p.clientType).
Set("version", p.version).Set("isFreeUseOpen", isFreeUseOpen).
Print()
- 记录用户 ID、VIP 等级、场景、客户端类型、版本号和限免开关状态
- 判断逻辑:
-
如果限免开关关闭,直接返回 false
-
如果是 Web 客户端,直接返回 true(Web 端无条件放行)
-
对于 Android 和 iOS 客户端:
-
需要比较客户端版本号是否大于等于配置的
FreeSwitchVersion
-
如果版本号比较出错,返回 false
-
如果版本号满足要求,返回 true
-
- 返回值:
-
true:表示应该展示限免标识
-
false:表示不应该展示限免标识
这个函数主要用于控制限免功能的展示逻辑,确保:
-
只有开启限免功能的 VIP 用户才能看到限免标识
-
Web 端用户可以直接看到限免标识
-
移动端用户需要达到指定版本才能看到限免标识
这种设计可以:
-
通过 VIP 等级控制限免功能的展示
-
确保移动端用户使用较新版本才能享受限免功能
-
方便进行灰度发布和版本控制
灰度发布(Gray Release)是一种软件发布策略,我来详细解释一下:
- 基本概念:
-
灰度发布是指将新版本软件逐步推送给部分用户,而不是一次性推送给所有用户
-
就像灰度图像一样,从黑到白有一个渐变的过程
- 主要特点:
-
渐进式:新版本逐步替换旧版本
-
可控性:可以控制新版本覆盖的用户范围
-
可回滚:发现问题可以快速回退到旧版本
- 常见的灰度发布方式:
-
按用户比例:比如先发布给 10% 的用户
-
按用户特征:比如特定地区、特定设备类型的用户
-
按用户 ID:比如用户 ID 尾号为特定数字的用户
-
按版本号:比如只对特定版本以上的用户开放
- 优势:
-
降低风险:问题只影响部分用户
-
快速验证:可以快速收集用户反馈
-
灵活控制:可以随时调整发布范围
-
便于监控:可以对比新旧版本的表现
- 实际应用场景:
-
新功能上线
-
重大版本更新
-
性能优化
-
界面改版
- 实现方式:
// 示例代码
func isInGrayRelease(userID int64, version string) bool {
// 按用户ID尾号判断
if userID%10 < 3 { // 30%的用户进入灰度
return true
}
// 按版本号判断
if version >= "3.44.0" {
return true
}
return false
}
- 监控指标:
-
错误率
-
性能指标
-
用户反馈
-
业务指标
- 注意事项:
-
需要完善的监控系统
-
要有快速回滚机制
-
灰度比例要合理
-
灰度时间要适当
灰度发布是一种非常实用的发布策略,可以帮助团队:
-
降低发布风险
-
提高发布质量
-
优化用户体验
-
快速响应问题
版本号对比方法
// VersionCompare 版本对比,如果v1>v2返回1,v1=v2返回0,v1<v2返回-1
func VersionCompare(v1, v2 string) (res int, err error) {
version1 := strings.Split(v1, ".")
version2 := strings.Split(v2, ".")
if len(version1) == 0 || len(version2) == 0 {
return 0, errors.New("version format error")
}
// 版本位数不一致时,先只比较前面相同位数
for i := 0; i < Max(len(version1), len(version2)); i++ {
n1 := 0
if i < len(version1) { // 该位数不够时,认为是0,位数够时,取该位数
n1, err = strconv.Atoi(version1[i])
if err != nil {
return
}
}
n2 := 0
if i < len(version2) { // 该位数不够时,认为是0,位数够时,取该位数
n2, err = strconv.Atoi(version2[i])
if err != nil {
return
}
}
if n1 == n2 {
continue
} else if n1 > n2 {
return 1, nil
} else if n1 < n2 {
return -1, nil
}
}
return 0, nil // 版本相同
}