17 - Spring Boot Resilience4j

03/03/2025 - 4 phút

Follow  on Google News

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Resilience4j, cách tăng cường khả năng chịu lỗi của ứng dụng.

1. Giới Thiệu

Trong các hệ thống microservicesứng dụng phân tán, lỗi là điều không thể tránh khỏi. Khi một service gặp sự cố, nếu không có cơ chế bảo vệ, ứng dụng có thể sụp đổ hoàn toàn.

Resilience4j là một thư viện giúp tăng cường khả năng chịu lỗi của ứng dụng bằng cách cung cấp các cơ chế như:

  • Circuit Breaker: Ngăn chặn request đến service bị lỗi.
  • Retry: Tự động thử lại request khi gặp lỗi tạm thời.
  • Rate Limiter: Giới hạn số lượng request để bảo vệ hệ thống.
  • Bulkhead: Hạn chế số lượng request đồng thời để tránh quá tải.
  • Time Limiter: Giới hạn thời gian thực thi của một request.

Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Resilience4j, cách cài đặt và triển khai các pattern chịu lỗi phổ biến.


2. Cài Đặt Resilience4j Trong Spring Boot

2.1. Thêm Dependencies

Spring Boot hỗ trợ Resilience4j thông qua spring-cloud-starter-circuitbreaker-resilience4j. Thêm vào pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

2.2. Kích Hoạt Resilience4j Trong application.properties

resilience4j.circuitbreaker.instances.default.failureRateThreshold=50
resilience4j.circuitbreaker.instances.default.waitDurationInOpenState=5000
resilience4j.circuitbreaker.instances.default.slidingWindowSize=10
  • failureRateThreshold: Nếu tỷ lệ lỗi vượt quá 50%, Circuit Breaker sẽ mở.
  • waitDurationInOpenState: Thời gian chờ trước khi thử lại (5 giây).
  • slidingWindowSize: Số request được theo dõi để tính tỷ lệ lỗi.

3. Cơ Chế Circuit Breaker Trong Resilience4j

3.1. Circuit Breaker Là Gì?

Circuit Breaker giúp ngăn chặn request đến một service bị lỗi, tránh làm hệ thống quá tải khi một phần bị sập.

Có 3 trạng thái chính:

  • Closed: Mọi request đều được gửi bình thường.
  • Open: Chặn mọi request trong một khoảng thời gian (service bị lỗi nhiều lần).
  • Half-Open: Cho phép một số request thử lại để kiểm tra service đã khôi phục chưa.

3.2. Triển Khai Circuit Breaker Trong Spring Boot

Tạo CircuitBreakerService.java:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import java.util.Random;

@Service
public class CircuitBreakerService {
    private static final Random random = new Random();

    @CircuitBreaker(name = "default", fallbackMethod = "fallbackResponse")
    public String unstableService() {
        if (random.nextBoolean()) {
            throw new RuntimeException("Service bị lỗi!");
        }
        return "Dữ liệu từ service ổn định!";
    }

    public String fallbackResponse(Exception e) {
        return "Service hiện không khả dụng, vui lòng thử lại sau!";
    }
}
  • @CircuitBreaker(name = "default", fallbackMethod = "fallbackResponse"): Nếu service bị lỗi, gọi phương thức dự phòng.
  • fallbackResponse(): Trả về phản hồi thay thế khi service bị lỗi.

3.3. Tạo REST API Để Kiểm Tra Circuit Breaker

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

@RestController
@RequestMapping("/api")
public class CircuitBreakerController {
    private final CircuitBreakerService service;

    public CircuitBreakerController(CircuitBreakerService service) {
        this.service = service;
    }

    @GetMapping("/test-circuit")
    public String testCircuitBreaker() {
        return service.unstableService();
    }
}

Gọi API để kiểm tra:

http://localhost:8080/api/test-circuit

Khi service bị lỗi, bạn sẽ thấy phản hồi từ fallback method.


4. Triển Khai Retry Trong Resilience4j

4.1. Retry Là Gì?

Retry giúp tự động thử lại một request khi gặp lỗi tạm thời, ví dụ như timeout hoặc lỗi mạng.

4.2. Triển Khai Retry Trong Spring Boot

Tạo RetryService.java:

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;
import java.util.Random;

@Service
public class RetryService {
    private static final Random random = new Random();

    @Retry(name = "default", fallbackMethod = "fallbackResponse")
    public String unstableOperation() {
        if (random.nextBoolean()) {
            throw new RuntimeException("Tạm thời bị lỗi!");
        }
        return "Request thành công!";
    }

    public String fallbackResponse(Exception e) {
        return "Không thể thực hiện yêu cầu, vui lòng thử lại sau!";
    }
}
  • @Retry(name = "default", fallbackMethod = "fallbackResponse"): Nếu request thất bại, thử lại nhiều lần trước khi gọi fallback.

4.3. Gọi API Kiểm Tra Retry

@RestController
@RequestMapping("/api")
public class RetryController {
    private final RetryService service;

    public RetryController(RetryService service) {
        this.service = service;
    }

    @GetMapping("/test-retry")
    public String testRetry() {
        return service.unstableOperation();
    }
}

Gọi API nhiều lần để kiểm tra retry:

http://localhost:8080/api/test-retry

5. Tối Ưu Hiệu Suất Với Rate Limiter Và Bulkhead

5.1. Rate Limiter - Giới Hạn Request

Cấu hình giới hạn số lượng request:

resilience4j.ratelimiter.instances.default.limitForPeriod=5
resilience4j.ratelimiter.instances.default.limitRefreshPeriod=1s
  • Chỉ cho phép 5 request mỗi giây.

Sử dụng @RateLimiter:

@RateLimiter(name = "default", fallbackMethod = "rateLimiterFallback")
public String limitedService() {
    return "Request thành công!";
}

5.2. Bulkhead - Giới Hạn Request Đồng Thời

Giới hạn số lượng request chạy đồng thời:

resilience4j.bulkhead.instances.default.maxConcurrentCalls=2

Sử dụng @Bulkhead:

@Bulkhead(name = "default", fallbackMethod = "bulkheadFallback")
public String concurrentService() {
    return "Xử lý request thành công!";
}

6. Kết Luận

Spring Boot Resilience4j giúp tăng cường khả năng chịu lỗi, bảo vệ ứng dụng khỏi quá tải và downtime.

Tóm tắt:

  • Circuit Breaker giúp ngăn chặn request đến service bị lỗi.
  • Retry tự động thử lại request khi gặp lỗi.
  • Rate Limiter bảo vệ hệ thống khỏi bị quá tải.
  • Bulkhead giới hạn số lượng request đồng thời.

👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot Feature Flags, giúp quản lý tính năng động trong ứng dụng!