Spring Boot整合Hystrix實現服務容錯

省赚客开发者团队發表於2024-08-15

Spring Boot整合Hystrix實現服務容錯

大家好,我是微賺淘客返利系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!

在微服務架構中,服務之間的依賴關係錯綜複雜,任何一個服務的故障都可能影響到整個系統的穩定性。為了提高系統的容錯性,引入斷路器模式是一種有效的解決方案。Hystrix 是 Netflix 開源的一個容錯庫,它透過斷路器模式幫助我們實現服務的容錯。

Hystrix 簡介

Hystrix 是一個用於處理分散式系統的延遲和容錯的庫,它透過隔離服務之間的呼叫,防止任何一個服務的故障導致整個系統的崩潰。Hystrix 提供了多種功能,包括服務降級、服務熔斷、請求快取和請求合併等。

Spring Boot 整合 Hystrix

Spring Boot 作為一個流行的微服務框架,與 Hystrix 的整合非常簡單。首先,需要在專案的 pom.xml 檔案中新增 Hystrix 的依賴。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

配置 Hystrix

在 Spring Boot 應用中,可以透過配置檔案 application.propertiesapplication.yml 來配置 Hystrix 的相關引數。

# 啟用Hystrix
feign.hystrix.enabled=true

使用 Hystrix 註解

在需要使用 Hystrix 進行容錯處理的方法上,可以使用 @HystrixCommand 註解。這個註解可以指定命令的屬性,如超時時間、服務降級方法等。

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @HystrixCommand(
            commandKey = "getUser",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
            },
            fallbackMethod = "getUserFallback"
    )
    public User getUserById(String id) {
        // 模擬呼叫遠端服務獲取使用者資訊
        return remoteUserService.getUserById(id);
    }

    public User getUserFallback(String id) {
        // 服務降級邏輯
        return new User("defaultUser", "Default User");
    }
}

Hystrix Dashboard

Hystrix 提供了一個 Dashboard,可以實時監控服務的健康狀況和呼叫情況。要整合 Dashboard,需要新增 hystrix-dashboard 的依賴,並啟動一個 Dashboard 服務。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

在 Spring Boot 應用中,可以透過新增一個配置類來啟動 Dashboard。

import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HystrixDashboardConfig {

    @Bean
    @ConditionalOnMissingBean
    public ManagementServerProperties managementServerProperties() {
        ManagementServerProperties properties = new ManagementServerProperties();
        properties.setContextPath("/hystrix-dashboard");
        return properties;
    }

    @Bean
    @ConditionalOnMissingBean
    public WebEndpointProperties webEndpointProperties() {
        WebEndpointProperties properties = new WebEndpointProperties();
        properties.setEnabled(true);
        return properties;
    }
}

啟動 Dashboard 後,可以透過訪問 http://localhost:8080/hystrix-dashboard 來檢視服務的監控資訊。

Hystrix 命令模式

Hystrix 提供了多種命令模式,包括 RunGetObservable。這些命令模式可以根據不同的需求選擇使用。

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;

public class GetCommand extends HystrixCommand<User> {

    private final String id;
    private final RemoteUserService remoteUserService;

    public GetCommand(Setter setter, String id, RemoteUserService remoteUserService) {
        super(setter);
        this.id = id;
        this.remoteUserService = remoteUserService;
    }

    @Override
    protected User run() throws Exception {
        return remoteUserService.getUserById(id);
    }
}

Hystrix 執行緒隔離

Hystrix 支援執行緒隔離,可以透過配置 execution.isolation.strategy 屬性來設定。執行緒隔離可以防止一個服務的呼叫阻塞其他服務的呼叫。

hystrix.command.GetUser.execution.isolation.strategy=THREAD

Hystrix 熔斷機制

Hystrix 的熔斷機制可以在服務連續失敗達到一定閾值時自動斷開服務呼叫,防止系統過載。

hystrix.command.GetUser.circuitBreaker.requestVolumeThreshold=10
hystrix.command.GetUser.circuitBreaker.sleepWindowInMilliseconds=60000
hystrix.command.GetUser.circuitBreaker.errorThresholdPercentage=50

Hystrix 請求合併

Hystrix 還支援請求合併,可以將多個相似的請求合併為一個請求,減少對後端服務的壓力。

import com.netflix.hystrix.HystrixCollapser;
import com.netflix.hystrix.HystrixCollapserKey;
import com.netflix.hystrix.HystrixCollapserProperties;
import com.netflix.hystrix.HystrixRequestVariable;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableDefault;

public class BatchCommand extends HystrixCommand<User> {

    private final String id;
    private final BatchUserService batchUserService;

    public BatchCommand(String id, BatchUserService batchUserService) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("UserGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("BatchGetUser"))
                .andCollapserKey(HystrixCollapserKey.Factory.asKey("BatchGetUser"))
                .andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter()
                        .withRequestCacheEnabled(true)));
        this.id = id;
        this.batchUserService = batchUserService;
    }

    @Override
    protected User run() throws Exception {
        return batchUserService.getUserById(id);
    }

    @Override
    protected User getFallback() {
        return new User("defaultUser", "Default User");
    }
}

Hystrix 配置管理

Hystrix 的配置可以透過配置中心進行動態管理,實現配置的集中管理和實時更新。

總結

透過本文的介紹,我們瞭解了 Hystrix 的基本概念、如何在 Spring Boot 中整合 Hystrix,以及如何使用 Hystrix 的各種功能來提高系統的容錯性。Hystrix 提供了強大的容錯機制,可以幫助我們在微服務架構中構建更加穩定和可靠的系統。

本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!

相關文章