18 - Spring Boot Feature Flags

03/03/2025 - 3 phút

Follow  on Google News

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Feature Flags, cách quản lý tính năng động trong ứng dụng.

1. Giới Thiệu

Trong quá trình phát triển phần mềm, chúng ta thường gặp các tình huống như:

  • Triển khai một tính năng mới mà không ảnh hưởng đến người dùng hiện tại.
  • Bật/tắt một tính năng mà không cần triển khai lại toàn bộ ứng dụng.
  • Thử nghiệm A/B testing hoặc rollout từng phần.

Feature Flags (hay Feature Toggles) là một kỹ thuật giúp bật/tắt tính năng linh hoạt, cho phép kiểm soát các tính năng trong thời gian thực mà không cần phải thay đổi mã nguồn hoặc khởi động lại ứng dụng.

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Feature Flags, cách triển khai chúng với UnleashFF4J, và tối ưu hóa việc quản lý tính năng động trong ứng dụng Spring Boot.


2. Cách Hoạt Động Của Feature Flags

Feature Flags hoạt động bằng cách định nghĩa các cờ (flags) điều khiển tính năng, từ đó quyết định có bật/tắt tính năng hay không. Các loại Feature Flags phổ biến gồm:

Loại Feature FlagMô tả
Release ToggleBật/tắt tính năng mới trước khi triển khai chính thức.
Experiment ToggleHỗ trợ A/B testing hoặc thử nghiệm tính năng mới.
Ops ToggleBật/tắt nhanh một tính năng khi hệ thống gặp sự cố.
Permission ToggleChỉ bật một số tính năng cho người dùng nhất định.

3. Triển Khai Feature Flags Trong Spring Boot

3.1. Sử Dụng Cấu Hình application.properties

Một cách đơn giản để quản lý Feature Flags là sử dụng cấu hình trong application.properties:

feature.new-feature-enabled=true

Sử dụng trong code:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/feature")
public class FeatureController {
    
    @Value("${feature.new-feature-enabled}")
    private boolean isNewFeatureEnabled;
    
    @GetMapping("/check")
    public String checkFeature() {
        return isNewFeatureEnabled ? "Tính năng mới đã được bật!" : "Tính năng mới chưa khả dụng.";
    }
}

Hạn chế: Không thể bật/tắt feature mà không cần khởi động lại ứng dụng.


4. Sử Dụng Feature Flags Với Unleash

Unleash là một Feature Management Platform hỗ trợ kiểm soát tính năng động trong thời gian thực.

4.1. Cài Đặt Unleash

Thêm dependency vào pom.xml:

<dependency>
    <groupId>no.finn.unleash</groupId>
    <artifactId>unleash-client-java</artifactId>
    <version>4.3.0</version>
</dependency>

4.2. Cấu Hình Unleash Trong application.properties

unleash.api.url=http://localhost:4242/api/
unleash.app.name=spring-boot-app

4.3. Triển Khai Feature Flags Với Unleash

import no.finn.unleash.FakeUnleash;
import no.finn.unleash.Unleash;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/feature")
public class UnleashFeatureController {
    private final Unleash unleash;
    
    public UnleashFeatureController() {
        this.unleash = new FakeUnleash(); // Thay thế bằng UnleashClient khi triển khai thực tế
    }
    
    @GetMapping("/unleash")
    public String checkFeature() {
        return unleash.isEnabled("new-feature") ? "Tính năng mới được bật!" : "Tính năng bị tắt.";
    }
}
  • Unleash.isEnabled(“new-feature”) kiểm tra trạng thái của feature flag từ Unleash Server.
  • Có thể thay đổi trạng thái feature flag mà không cần khởi động lại ứng dụng.

5. Quản Lý Feature Flags Với FF4J

FF4J là một thư viện Java giúp quản lý feature flags linh hoạt hơn.

5.1. Cài Đặt FF4J

Thêm dependency vào pom.xml:

<dependency>
    <groupId>org.ff4j</groupId>
    <artifactId>ff4j-spring-boot-starter</artifactId>
    <version>1.8.6</version>
</dependency>

5.2. Cấu Hình FF4J Trong Spring Boot

Tạo FF4JConfig.java:

import org.ff4j.FF4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FF4JConfig {
    @Bean
    public FF4j ff4j() {
        FF4j ff4j = new FF4j();
        ff4j.createFeature("new-dashboard"); // Tạo feature flag
        return ff4j;
    }
}

5.3. Sử Dụng FF4J Trong API

import org.ff4j.FF4j;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/feature")
public class FF4JFeatureController {
    private final FF4j ff4j;
    
    public FF4JFeatureController(FF4j ff4j) {
        this.ff4j = ff4j;
    }
    
    @GetMapping("/ff4j")
    public String checkFeature() {
        return ff4j.check("new-dashboard") ? "Dashboard mới đã bật!" : "Dashboard cũ vẫn được sử dụng.";
    }
}
  • FF4j.check(“new-dashboard”) kiểm tra trạng thái của feature flag.
  • Có thể thay đổi trạng thái feature flag từ UI FF4J Console.

6. Kết Luận

Spring Boot Feature Flags giúp quản lý tính năng động trong ứng dụng mà không cần triển khai lại code.

Tóm tắt:

  • Feature Flags giúp kiểm soát bật/tắt tính năng linh hoạt.
  • Sử dụng Unleash hoặc FF4J để quản lý feature flags mạnh mẽ hơn.
  • Hỗ trợ triển khai A/B testing, rollout dần dần và kiểm soát rủi ro.

👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot Multi-Tenancy, giúp xây dựng ứng dụng hỗ trợ nhiều khách hàng (tenants)! 🚀