Spring Boot中使用斷路器模式實現彈性微服務

banq發表於2024-04-23

Circuitbraker-example
由於多個獨立服務在微服務設計中相互互動,保持系統彈性變得非常重要。管理因服務中斷或高延遲而可能出現的故障是一個典型問題。稱為斷路器模式的設計模式透過提供回退並防止級聯故障來解決此問題。在本部落格中,我們將瞭解 Spring Boot 應用程式的斷路器模式。

瞭解斷路器模式:
電氣中斷路器和斷路器模式起著類似的作用。它密切關注故障,並在達到預定閾值時開啟電路以停止對故障服務的更多呼叫。這使得系統能夠優雅地發生故障,並在出現故障的服務恢復並執行時重新啟動。

SpringBoot實現:

<!-- Add Resilience4j dependency in pom.xml -->
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
</dependency>

<!-- Add Resilience4j dependency in build.gradle -->
dependencies {
    implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1'
}

現在讓我們構建一個使用 Resilience4j 斷開電路的基本 Spring Boot 應用程式。

1.建立Spring Boot應用程式:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CircuitBreakerTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(CircuitBreakerTestApplication.class, args);
    }
}

2. 建立帶有斷路器的服務:

建立服務類並將其命名為 TestService,它將有一個我們想要用斷路器保護的方法:

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

@Service
public class TestService {

    @CircuitBreaker(name = "testService", fallbackMethod = "fallbackMethod")
    public String invokeExternalService() {
        // Here you can simulate a call to an external service
        // In a real-world scenario, this could be an HTTP call, database query, etc.
        if (Math.random() > 0.5) {
            throw new RuntimeException("Service failure");
        }
        return "External service response";
    }

    public String fallbackMethod(Exception e) {
        return "Fallback response";
    }
}

在CircuitBreaker註釋中,name是斷路器的識別符號,fallbackMethod是電路開啟時要呼叫的方法。

3. 編寫一個控制器類來呼叫TestService:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/invokeService")
    public String invokeService() {
        return testService.invokeExternalService();
    }
}

4. 啟用 Resilience4j 配置

您可以將以下屬性新增到application.properties或application.yml檔案中以配置 Resilience4j:
resilience4j.circuitbreaker.configs.default.failureRateThreshold=50
resilience4j.circuitbreaker.configs.default.slidingWindowSize=5

5:監控斷路器狀態(非必須)

為了監控斷路器的狀態,還可以為Micrometer和Prometheus新增以下依賴:


<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

implementation 'io.micrometer:micrometer-registry-prometheus'

現在可以透過http://localhost:8080/actuator/Circuitbreakers訪問 Resilience4j Circuit Breaker 儀表板。

6:測試斷路器
執行 Spring Boot 應用程式時,利用/api/invokeService端點提交請求。更改callExternalService 方法中的Math.random()條件以模擬失敗。

觀察斷路器儀表板的狀態如何根據服務呼叫的成功或失敗而變化。

結論
上面的示例展示瞭如何以基本方式在 Spring Boot 應用程式中設定 Resilience4j 的斷路器。根據您獨特的用例以及與外部服務的互動,可以根據需要進行調整。

相關文章