」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用功能標誌增強 API 穩定性

使用功能標誌增強 API 穩定性

發佈於2024-11-07
瀏覽:685

Enhancing API Stability with Feature Flags

稳定性和可靠性对于现代 API 的开发至关重要,特别是在发布更新或新功能时。功能切换(有时称为功能标志)是一种有用的管理方法,可以在无需重新启动程序的情况下管理何时公开新功能。将功能发布与代码部署分离有助于降低风险、回滚无法立即生效的更改,并使您的 API 整体更加稳定。

本文通过实际示例解释了功能标志的优点以及如何使用它们来提高 API 稳定性。

1. 什么是功能标志?

功能标志是一种机制,允许开发人员在其应用程序中启用或禁用特定功能,而无需部署新代码。这意味着您可以“在旗帜后面”发布新功能,并有选择地为特定用户、环境或条件激活它们。

功能标志可用于:

??逐步推出功能
?? A/B 测试
??金丝雀发布
??紧急终止开关

2. 功能标志对 API 稳定性的好处

功能标志提供了几个可以增强 API 稳定性的关键优势:

受控推出: 逐步向一部分用户发布新功能,以在完整发布之前监控性能和稳定性。

快速回滚:如果某个功能引入了错误或不稳定,您可以立即禁用它,而无需回滚整个部署。

减少停机时间:功能标志允许您进行更改,而无需关闭 API 进行维护或升级。

更安全的实验:团队可以安全地尝试新功能、A/B 测试,甚至基础设施更改,而不会影响整个用户群。

3. 特征标志的类型

有多种类型的功能标志,每种类型针对不同的用例而设计:

发布标志: 用于启用或禁用正在开发或需要在完整发布之前进行测试的功能。

Ops Flags: 用于操作控制,例如切换系统配置或处理紧急情况(例如,暂时禁用繁重的数据库查询)。

实验标志: 用于试验功能的不同版本以衡量性能或收集用户反馈。

权限标志:用于根据用户角色或权限控制功能访问。

4. 在 API 中实现功能标志

为了增强 API 的稳定性,让我们使用 Node.js 中的一个简单示例来实现功能标志。

第 1 步:基本功能标志设置

在此示例中,我们将为 API 端点实现一个功能标志。我们将首先创建一个包含功能标志的简单配置对象。

const featureFlags = {
  newFeatureEnabled: false
};

步骤 2:在 API 端点中使用功能标志

接下来,我们将使用此标志有条件地启用或禁用 API 中的功能。

const express = require('express');
const app = express();

app.get('/api/data', (req, res) => {
  if (featureFlags.newFeatureEnabled) {
    // New feature logic
    res.json({ message: 'New feature is enabled!' });
  } else {
    // Old feature logic
    res.json({ message: 'Old feature is still in use.' });
  }
});

app.listen(3000, () => {
  console.log('API is running on port 3000');
});

这里,/api/data 端点将根据 newFeatureEnabled 标志设置为 true 或 false 返回不同的响应。

第 3 步:切换功能标志

您可以通过将功能标志存储在配置文件、数据库中,甚至与 LaunchDarkly、Unleash 或 Split 等功能标志管理服务集成来动态管理功能标志。

示例:在数据库中存储标志

您可以将功能标志移至数据库以获得更大的灵活性。以下是您可以如何实现它:

const featureFlags = await database.getFeatureFlags();
if (featureFlags.newFeatureEnabled) {
  // Enable new feature
}

通过在数据库或外部服务中集中标志管理,您可以轻松更改功能状态,而无需重新部署应用程序。

5. 在 API 中使用功能标志的最佳实践

要充分利用功能标志,请遵循以下一些最佳实践:

文档标志用法: 跟踪系统中的所有功能标志以避免混淆。每个标志应该有明确的目的和生命周期。

清理过时标志: 功能完全推出后,从代码库中删除相关标志以降低复杂性。

使用监控:监控功能标志如何影响性能和稳定性。实时监控可以帮助您在启用新功能时快速检测问题。

粒度控制:在粒度级别实现功能标志,让您更好地控制 API 的特定部分。

6. 功能标志的高级用例

功能标志不仅限于启用或禁用功能。以下是一些高级用例:

A/B 测试
您可以使用功能标志来试验不同版本的 API 端点。例如,您可以在两种数据处理算法之间切换并测量每种算法的影响。

if (featureFlags.algorithmVersion === 'v1') {
  // Use version 1 of the algorithm
} else {
  // Use version 2 of the algorithm
}

金丝雀发布
功能标志可以帮助您逐步向一小部分用户发布新功能(金丝雀版本),从而使您可以在完全部署之前监控其影响。

const isCanaryUser = checkIfCanaryUser(req.user);
if (featureFlags.newFeatureEnabled && isCanaryUser) {
  // Enable new feature for canary users
}

终止开关
在紧急情况下,功能标志可以充当终止开关,立即禁用有问题的功能,防止它们影响整个 API。

if (!featureFlags.newFeatureEnabled) {
  // Disable feature and avoid potential instability
}

结论

功能标志是提高 API 控制和稳定性的有效工具。功能的发布可以与部署分开,以降低风险,保证更无缝的部署,并及时解决可能发生的任何问题。功能标志提供了一种通用且可扩展的方法来保持 API 稳定性,无论使用情况如何:用于受控发布、A/B 测试或紧急响应的功能标志。

版本聲明 本文轉載於:https://dev.to/wallacefreitas/enhancing-api-stability-with-feature-flags-2n98?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼我的程式僅在 Windows Vista 的發布模式下崩潰?
    為什麼我的程式僅在 Windows Vista 的發布模式下崩潰?
    僅在發布版本中程序崩潰:深入研究調試晦澀之處遇到一個奇特的“薛定諤貓”錯誤可能會讓程式設計師感到困惑。在這種情況下,只有在發布模式下建置並從命令列啟動時,程式才會可靠地崩潰,並留下神秘的終止通知。 追蹤崩潰的根源透過細緻的調試,罪魁禍首方法已經被識別出來,但崩潰本身駐留在最後一個可見跟踪消息之後執行...
    程式設計 發佈於2024-11-08
  • Python 循環 2
    Python 循環 2
    大家好!这是 python 循环系列的第二部分。 第 1 部分在这里: https://dev.to/coderanger08/python-loops-1-5dho 本周,我们将更多地讨论 while 和 for 循环、break 和 pass 语句、范围函数等等。让我们开始吧。 ...
    程式設計 發佈於2024-11-08
  • 你能比較 C++ 中不同容器的迭代器嗎?
    你能比較 C++ 中不同容器的迭代器嗎?
    比較來自不同容器的迭代器:一個警示故事在C 中,迭代器提供了一個強大的遍歷集合的機制。然而,在使用來自不同容器的迭代器時,重要的是要意識到這些限制。 比較不同容器的迭代器是否合法的問題經常出現。考慮以下範例:std::vector<int> foo; std::vector<int...
    程式設計 發佈於2024-11-08
  • Spring Boot:Java 應用程式開發的革命
    Spring Boot:Java 應用程式開發的革命
    如果你用Java開發,你可能聽過Spring Boot。但如果您還不知道,請準備好發現最強大、最實用的工具之一,它徹底改變了 Java 應用程式的創建方式! 什麼是 Spring Boot? Spring Boot 是一個框架,它使 Java 應用程式的開發變得更加容易(而且更加容易!)。它消除...
    程式設計 發佈於2024-11-08
  • LESS CSS 偽元素選擇器中與號 (&) 的作用是什麼?
    LESS CSS 偽元素選擇器中與號 (&) 的作用是什麼?
    揭秘CSS 偽元素選擇器中的& 符號當在CSS 中遇到這樣的代碼時,很自然地想知道& 符號(&) 的意義) 字元:.clearfix { *zoom: 1; &amp;:before, &amp;:after { display: table; conte...
    程式設計 發佈於2024-11-08
  • 如何在沒有子查詢的情況下在 MySQL 中更新行並取得更新的 ID?
    如何在沒有子查詢的情況下在 MySQL 中更新行並取得更新的 ID?
    在 MySQL 中組合 SELECT 和 UPDATE 查詢將 SELECT 和 UPDATE 查詢組合成單一操作對於優化資料庫效能非常有用。在這種情況下,使用者希望組合以下查詢:SELECT * FROM table WHERE group_id = 1013 and time > 100;...
    程式設計 發佈於2024-11-08
  • 將 SQLite 遷移到 MySQL。
    將 SQLite 遷移到 MySQL。
    我介紹一下自己,我是 Alfredo Riveros,我已經學習程式設計多年了,我目前正在 Río Tercero 高等商業學院學習軟體開發高級技術員,下面我將描述我面臨的挑戰遭遇。 正如標題所說,我的目標是將 SQLite 資料庫遷移到 MySQL,這是由我正在接受的資料庫主題中的作業引起的。 ...
    程式設計 發佈於2024-11-08
  • 在 Mageia 9 上安裝 ASDF
    在 Mageia 9 上安裝 ASDF
    今天我們要在 Mageia 9 上安裝 ASDF。接下來的步驟是將外掛程式安裝到 PHP 和 Node.js。 要在版本 0.14.1 上安裝 ASDF,我使用了 Git ZSH 版本: git克隆 https://github.com/asdf-vm/asdf.git ~/.asdf --bra...
    程式設計 發佈於2024-11-08
  • 最佳化效能:為資料透視表選擇最佳資料來源
    最佳化效能:為資料透視表選擇最佳資料來源
    TL;DR: Syncfusion Pivot Table connects to multiple data sources, making it a versatile tool for data analysis. Selecting the right data source is cruc...
    程式設計 發佈於2024-11-08
  • 使用 Secrets Loader 輕鬆管理 Laravel 和 JS 項目
    使用 Secrets Loader 輕鬆管理 Laravel 和 JS 項目
    跨各种环境管理 API 密钥、令牌和凭证等敏感数据可能非常棘手,尤其是在开发和部署应用程序时。确保秘密在需要时安全地存储和获取,而不是将它们硬编码到版本控制中,对于维护安全性至关重要。 这就是为什么我创建了 Secrets Loader,这是一个 Bash 脚本,可以动态地将 AWS SSM 和 C...
    程式設計 發佈於2024-11-08
  • 如何在 Android 中正確實作 CheckBox 的偵聽器?
    如何在 Android 中正確實作 CheckBox 的偵聽器?
    Android 中的CheckBox 偵聽器Android 中的CheckBox 偵聽器在Android 中實作CheckBox 偵聽器時,必須解決使用標準時面臨的常見問題OnCheckedChangeListener類。 satView.setOnCheckedChangeListener(new...
    程式設計 發佈於2024-11-08
  • Firestore 如何優化社群網路時間軸以實現可擴充性?
    Firestore 如何優化社群網路時間軸以實現可擴充性?
    使用Firestore 優化社交網路時間軸在設計具有提要和關注功能的社交網路時,資料庫可擴展性對於處理潛在問題至關重要大型數據集。 Firebase 的即時資料庫帶來了可擴展性挑戰,特別是在儲存使用者時間軸的方法方面。要解決這些問題,請考慮過渡到 Firestore。 優化的資料庫結構Firesto...
    程式設計 發佈於2024-11-08
  • 如何解決將物件數組作為函數參數傳遞時的錯誤?
    如何解決將物件數組作為函數參數傳遞時的錯誤?
    類型提示:物件陣列將物件陣列作為參數傳遞給函數時,如果未指定參數類型。例如,考慮以下程式碼:class Foo {} function getFoo(Foo $f) {}嘗試將 Foo 物件陣列傳遞給 getFoo 將導致致命錯誤:Argument 1 passed to getFoo() must...
    程式設計 發佈於2024-11-08
  • 為什麼 iOS 裝置上缺少 CSS 捲軸?
    為什麼 iOS 裝置上缺少 CSS 捲軸?
    iOS上無法顯示有CSS Overflow的捲軸為iPad開發網站時,使用CSS屬性overflow: auto來啟用div內的捲軸可能無效。儘管兩指滾動手勢功能正常,但捲軸仍然隱藏。嘗試同時使用溢出:自動和溢出:滾動不會產生任何結果。 iOS行為不幸的是,溢位:自動和捲動都不會在iOS裝置上產生捲...
    程式設計 發佈於2024-11-08
  • Java中如何從執行緒操作傳回值?
    Java中如何從執行緒操作傳回值?
    執行緒操作回傳值在多執行緒程式設計中,執行緒之間的互動往往需要交換資料。常見的情況是嘗試檢索在單獨執行緒中執行的操作的結果。 請考慮下面的範例程式碼:public void test() { Thread uiThread = new HandlerThread("UIHandle...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3