Phần 6 - Các lựa chọn thay thế cho Microsoft.FeatureManagement

Đây là bài viết cuối cùng trong loạt bài: Thêm cờ tính năng vào ứng dụng ASP.NET Core.

Trong loạt bài này, tôi đã xem xét thư viện Microsoft.FeatureManagement (hiện là mã nguồn mở trên GitHub 🎉). Điều này cung cấp một lớp mỏng trên hệ thống cấu hình .NET Core để thêm cờ tính năng vào ứng dụng của bạn. Nhưng thư viện này là mới và khái niệm cờ tính năng thì không - vậy trước đây mọi người sử dụng cái gì?

Tôi rất nghi ngờ rằng đối với hầu hết mọi người, câu trả lời là một trong những điều sau:

  • LaunchDarkly
  • Một số hệ thống chuyển đổi tính năng nội bộ, bật bằng tay,

Tìm kiếm "feature toggles" trên NuGet cho 686 kết quả và tìm kiếm "feature flags" cho 886 kết quả. Tôi thú nhận là tôi đã không sử dụng chúng.

Điều đó không có gì quá ngạc nhiên. Chức năng cờ tính năng cơ bản khá dễ thực hiện và hầu như mọi ứng dụng đều có giá trị cấu hình bên ngoài hoặc kết nối cơ sở dữ liệu. Điều đó nói rằng, có sự khác biệt lớn giữa chức năng bật / tắt cơ bản và việc triển khai dần dần các tính năng trên các ứng dụng của bạn.

Trong bài viết này, tôi giới thiệu sơ lược về một số lựa chọn thay thế cho thư viện Microsoft.FeatureManagement và mô tả sự khác biệt của chúng:

LaunchDarkly

LaunchDarkly là người đương nhiệm thực sự khi nói đến tính năng bật tắt. Chúng là sản phẩm SaaS cung cấp API và giao diện người dùng để quản lý cờ tính năng của bạn và SDK bằng nhiều ngôn ngữ (có một SDK nguồn mở cho .NET hỗ trợ .NET Standard 1.4+).

Trung tâm của LaunchDarkly là một tập hợp các cờ tính năng và giao diện người dùng để quản lý chúng:

Moggles

Tuy nhiên, sự đơn giản của ảnh chụp màn hình đó cho thấy vô số tùy chọn cấu hình có sẵn cho bạn. Mỗi cờ tính năng:

  • Có thể là một giá trị Boolean (bật / tắt) hoặc một giá trị phức tạp như int, string hoặc JSON.
  • Có thể được đánh dấu "tạm thời" hoặc "vĩnh viễn" để dễ dàng lọc và loại bỏ các cờ tạm thời cũ.
  • Có thể có tên và mô tả phong phú.
  • Có thể thay đổi giữa các môi trường khác nhau (dev / staging / production).
  • Có thể phụ thuộc vào các cờ tính năng khác đang được bật, vì vậy tính năng A chỉ được bật nếu tính năng B được bật.

Tất cả các giá trị của cờ tính năng đều được quản lý trong giao diện người dùng LaunchDarkly mà SDK liên hệ để kiểm tra các giá trị cờ (tất nhiên là vào bộ nhớ đệm nếu thích hợp).

Máy chủ LaunchDarkly thường đẩy bất kỳ thay đổi nào đối với cờ tính năng từ máy chủ của họ đến ứng dụng của bạn, thay vì thăm dò SDK định kỳ, để bạn nhận được các bản cập nhật nhanh chóng. Mã của bạn để kiểm tra cờ tính năng Boolean với SDK sẽ trông giống như sau:

// Create a LaunchDarkly user for segmentation
var user = User.WithKey(username);

// Use the singleton instance of the LaunchDarkly client _ldClient,
// providing the feature flag name, the user, and a default value incase there's an error
bool showFeature = _ldClient.BoolVariation("your.feature.key", user, false);
if (showFeature) 
{
  // application code to show the feature 
}
else 
{
  // the code to run if the feature is off
}

Đoạn mã này nêu bật tính năng phân đoạn người dùng - điều này đảm bảo rằng cờ tính năng ổn định trên mỗi người dùng, một vấn đề mà tôi đã mô tả trong bài đăng trước của loạt bài này.

Họ cũng cung cấp các tính năng để thực hiện thử nghiệm A / B / n, các số liệu về các tính năng đã được sử dụng (và người dùng nào) và nhiều tính năng khác. Tài liệu SDK cũng thực sự tốt.

Điều cuối cùng đưa chúng ta đến một nhược điểm - nó không miễn phí! Họ có bản dùng thử miễn phí và gói cơ bản với giá 25 đô la một tháng, nhưng giá tăng lên 325 đô la + mỗi tháng kể từ đó.

Bạn sẽ trả tiền dựa trên số lượng máy chủ bạn có, số lượng nhà phát triển (người dùng giao diện người dùng) bạn có, cũng như số lượng khách hàng đang hoạt động mà bạn có.

Nó thực sự có vẻ như là một sản phẩm tuyệt vời, nhưng điều đó đi kèm với cái giá phải trả, vì vậy nó phụ thuộc vào độ ưu tiên của bạn.

RimDev.AspNetCore.FeatureFlags

RimDev.AspNetCore.FeatureFlags đập vào mắt tôi khi tôi đang xem qua các gói NuGet, vì đó là từ nhóm tại RIMdev, những người có nhiều dự án nguồn mở khác nhau như Stuntman.

Thư viện này giống như một ví dụ hoàn hảo về trường hợp mà tôi đã mô tả ở đầu bài viết - một dự án bắt đầu như một giải pháp nội bộ cho một vấn đề.

Một trong những cách tiếp cận thú vị được sử dụng trong thư viện là các đối tượng được định nghĩa bằng cách sử dụng các lớp được định kiểu mạnh, (thay vì các chuỗi ma thuật thường được sử dụng) và đưa các đối tượng tính năng trực tiếp vào các dịch vụ của bạn.

Ví dụ: bạn có thể tạo một đối tượng tính năng MyFeature. Để kiểm tra xem nó có được bật hay không, bạn đưa nó vào dịch vụ của mình và kiểm tra feature.Value:

public class MyFeature : Feature
{
    // Optional, displays on UI:
    public override string Description { get; } = "My feature description.";
}

public class MyController : Controller
{
    private readonly MyFeature _feature;
    public MyController(MyFeature myFeature)
    {
        _feature = myFeature;
    }

    [HttpGet]
    public IActionResult OnGet()
    {
        if(_feature.Value)
        {
            // feature is enabled
        }
    }
}

RimDev.FeatureFlags sử dụng một interface IFeatureProvider để tải và cập nhật các instance Feature. Thư viện bao gồm một triển khai duy nhất, sử dụng SqlClient để lưu trữ các giá trị tính năng trong cơ sở dữ liệu SQL Server.

Thư viện cũng bao gồm một giao diện người dùng đơn giản để bật và tắt cờ tính năng:

RimDev.AspNetCore.FeatureFlags

Nhìn chung, đây là một thư viện khá cơ bản và thiếu một số tính năng động của các tùy chọn khác, nhưng nếu cơ bản là tất cả những gì bạn cần, thì tại sao lại phức tạp!

Moggles

Moggles là một dự án nguồn mở. Moggles tuân theo một kiến ​​trúc tương tự như LaunchDarkly, nơi bạn có một thành phần máy chủ quản lý việc chuyển đổi tính năng và một SDK ứng dụng khách tìm kiếm các giá trị của cờ tính năng trong ứng dụng của bạn.

Thành phần máy chủ có giao diện người dùng cho phép cung cấp mô tả cho cờ tính năng và hỗ trợ nhiều môi trường (dev / staging / production).

Nó cũng bao gồm tính năng LaunchDarkly đánh dấu các cờ tính năng là tạm thời so với vĩnh viễn cho các mục đích lọc.

Tương tự, nó có thể tích hợp với một cụm RabbitMq để đảm bảo các bản cập nhật cho các nút chuyển đổi tính năng được đẩy ra các ứng dụng mà không yêu cầu các ứng dụng thăm dò ​​để thay đổi.

Dự án này cũng phát triển từ nhu cầu nội bộ và điều đó tương đối rõ ràng trong các công nghệ được sử dụng. Máy chủ hiện chỉ hỗ trợ Microsoft SQL Server và sử dụng Windows Authentication với ủy quyền dựa trên vai trò.

Nếu Moggles trông thú vị nhưng bạn có các yêu cầu khác, có thể cân nhắc đóng góp, tôi chắc chắn rằng họ sẽ thích sự hỗ trợ.

Esquio

Esquio là một dự án mã nguồn mở trên GitHub từ Xabaril (những người tạo ra thư viện BeatPulse xuất sắc ). Nó trông rất thú vị, đang nhắm mục tiêu .NET Core 3.0 và có rất nhiều tính năng hay.

API cơ bản cho Esquio tương tự như thư viện Microsoft.FeatureManagement, nhưng có một số điểm khác biệt chính:

  • API không đồng bộ, không giống như API đồng bộ của Microsoft.FeatureManagement. Vì vậy, thay vì IsEnabled, bạn có IsEnabledAsync.
  • Bạn có thể có nhiều cách lưu trữ cấu hình cờ tính năng của mình. IConfiguration là một tùy chọn, nhưng cũng có thể dùng EF Core nếu bạn muốn lưu trữ cấu hình cờ tính năng của mình trong cơ sở dữ liệu thay thế. Hoặc bạn có thể viết triển khai lưu trữ của riêng bạn!

Esquio cung cấp các hook tuyệt vời vào cơ sở hạ tầng ASP.NET Core như Microsoft.FetureManagagement, như thuộc tính [FeatureFilter] để ẩn controller hoặc các action dựa trên trạng thái của cờ; các tùy chọn dự phòng khác nhau khi một action bị vô hiệu hóa; và Tag Helper để hiển thị có điều kiện các phần của giao diện người dùng.

Vì được xây dựng trên .NET Core 3.0, Esquio cũng cho phép bạn đính kèm các bộ lọc tính năng trực tiếp vào một điểm cuối .

Một tính năng thú vị được mô tả trong tài liệu là khả năng sử dụng thuộc tính [FeatureFilter] làm ràng buộc hành động , vì vậy bạn có thể so khớp một cách có điều kiện với một hành động dựa trên việc một tính năng có được bật hay không:

[ActionName("Detail")] // Same ActionName on both methods
public IActionResult DetailWhenFlagsIsNotActive()
{
    return View();
}

[FeatureFilter(Names = Flags.MinutesRealTime)] // Acts as an action constraint
[ActionName("Detail")]
public IActionResult DetailWhenFlagsIsActive()
{
    return View();
}

Esquio cũng bao gồm các bộ lọc tính năng tương tự Microsoft.FeatureManagement, để kiểm soát động xem các tính năng có được bật hay không dựa trên người dùng hiện tại, chẳng hạn.

Trong Esquio, chúng được gọi là bật tắt, nhưng chúng là một khái niệm rất giống nhau. Một trong những điểm khác biệt lớn nhất là số lượng Esquio đi kèm với hộp:

  • OnToggle / OffToggle - cố định Boolean bật / tắt
  • UserNameToggle - bật tính năng cho một nhóm người dùng cố định.
  • RoleNameToggle - bật tính năng cho người dùng ở một trong các vai trò.
  • EnvironmentToggle - kích hoạt tính năng khi chạy trong một môi trường nhất định.
  • FromToToggle - chuyển đổi cửa sổ để bật các tính năng cho các cửa sổ thời gian cố định.
  • ClaimValueToggle - bật tính năng này nếu người dùng có một xác nhận quyền sở hữu nhất định với một trong những bộ giá trị được phép.
  • GradualRolloutUserNameToggle - triển khai cho một tỷ lệ phần trăm người dùng, sử dụng một hàm băm ổn định (hàm băm Jenkins) dựa trên tên người dùng. Có các chuyển đổi phát hành dần dần tương tự dựa trên giá trị của một xác nhận quyền sở hữu cụ thể, giá trị của tiêu đề hoặc ID ASP.NET Core Session.

Như bạn mong đợi, bạn cũng có thể tự do tạo các Toggles tùy chỉnh của riêng mình.

Đặc biệt, các chuyển đổi triển khai dần dần rất thú vị, vì chúng loại bỏ nhu cầu về ISessionManager yêu cầu của Microsoft.FeatureManagement để đảm bảo tính nhất quán giữa các yêu cầu đối với PercentageFilter.

Esquio cũng bao gồm một tính năng tương tự như LaunchDarkly, nơi bạn có thể cung cấp trạng thái cờ tính năng cho các ứng dụng khách SPA / thiết bị di động bằng cách bao gồm một điểm cuối để truy vấn các tính năng:

app.UseEndpoints(routes =>
{
    routes.MapEsquio(pattern: "esquio");
});

Trên hết, có một giao diện người dùng để quản lý các cờ tính năng của bạn! Tôi chưa thử chạy nó, nhưng nó tiếp theo trong danh sách của tôi.

Nhưng đợi đã! Còn nữa!

Thậm chí còn có tài liệu về cách tích hợp giới thiệu cờ tính năng của bạn như một phần của bản phát hành sử dụng Azure DevOps.

Nếu bạn tích hợp đầy đủ cờ tính năng vào quy trình phát hành của mình, bạn có thể sử dụng các bản phát hành canary chỉ được một số người dùng sử dụng, trước khi tăng tỷ lệ phần trăm và bật tính năng trên toàn diện.

Nói chung, tôi rất ấn tượng với thư viện Esquio. Nếu bạn đã làm việc với bản xem trước .NET Core 3.0 thì chắc chắn bạn nên xem qua nếu bạn cần chức năng chuyển đổi tính năng.

Tóm lược

Microsoft.FeatureManagement được thiết kế để hoạt động như một lớp mỏng trên các API cấu hình Microsoft.Extensions.Configuration, và do đó nó có một số hạn chế nhất định.

Bạn nên quan sát xung quanh và xem các tùy chọn khác là gì trước khi sử dụng thư viện, đồng thời thử và hiểu những hạn chế trong lựa chọn của bạn. Nếu tiền không phải là vấn đề, bạn có thể chọn LaunchDarkly - chúng nổi tiếng và có một bộ tính năng rộng rãi.

Cá nhân tôi rất quan tâm đến Esquio như một giải pháp thay thế mã nguồn mở tuyệt vời.

ASP.NET CoreASP.NET Core MVC.NET CoreLập Trình C#
Bài Viết Liên Quan:
Phần 5 - Đảm bảo cờ tính năng nhất quán trên các yêu cầu
Trung Nguyen 13/03/2022
Phần 5 - Đảm bảo cờ tính năng nhất quán trên các yêu cầu

Trong bài viết này, tôi giới thiệu hai cách để cải thiện tính nhất quán của cờ tính năng cho mọi yêu cầu đối với người dùng trong ứng dụng ASP.NET Core.

Phần 4 - Tạo bộ lọc tính năng tùy chỉnh
Trung Nguyen 13/03/2022
Phần 4 - Tạo bộ lọc tính năng tùy chỉnh

Trong bài viết này, tôi sẽ chỉ cho bạn cách tạo bộ lọc tính năng tùy chỉnh của riêng mình bằng cách sử dụng IFeatureFilter trong ASP.NET Core.

Phần 3 - Tạo cờ tính năng động với bộ lọc tính năng
Trung Nguyen 12/03/2022
Phần 3 - Tạo cờ tính năng động với bộ lọc tính năng

Trong bài này, tôi sẽ hướng dẫn cách sử dụng hai bộ lọc PercentageFilter và TimeWindowFilter để tạo cờ tính năng động trong ứng dụng ASP.NET Core.

Phần 2 - Lọc các action method với cờ tính năng
Trung Nguyen 12/03/2022
Phần 2 - Lọc các action method với cờ tính năng

Trong bài này, tôi giới thiệu thư viện Microsoft.FeatureManagement.AspNetCore bổ sung các tính năng dành riêng cho ASP.NET Core để làm việc với cờ tính năng