1. 程式人生 > >筆記:Spring Cloud Feign Hystrix 配置

筆記:Spring Cloud Feign Hystrix 配置

微軟 lba one 機制 service () 指定 disable end

在 Spring Cloud Feign 中,除了引入了用戶客戶端負載均衡的 Spring Cloud Ribbon 之外,還引入了服務保護與容錯的工具 Hystrix,默認情況下,Spring Cloud Feign 會為將所有 Feign客戶端的方法都封裝到 Hystrix 命令中進行服務保護,需要註意的是 Ribbon 的超時與 Hystrix 的超時是二個概念,需要讓 Hystrix 的超時時間大於 Ribbon 的超時時間,否則 Hystrix 命令超時後,該命令直接熔斷,重試機制就沒有意義了。

全局配置

對於 Hystrix 的全局配置同 Spring Cloud Ribbon 的全局配置一樣,直接使用他的默認配置前綴 hystrix.command.default 就可以設置,比如,設置全局的超時時間,yml 配置格式如下:

hystrix:

command:

default:

execution:

isolation:

thread:

timeoutInMillisecondes: 5000

在對Hystrix進行配置之前,我們需要確認 feign.hystrix.enabled 參數沒有被設置為 false,該參數的含義就是關閉 Feign 客戶端的 Hystrix 支持.

禁用 Hystrix

在 Spring Cloud Feign 中,可以通過 feign.hystrix.enabled=false 來關閉Hystrix 功能,如果不想全局關閉 Hystrix 支持,而只想針對某個服務客戶端關閉 Hystrix 支持,而要通過使用 @Scope("prototype") 註解為指定的客戶端配置 Feign.Builder 實例,實現步驟如下:

  • 構建一個關閉 Hystrix 的配置類:

    @Configurable

    public class DisableHystrixConfiguration {

    @Bean

    @Scope ("prototype")

    public Feign.Builder feignBuilder() {

    return Feign.builder();

    }

    }

  • 在服務的 @FeignClient 註解中,通過 configuration 參數引入上面的配置:

    @FeignClient (value = "ORG.LIXUE.HELLOWORLD", configuration = DisableHystrixConfiguration.class)

    public interface HelloWorldServiceProxy extends HelloWorldService {

    }

指定命令的配置

對於 Hystrix 命令的配置,在實際應用時往往也會根據實際業務情況制定出不同的配置方案,配置方法也跟傳統的 Hystrix 命令的參數配置相似,采用 hystrix.command.<commandKey> 作為前綴,而 <commandKey>默認會采用 Feign 客戶端中的方法名作為標識,由於方法名很有可能重復,這個時候相同方法名的 Hystrix 配置會共用,所以在進行方法定義與配置的時候需要做好一定的規劃,也可以重寫 Feign.Builder 的實現,並在應用主類中創建它的實例來覆蓋自動化配置的 HystrixFeign.Builder 實現,示例配置如下:

hystrix:

command:

// 默認命令配置

default:

execution:

isolation:

thread:

timeoutInMillisecondes: 5000

tiemout:

enabled: false

// hi 命名配置

hi:

execution:

isolation:

thread:

timeoutInMillisecondes: 50

服務降級配置

Hystrix 提供的服務降級是服務容錯的重要功能,由於 Spring Cloud Feign 在定義服務客戶端時候與 Spring Cloud Ribbon 有很大差別,HystrxCommand 定義被封裝起來了 Spring Cloud Feign 提供了另一種簡單的定義方式,服務降級邏輯的實現只需要為Feign 客戶端的定義接口編寫一個具體的接口實現類,然後通過 @FeignClient 註解的 fallback 屬性來指定對應的服務降級實現類即可,示例如下:

  • 定義服務實現的客戶端接口,創建 HelloWorldClient 接口,並繼承與服務接口 HelloWorldService,增加 @FeignClient 註解,並指定服務名稱、fallback設置服務降級實現類(代碼在後面)和,代碼如下:

    @FeignClient (value = "ORG.LIXUE.HELLOWORLD", configuration=FeignConfig.class,

    fallback = HelloWorldServiceFallback.class)

    public interface HelloWorldClient extends HelloWorldService {

    }

  • 創建服務降級類,繼承與 HelloWorldClient 接口,該類不能和應用主類為同包及其子包內,並實現降級業務,代碼如下:

    @Component

    public class HelloWorldServiceFallback implements HelloWorldClient {

    @Override

    public String hi() {

    return "fallback hi";

    }

    @Override

    public String hi(String name) {

    return "fallback hi name=" + name;

    }

    @Override

    public String hi(@RequestBody User user) {

    return "fallback hi user=" + user;

    }

    }

  • 創建配置類 FeingConfig ,並在配置類中創建 HelloWorldServiceFallback 類的 Bean,代碼如下:

    @Configurable

    public class FeignConfig {

    @Bean

    public HelloWorldServiceFallback helloWorldServiceFallback() {

    return new HelloWorldServiceFallback();

    }

    }

  • 測試驗證,啟動服務註冊中心和Feign客戶端項目,不啟動 ORG.LIXUE.HELLOWORLD 服務項目,訪問服務會直接觸發服務降級。

筆記:Spring Cloud Feign Hystrix 配置