当前位置: 首页 > news >正文

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.xdnf.cn/news/866755.html

相关文章:

  • [蓝桥杯]密码脱落
  • NTC热敏电阻
  • 【Linux】进程
  • Pytorch模型格式区别( .pt .pth .bin .onnx)
  • nssm配置springboot项目环境,注册为windows服务
  • 【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac
  • Mac 双系统
  • 深入详解开源工具DCMTK:C++开发的DICOM工具包
  • <el-table>构建树形结构
  • KrillinAI:视频跨语言传播的一站式AI解决方案
  • EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用
  • HOPE800系列变频器安装到快速调试的详细操作说明
  • Delft3D软件介绍及建模原理和步骤;Delft3D数值模拟溶质运移模型建立;地表水环境影响评价报告编写思路
  • CppCon 2015 学习:3D Face Tracking and Reconstruction using Modern C++
  • 前端大数高精度计算解决方案,BigNumber.js
  • 前端面试二之运算符与表达式
  • 组件库二次封装——透传问题
  • UniApp 全生命周期钩子详解
  • 数据标注与大模型的双向赋能:效率与性能的跃升
  • CMake + Ninja 构建程序示例
  • CortexON:开源的多代理AI系统无缝自动化和简化日常任务
  • 【推荐算法】推荐系统核心算法深度解析:协同过滤 Collaborative Filtering
  • 07 APP 自动化- appium+pytest+allure框架封装
  • RabbitMQ 的异步化、解耦和流量削峰三大核心机制
  • ④Pybullet之Informed RRT*算法介绍及示例
  • 在本地查看服务器上的TensorBoard
  • Git安装与常用命令全攻略
  • Elasticsearch的搜索流程描述
  • 分类与逻辑回归 - 一个完整的guide
  • Git常用命令完全指南:从入门到精通