這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了

無敵天驕發表於2021-04-07

一、簡單使用

fsh-substitution服務中增加Hystrix的依賴,如以下程式碼所示:

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

在啟動類上新增 @EnableHystrix或者 @EnableCircuitBreaker。注意, @EnableHystrix 中包含了 @EnableCircuitBreaker

然後改造之前的 callHello方法,在上面增加一個 @HystrixCommand註解,用於指定依賴服務呼叫延遲或失敗時呼叫的方法,如以下程式碼所示:

@GetMapping ("/ca11Hel1o")@HystrixCommand(fallbackMethod = "defaultCal1Hello")public String callHe11o() {
    String result = restTemplate.getForobject(");
    return result;}

當呼叫失敗觸發熔斷時會用 defaultallHello方法來回退具體的內容,定義 default-CallHello方法的程式碼,如以下程式碼所示:

pub1ic String defaultCal1Hello() {
    return "fail";}

只啟動 fsh-substitution服務而不啟動 fsh-house服務,呼叫 /alHello介面,可以看到返回的內容是 "fail"

將啟動類上的 @EnableHystrix去掉,重啟服務,再次呼叫 /callHello介面可以看到返回的是500錯誤資訊,這個時候就沒有用到回退功能了。

{
    code: 500,
    message: "I/O error on GET request for "http: //fsh-house/ house/hello":        fsh-house; nested exception is java . net . UnknownHostException:
        fsh-house" ,
    data: null}

二、配置詳解

HystrixCommand中除了 fallbackMethod 還有很多的配置,下面我們來看看這些配置:

這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了 這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了 這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了 這大概是全網最詳細的教你如何在 Spring Cloud 中使用 Hystrix 的文章了

官方的配置資訊文件請參考: 

上面列出來的都是Hystrix的配置資訊,在Spring Cloud中如何使用呢?只需要在介面的方法上面使用 HystrixCommand註解( 見下面程式碼),指定對應的屬性即可。

@HystrixCommand(fallbackMethod = "defaultcallHello",commandProperties = {
    @HystrixProperty (
        name= " execution. isolation. strategy",
        value = "THREAD" )
    })@GetMapping("/cal1He1lo")public String cal1He11o() {
    String result =restTemplate .getForobject (
        ");
    return result;}

三、Feign整合Hystrix服務容錯

首先需要執行第一節中的整合步驟,然後在屬性檔案中開啟Feign 對Hystrix的支援:

feign.hystrix.enabled=true

1. Fallback 方式

在Feign的客戶端類上的 @FeignClient註解中指定 fallback進行回退(見下面程式碼),改造 fsh-house的客戶端類 HouseRemoteClient, 為其配置 fallback

@FeignClient(value  = "fsh-house", . path = "/house",configuration =FeignConfiguration.class, fallback = HouseRemoteClientHystrix.class)public interface HouseRemoteClient{
    @GetMapping("/ {houseId}")
    HouseInfoDto hosueInfo (@PathVariable( "houseId" )Long houseId);}

HouseRemoteClientHystrix類需要實現 HouseRemoteClient類中所有的方法,返回回退時的內容,如以下程式碼所示:

@Componentpub1ic class HouseRemoteClientHystrix implements HouseRemoteClient {
    @Override
    public HouseInfoDto hosueInfo(Long houseId) {
        return new HouseInfoDto( ) ;
    }}

啟動 fsh-substitution服務,停掉所有 fsh-house服務,然後訪問 htp://ocalhost:8082/substitution/1介面,這個時候 fsh-house服務是不可用的,必然會觸發回退,返回的內容是正常的格式,只是house物件是空的,這證明回退生效了。在這種情況下,如果你的介面呼叫了多個服務的介面,那麼只有 fsh-house服務會沒資料,不會影響別的服務,如果不用Hystrix回退處理,整個請求都將失敗。

{
    code:200,
    message:"",
    data: {
        id:1,
        money:100.12,
        house: {
            id :null,
            city :nu1l,
            region:null,
            name : null
        }
    }}

下面我們將啟用 Hystrix 斷路器禁用:

feign.hystrix.enabled=false

再次訪問 可以看到返回的就是500錯誤了,整個請求失敗。

{
    code:500,
    message: "Failed to connect to localhost/0:0:0:0:0:0:0:1:8083 executing GET    
    data:null}

2. FallbackFactory 方式

透過fallback已經可以實現服務不可用時回退的功能,如果你想知道觸發回退的原因,可以使用 FallbackFactory來實現回退功能,如以下程式碼所示:

@Componentpublic class HouseRemoteClientFallbackFactory implements FallbackFactory<HouseRemoteClient> {
    @Override
    public HouseRemoteClient create( final Throwable cause) {
        return new HouseRemoteClient() {
            @Override
            public HouseInfoDto hosueInfo(Long houseId) {
                HouseInfoDto info = new HouseInfoDto( );
                info. setData (new HouseInfo(1L, "", "", cause . getMessage()));
                return info;
            }
        };
    }
}

FallbackFactory的使用就是在 @FeignClient中用 fallbackFactory 指定回退處理類,如以下程式碼所示:

@FeignClient (value = "fsh-house",path = "/house”configuration = FeignConfiguration.class,fallbackFactory = HouseRemoteClientFallbackFactory.class)

在這個回退處理的時候,將異常資訊設定到 HouseInfo中的name屬性中了,我們重啟 fsh-substitution,呼叫介面,可以看到異常資訊返回在結果裡面了, FallbackFactory 和  Fallback 唯一的區別就在這裡。

四、Feign 中禁用 Hystrix

禁用Hystrix還是比較簡單的,目前有兩種方式可以禁用,其中一種是在屬性檔案中進行全部禁用。

feign.hystrix.enabled=false

另一種是透過程式碼的方式禁用某個客戶端,在Feign的配置類中增加程式碼,如以下程式碼所示:

@Configurationpublic class FeignConfiguration {
    @Bean
    @Scope("prototype" )
    public Feign. Builder feignBuilder() {
        return Feign.builder();
    }
}

喜歡這篇文章的朋友們可以關注個人簡介中的公眾號

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69964492/viewspace-2766876/,如需轉載,請註明出處,否則將追究法律責任。

相關文章