golang常用库之-go-feature-flag库(特性开关(Feature Flags))

文章目录

  • golang常用库之-go-feature-flag库(特性开关(Feature Flags))
    • 一、什么是特性开关(Feature Flags)
    • 二、go-feature-flag库
      • 我可以使用 GO Feature Flag 做什么?
      • 选择使用 Open Feature SDK还是GO Feature Flag 用作 GO 模块
      • Flags 文件格式
    • 三、GO Feature Flag 用作 GO 模块
      • demo:用 feature toggle 控制日志开关

golang常用库之-go-feature-flag库(特性开关(Feature Flags))

一、什么是特性开关(Feature Flags)

功能标志(也称为 功能开关 或功能切换)是一种软件开发和产品实验技术,可在运行时控制功能,而无需部署新代码。这可以更好地控制和进行更多的 产品实验,从而覆盖功能的整个生命周期。

在软件开发中,功能开关是一种允许远程打开或关闭代码的机制,而无需部署。 产品、工程和 DevOps 团队通常使用功能开关进行 金丝雀发布 、A/B 测试、产品实验 和持续部署。

功能开关在应用程序和基础设施中有多种用途,其中大多数是为了降低风险。

例如,它们可以在应用程序中用于逐步推出新功能,允许团队在将更改发布给所有人之前,先在一小部分用户上测试更改。 同样,在基础设施中,功能开关可以像断路器一样,允许工程师远程控制已部署系统的行为。

二、go-feature-flag库

github: https://github.com/thomaspoignant/go-feature-flag

GO Feature Flag 是一个简单、完整且轻量级的自托管特性开关解决方案,并且是 100% 开源的。

GO Feature Flag 被设计为专门为 GO 语言提供的解决方案。 随着 Openfeature 项目对 Feature Flag 的新标准化,该解决方案现在可以通过一个名为 relay proxy 的简单 API 服务器,用于多种语言(支持的语言列表),该服务器可以托管。

我可以使用 GO Feature Flag 做什么?

  • 将您的配置 Flag 文件存储在各种位置(HTTPS3Kubernetes查看完整列表)。
  • 以各种 格式(JSONTOMLYAML)配置您的 Flag。

  • 为您的 Flag 使用复杂的发布策略:

    • Run A/B testing experimentation.运行 A/B 测试实验。
    • Progressively rollout a feature.逐步发布功能。
    • Schedule your flag updates.安排您的 Flag 更新。
  • 将您的 Flag 使用数据导出到各种目标位置,例如(S3Google cloud storagefilekubernetes,请参阅完整列表)。

  • 当 Flag 发生更改时收到通知(webhookslack)。

  • 通过 Open Feature SDKs 在多种语言中使用 GO Feature Flag

  • 支持您的完整堆栈,从后端到前端,包括您的移动应用程序。

选择使用 Open Feature SDK还是GO Feature Flag 用作 GO 模块

在开始使用 GO Feature Flag 之前,您应该决定是使用 Open Feature SDK,还是将 GO Feature Flag 用作 GO 模块。

最初,GO Feature Flag 仅构建为 Golang 库,但这在很大程度上限制了生态系统。

为了与更多语言兼容,我们实现了 GO Feature Flag Relay Proxy。 它是一项您可以托管的服务,提供一个 API 来评估您的标志,您可以使用 HTTP 调用它来获取您的变体。

鉴于我们相信标准化,我们也在实现 OpenFeature provider,以便使用您选择的语言与此 API 交互。

(OpenFeature 仍处于早期阶段,因此并非所有语言都受支持,并且预计未来会有一些变化)

我们建议使用 relay-proxy 作为中央标志管理和评估解决方案,它支持多语言,并且可以与 Open Feature SDK 无缝集成。

这是充分发挥 GO Feature Flag 潜力的最佳方式。

如果你的项目只使用 GO 语言,GO 模块是一个不错的选择。它可以在你的 GO 代码中直接进行标志评估。

Flags 文件格式

你的文件应该是 YAMLJSONTOML 文件,其中包含一个 flags 列表 (例如: YAMLJSONTOML)。

创建配置文件的最简单方法是使用 GO Feature Flag Editor,网址为 https://editor.gofeatureflag.org。

{"first-flag": {"variations": {"A": false,"B": true},"targeting": [{"query": "key eq \"random-key\"","percentage": {"A": 0,"B": 100}}],"defaultRule": {"variation": "A"}},"second-flag": {"variations": {"A": "valueA","B": "valueB","defaultValue": "a default value"},"targeting": [{"name": "notkey_rule","query": "key eq \"not-a-key\"","percentage": {"A": 10,"B": 90}}],"defaultRule": {"variation": "defaultValue"},"version": "12","experimentation": {"start": "2021-03-20T05:00:00.100Z","end": "2021-03-21T05:00:00.100Z"}}
}

这份配置体现了 Feature Flag 常见的用途:按照条件(key)和百分比进行流量分配,并为无法命中的流量指定默认值。
第一个 flag 属于典型的开关功能,第二个 flag 更偏向实验或多分支配置,并带有有效期管理。
此类配置适合进行“灰度发布”、A/B 测试、活跃/关闭功能测试和回滚机制等场景。

  1. first-flag
    这是一个特性开关(Feature Flag)配置文件,用于控制应用程序中的功能变体和实验。它定义了两个特性开关:first-flagsecond-flag
  • 变体(variations): 定义了两个可能的变体:

    • 变体A: 值为false
    • 变体B: 值为true
  • 目标规则(targeting): 包含一个规则:

    • 当用户的key等于"random-key"时,应用以下百分比分配:
      • 0%的用户会看到变体A
      • 100%的用户会看到变体B
      • 这意味着所有匹配这个条件的用户都会看到变体B(即true)
  • 默认规则(defaultRule): 如果用户不匹配任何目标规则,则应用变体A(即false)

  1. second-fla
  • 变体(variations): 定义了三个可能的变体:

    • 变体A: 值为字符串"valueA"
    • 变体B: 值为字符串"valueB"
    • defaultValue: 值为字符串"a default value"
      这里的变体是字符串而不是布尔值。
  • 目标规则(targeting): 包含一个命名为notkey_rule的规则:

    • 当用户的key等于"not-a-key"时,应用以下百分比分配:
      • 10%的用户会看到变体A
      • 90%的用户会看到变体B
  • 默认规则(defaultRule): 如果用户不匹配任何目标规则,则应用defaultValue变体(即"a default value")

  • 版本(version): 该特性开关的版本号为"12"

  • 实验配置(experimentation): 定义了实验的时间范围:

    • 开始时间: 2021年3月20日 05:00:00.100 UTC
    • 结束时间: 2021年3月21日 05:00:00.100 UTC
    • 这表明这是一个为期一天的实验

这个配置文件用于A/B测试或功能开关系统,允许根据用户标识符和预定义规则向不同用户展示不同的功能变体。这种配置通常用于逐步推出新功能、进行用户体验实验或在不同用户群之间测试不同的实现方案。

三、GO Feature Flag 用作 GO 模块

Variations变量
Variations are the different values possible for a feature flag.
变体是功能标志的不同可能值。

GO Feature Flag can manage more than just boolean values; the value of your flag can be any of the following types:
GO Feature Flag 可以管理不仅仅是 boolean 值;您的标志的值可以是以下任何类型:
bool
int
float
string
json array
json object

Boolean result = featureFlagClient.getBooleanValue("your.feature.key", false, userContext);

demo:用 feature toggle 控制日志开关

在实际项目中,“用 feature toggle 控制日志开关”是一种常见且合理的做法。

  1. 动态开关日志
    有些日志量大,生产环境默认关闭,仅在需要排查时临时打开,不会重启服务或发新包,可以大幅减少因日志产生的性能消耗或费用。

  2. 定向/灰度日志
    结合灰度发布/百分比分流,可以让一部分用户/请求产生日志(比如线上疑难问题精确定位),不会影响全部生产流量。

  3. 便于运维和支持团队快速响应
    线上出问题,只需调 flag 即可打开/关闭日志,不用等待发版。

使用 toggle/feature flag 控制日志开关(尤其是审计、调试、追踪、灰度日志)非常常见且推荐。
不但灵活可靠,还能极大减轻运维负担,提升故障处理效率。

创建配置文件的最简单方法是使用 GO Feature Flag Editor,网址为 https://editor.gofeatureflag.org。

  1. 创建 JSON 配置文件(flags.json)
    (1)feature flag YAML 配置(debug-flag.yaml):
debug-log:variations:on: trueoff: falsetargeting:- query: key eq "qa-user"percentage:on: 100off: 0defaultRule:variation: off

variation英文原义:具体选择哪个“变体”/“选项”。
翻译(在本场景下):可以翻译为**“命中的可选值”**、“选中的选项”或者直接“命中的变体”

在配置中:比如 variation: on 就是“命中 on 这个选项”

(2)代码集成(以 Go 官方 go-feature-flag 为例):

import ("github.com/thomaspoignant/go-feature-flag""log"
)func main() {ff := gofeatureflag.NewConfig(gofeatureflag.Config{PollingInterval:    3 * time.Second,Retriever: &gofeatureflag.FileRetriever{Path: "debug-flag.yaml",},})user := gofeatureflag.User{Key: "qa-user"} // 可以替换为你要测试的用户标识on, _ := gofeatureflag.BoolVariation("debug-log", user, false)if on {log.Println("Debug mode enabled by feature flag!")}
}

给特定人(如 “qa-user”)单独开启/on,否则默认关闭,支持灰度和A/B,更适用于多阶段发布或实验性调试。

go-feature-flag 的 client 会每3秒自动读取一次本地配置文件(你在 Path 指定的 yaml 或 json)。
当你修改了这个本地配置文件,最多n秒后就会被自动检测到,并更新本地(toggle)的值——不需要重启你的服务!

新版里并没有 ffclient.Init,也不会像早期那样“全局初始化一次、全局直接用”,而是构造对象实例(ff),使用的时候都基于它。
在新版里只要用 ff.BoolVariation,不用 ffclient 那一套。

新版代码里,ffgo-feature-flag 的实例(对象);所有 flag 查询都由这个对象提供,并不是“包全局变量”。

老用法(ffclient.Init/ffclient.BoolVariation)和新用法(ff := gofeatureflag.NewConfig(...))不能混用。

新版推荐面向对象/多实例用法:
直接用 gofeatureflag.NewConfig(...) 得到一个 ff 对象实例,然后后续都传这个对象操作,可以有多个实例(不需要/不能用包全局的 ffclient 了)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微前端 - Module Federation使用完整示例

Angular 框架中 项目结构 main-app/src/app/app.module.tsapp.component.ts micro-app/src/app/app.module.tsapp.component.ts主应用配置 安装必要依赖: ng add angular-architects/module-federation修改 webpack.config.js: const { share, Shar…

麒麟v10系统的docker重大问题解决-不支持容器名称解析

今天给客户在麒麟v10Kylin-Server-V10-SP1下安装nextcloudonlyoffice的时候出现无法连接onlyoffice的问题,经过分析找到了是docker版本过低的原因,现在把解决思路和步骤分享给大家。 一、问题 用一键安装工具,给客户装好了系统,Nextcloud可以正常访问 但是访问nextcloud中的o…

PyCharm中运行.py脚本程序

1.最近在弄一个python脚本程序,记录下运行过程。 2.编写的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …

学习资料搜集-ARMv8 cache 操作

【ARM64】【cache/MMU】学习总结_arm64 mmu-CSDN博客 [mmu/cache]-ARMV8的cache的维护指令介绍_data cache set allocation-CSDN博客 https://download.csdn.net/blog/column/12036969/139483584 验证码_哔哩哔哩 【ARM Cache 与 MMU 系列文章 2 -- Cache Coherence及内存顺…

Flutter快速上手,入门教程

目录 一、参考文档 二、准备工作 下载Flutter SDK: 配置环境 解决环境报错 zsh:command not found:flutter 执行【flutter doctor】测试效果 安装Xcode IOS环境 需要安装brew,通过brew安装CocoaPods. 复制命令行,打开终端 分别执行…

八股文——JVM

1. JVM组成 1.1 JVM由哪些部分组成?运行流程? Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行;自动内存管理…

在Pnetlab6上绕过TPM、安全启动和 RAM 检查安装windows 11笔记

笔者本次安装的windows11的镜像为: zh-cn_windows_11_enterprise_ltsc_2024_x64_dvd_cff9cd2d.iso 1、创建镜像目录并上传iso文件 mkdir /opt/unetlab/addons/qemu/win-win11x64-2024-LTSC //目录名称务必按照官方文档格式,否则无法识别 目录创建完成后,将.iso格式镜像上…

PCL点云库入门(第18讲)——PCL库点云特征之3DSC特征描述3D shape context descriptor

一、3DSC(3D Shape Context)特征算法原理 1. 背景 3DSC 是一种描述三维点云局部形状的特征描述子,受二维 Shape Context 的启发。它用于捕捉点云某一点局部的几何分布信息,对点云配准、识别等任务非常有效。 2. 基本思想 3DSC…

SpringBoot+Mysql校园跑腿服务平台系统源码

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

分库分表的取舍

文章目录 大数据量下采用**水平分表**的缺点**1. 跨表查询复杂性与性能下降****2. 数据分布不均衡****3. 分布式事务与一致性问题****4. 扩展性受限****5. 查询条件限制与索引管理复杂****6. 数据迁移与维护成本高****7. 业务逻辑复杂度增加****总结** shardingJdbc分片策略**1…

Vue3解决“找不到模块@/components/xxx.vue或其相应的类型声明ts文件(2307)”

问题 1&#xff1a;如果没有这个env.d.ts文件&#xff0c;就新建 declare module "*.vue" {import { DefineComponent } from "vue";const component: DefineComponent<{}, {}, any>;export default component; }2&#xff1a;如果有tsconfig.json文…

计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结

基于MATLAB的图像特征提取与匹配算法全面指南 图像特征提取与匹配 基于MATLAB的图像特征提取与匹配算法全面指南一、图像特征提取基础特征类型分类二、点特征提取算法1. Harris角点检测2. SIFT (尺度不变特征变换)3. SURF (加速鲁棒特征)4. FAST角点检测5. ORB (Oriented FAST …

如何通过API接口获取淘宝商品列表?操作详解

一、准备工作 注册开发者账号 访问淘宝开放平台官网/万邦开放平台&#xff0c;完成企业开发者认证&#xff08;个人账号权限受限&#xff09;&#xff0c;使用已有淘宝账号可直接登录。创建应用并填写基本信息&#xff08;如应用名称、类型等&#xff09;&#xff0c;系统生成A…

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…

DataGridView关闭默认第一列及表头居中设置

1、关闭默认第一列 如上图所示&#xff0c;C#和VB.net中的DataGridView控件都是有一个默认的第一列&#xff08;虽然是空白&#xff09;的&#xff0c;如何关闭这个默认列呢&#xff1f; 把“RowHeadersVisible”的值设置成“false”就可以了&#xff1a; 2、表头居中显示 如上…

nodejs express 打包部署

当前文件路径 webpack.config.js const path require(path); module.exports {entry: ./app.js, // Express 入口文件target: node, // 指定 Node.js 环境output: {path: path.resolve(__dirname, dist),filename: bundle.js},mode: production };打包命令 npx webpac…

CentOS 7 修改为静态 IP 地址完整指南

在企业网络环境中,服务器通常需要配置静态 IP 地址以确保网络连接的稳定性和可管理性。以下是使用 NetworkManager 工具在 CentOS 7 系统中将动态 IP 配置修改为静态 IP 的完整指南: 一、检查当前网络配置 查看网络连接状态: 使用 nmcli connection show 命令列出所有网络连…

微信小程序动态组件加载的应用场景与实现方式

动态组件加载的应用场景与实现方式 你提供的代码展示了微信小程序中动态加载组件的方法&#xff0c;但这种方式在实际开发中需要注意使用场景和实现细节。下面我来详细说明如何应用&#xff1a; 应用场景 按需加载组件&#xff1a;在某些条件满足时才加载组件动态配置组件&a…

学习记录: 使用react-router-dom

假设有一个vite创建的react项目,先npm install react-router-dom. 在app中: import { RouterProvider, createBrowserRouter } from "react-router-dom"; import Login from "./comm/Login"; import Home from "./comm/Home"; import TotalMan…

Angular中Webpack与ngx-build-plus 浅学

Webpack 在 Angular 中的概念 Webpack 是一个模块打包工具&#xff0c;用于将多个模块和资源打包成一个或多个文件。在 Angular 项目中&#xff0c;Webpack 负责将 TypeScript、HTML、CSS 等文件打包成浏览器可以理解的 JavaScript 文件。Angular CLI 默认使用 Webpack 进行项目…