限免開關實施版本保護措施,保證項目灰度發布安全

?迭代用戶限免權限校驗業務 新增限免開關實現普通用戶權益更新,實施版本保護措施,保證項目灰度發布安全;

// 是否展示限免標識
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
}

這段代碼是一個判斷是否展示限免標識的函數,我來詳細解釋一下:

  1. 函數功能:

  • 判斷用戶是否應該看到限免標識

  • 根據用戶的 VIP 等級、客戶端類型、版本號等條件進行判斷

  1. 主要邏輯:

// 第一步:檢查限免開關
isFreeUseOpen := p.cfg.VipConfigMap[p.userVip].ShowFreeuse == int64(ShowFreeuseOpen)
  • 從配置中獲取用戶 VIP 等級對應的限免開關狀態

  • 判斷是否開啟了限免功能

  1. 日志記錄:

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 等級、場景、客戶端類型、版本號和限免開關狀態

  1. 判斷邏輯:

  • 如果限免開關關閉,直接返回 false

  • 如果是 Web 客戶端,直接返回 true(Web 端無條件放行)

  • 對于 Android 和 iOS 客戶端:

    • 需要比較客戶端版本號是否大于等于配置的 FreeSwitchVersion

    • 如果版本號比較出錯,返回 false

    • 如果版本號滿足要求,返回 true

  1. 返回值:

  • true:表示應該展示限免標識

  • false:表示不應該展示限免標識

這個函數主要用于控制限免功能的展示邏輯,確保:

  1. 只有開啟限免功能的 VIP 用戶才能看到限免標識

  2. Web 端用戶可以直接看到限免標識

  3. 移動端用戶需要達到指定版本才能看到限免標識

這種設計可以:

  • 通過 VIP 等級控制限免功能的展示

  • 確保移動端用戶使用較新版本才能享受限免功能

  • 方便進行灰度發布和版本控制

灰度發布(Gray Release)是一種軟件發布策略,我來詳細解釋一下:

  1. 基本概念:

  • 灰度發布是指將新版本軟件逐步推送給部分用戶,而不是一次性推送給所有用戶

  • 就像灰度圖像一樣,從黑到白有一個漸變的過程

  1. 主要特點:

  • 漸進式:新版本逐步替換舊版本

  • 可控性:可以控制新版本覆蓋的用戶范圍

  • 可回滾:發現問題可以快速回退到舊版本

  1. 常見的灰度發布方式:

  • 按用戶比例:比如先發布給 10% 的用戶

  • 按用戶特征:比如特定地區、特定設備類型的用戶

  • 按用戶 ID:比如用戶 ID 尾號為特定數字的用戶

  • 按版本號:比如只對特定版本以上的用戶開放

  1. 優勢:

  • 降低風險:問題只影響部分用戶

  • 快速驗證:可以快速收集用戶反饋

  • 靈活控制:可以隨時調整發布范圍

  • 便于監控:可以對比新舊版本的表現

  1. 實際應用場景:

  • 新功能上線

  • 重大版本更新

  • 性能優化

  • 界面改版

  1. 實現方式:

// 示例代碼
func isInGrayRelease(userID int64, version string) bool {// 按用戶ID尾號判斷if userID%10 < 3 { ?// 30%的用戶進入灰度return true}// 按版本號判斷if version >= "3.44.0" {return true}return false
}
  1. 監控指標:

  • 錯誤率

  • 性能指標

  • 用戶反饋

  • 業務指標

  1. 注意事項:

  • 需要完善的監控系統

  • 要有快速回滾機制

  • 灰度比例要合理

  • 灰度時間要適當

灰度發布是一種非常實用的發布策略,可以幫助團隊:

  • 降低發布風險

  • 提高發布質量

  • 優化用戶體驗

  • 快速響應問題

版本號對比方法

// 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 // 版本相同
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904343.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從 AWS Marketplace 開始使用 AssemblyAI 的語音轉文本模型構建語音智能

語音智能和語音轉文本 &#xff08;STT&#xff09; 技術已變得至關重要&#xff0c;因為組織每天收集數千小時的電話、會議和客戶互動。僅靠原始音頻并不能推動決策 - 組織需要智能來大規模地從語音數據中提取價值。語音智能結合了語音識別、自然語言處理 &#xff08;NLP&…

Android組件化 -> Debug模式下,本地構建module模塊的AAR和APK

本地構建module模塊的AAR gradle.properties isCommonApp false模塊的build.gradle apply plugin: com.android.library&#xff1a;module模塊編譯manifest.srcFile src/main/AndroidManifest.xml&#xff1a;讀取沒有啟動App和Activity的配置文件 if (isCommonApp.toBoo…

FlexibleButton:一個輕巧靈活的按鍵處理庫,讓你的按鍵處理更簡單

在嵌入式系統開發中&#xff0c;按鍵輸入處理是一個常見且重要的環節。然而&#xff0c;許多開發者在處理按鍵時&#xff0c;往往會遇到按鍵消抖、組合按鍵、長按/短按等功能實現的復雜性。如何在保證系統高效運行的同時&#xff0c;簡化按鍵事件的處理呢&#xff1f; 今天&…

探索程序員薪資背后的秘密與未來:智能化工具如何助力職場發展

最新接入DeepSeek-V3模型&#xff0c;點擊下載最新版本InsCode AI IDE 探索程序員薪資背后的秘密與未來&#xff1a;智能化工具如何助力職場發展 引言 在當今數字化時代&#xff0c;程序員作為科技發展的核心力量&#xff0c;其職業前景和薪資水平備受關注。隨著人工智能和自…

【STM32單片機】#14 PWR電源控制

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 目錄 PWR…

第十五屆藍橋杯單片機國賽-串口解析

串口通信像是藍橋杯單片機組國賽中一個若隱若現的秘境&#xff0c;總在不經意間為勇者們敞開大門。然而&#xff0c;初次探索這片領域的冒險者&#xff0c;常常會被其神秘莫測的特性所震懾&#xff0c;黯然退場&#xff08;編不下去了&#xff0c;直接進入正題&#xff09;。 附…

深入探索 51 單片機:從入門到實踐的全面指南

深入探索 51 單片機&#xff1a;從入門到實踐的全面指南 一、引言 在嵌入式系統發展的漫長歷程中&#xff0c;51 單片機猶如一顆璀璨的明星&#xff0c;雖然誕生已有數十年&#xff0c;但至今仍在眾多領域發揮著重要作用。它以結構簡單、易于學習、成本低廉等優勢&#xff0c…

GD32F470+CH395Q

第一步&#xff1a;資料下載 以太網協議棧芯片 CH395 - 南京沁恒微電子股份有限公司 第二步&#xff1a;準備工程 &#xff08;1&#xff09; 首先準備一個編譯無報錯、可以正常打印和延時的工程文件&#xff0c;官方例程采用STM32F1芯片&#xff0c;但本文采用GD32F470芯片 …

Linux 怎么使用局域網內電腦的網絡訪問外部

一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 寫入 ~/.bashrc&#xff08;或 ~/.bash_profile&#xff09; nano ~/.bashrc加入這一行&#xff1a; export http_proxy"http://19…

Mysql進階篇1_存儲引擎、索引、SQL性能分析指令

文章目錄 1.存儲引擎InnoDBMyISAMMemory存儲引擎選擇和對比 2.索引索引結構索引分類索引語法索引使用&#xff08;建議看完第3節后觀看&#xff09;&#xff01;&#xff01;&#xff01;mysql如何使用索引查詢數據&#xff08;個人理解&#xff09; 3.SQL性能分析SQL執行頻率慢…

LeetCode 熱題 100 118. 楊輝三角

LeetCode 熱題 100 | 118. 楊輝三角 大家好&#xff0c;今天我們來解決一道經典的算法題——楊輝三角。這道題在 LeetCode 上被標記為簡單難度&#xff0c;要求生成楊輝三角的前 numRows 行。楊輝三角是一個經典的組合數學問題&#xff0c;每一行的數字都是其正上方和正左上方…

修改或禁用Cursor的全局搜索默認快捷鍵

在 Cursor 中&#xff0c;默認情況下 雙擊 Shift 會打開 全局搜索&#xff08;Quick Open&#xff09;&#xff0c;類似于 VS Code 的 CtrlP 功能。如果你想修改或禁用這個快捷鍵&#xff0c;可以按照以下步驟操作&#xff1a; 1. 打開快捷鍵設置 方法 1&#xff1a;按下 Ctrl…

HarmonyOS Device Connector(hdc)

它是為開發人員提供的用于調試的命令行工具&#xff0c;通過該工具可以在windows/linux/mac系統上與設備進行交互。 hdc分為三部分&#xff1a; client&#xff1a;運行在電腦端的進程&#xff0c;開發者在執行hdc命令時啟動該進程&#xff0c;命令結束后進程退出。 server&…

開源PDF解析工具Marker深度解析

開源PDF解析工具Marker深度解析 檢索增強生成&#xff08;RAG&#xff09;系統的第一步就是做 pdf 解析&#xff0c;從復雜多樣的 pdf 中提取出干凈準確的文本內容。現有的最優秀的開源工具有兩個&#xff1a;Marker 和 MinerU。因為 Marker 是個人開發者做的&#xff0c;文檔…

ARM子程序調用與返回

子程序&#xff08;也叫過程、函數、方法&#xff09;是一個能被調用和執行并返回到調用點那條指令的代碼 段。 兩個問題&#xff1a;如何將參數傳遞給子程序或從子程序中傳遞出來&#xff1f;怎么從子程序返回到調用點&#xff1f; 指令BSR Proc_A調用子程序Proc_A。 處理器將…

算力經濟模型推演:從中心化到去中心化算力市場的轉變(區塊鏈+智能合約的算力交易原型設計)

一、算力經濟的歷史脈絡與范式轉移 1.1 中心化算力市場的演進困境 傳統算力市場以超算中心、云計算平臺為核心載體&#xff0c;其運營模式呈現強中心化特征。中國移動構建的"四算融合"網絡雖實現百萬級服務器的智能調度&#xff0c;但動態資源分配仍受制于集中式控…

小結: 接口類型和路由優先級

網絡接口類型 1. Bridge-if&#xff08;橋接接口&#xff09; 作用&#xff1a;用于橋接網絡&#xff0c;將多個接口或VLAN連接為一個廣播域&#xff0c;實現二層數據轉發。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 將接口加入…

mysql一些事

一.聯合查詢/多表查詢 聯合查詢關鍵在于笛卡爾積的過程 笛卡爾坐標積的排列組合 首先它會將兩個表用排列組合的方式進行排列組合。 表一 表二 進行排列組合 我們發現它的行是 兩個表的行相乘&#xff0c;列是兩表的列相加。 我們所看到的數據有合理的也有不合理的我們接下…

【工具】Open WebUI:本地化部署的AI交互平臺

文章目錄 一、Open WebUI 簡介二、核心功能詳解1. 多模型與多模態支持2. 本地RAG與文檔集成3. 開發與定制化能力4. 安全與權限管理5. 用戶體驗優化 三、安裝與部署指南1. 快速安裝方式2. 高級配置3. 常見問題 四、實際應用場景1. 個人隱私助手2. 企業知識庫3. 學術研究4. 創意工…

AutoGPT

一、簡介 是一個基于openAI研發的GPT4模型的一個開源應用程序&#xff0c;根據用戶指定的目標&#xff0c;自動生成所需的提示&#xff0c;并且執行需要多個步驟才能完成的項目&#xff0c;整個過程不需要人類干預和指導&#xff08;無監督學習&#xff09;&#xff0c;生成式…