?迭代用戶限免權限校驗業務 新增限免開關實現普通用戶權益更新,實施版本保護措施,保證項目灰度發布安全;
// 是否展示限免標識
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 := 0if i < len(version1) { // 該位數不夠時,認為是0,位數夠時,取該位數n1, err = strconv.Atoi(version1[i])if err != nil {return}}n2 := 0if 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 // 版本相同 }