限免开关实施版本保护措施,保证项目灰度发布安全

 迭代用户限免权限校验业务 新增限免开关实现普通用户权益更新,实施版本保护措施,保证项目灰度发布安全;

// 是否展示限免标识
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.mzph.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;生成式…