hystrix對比服務網格istio的destinationrule

蘇小林發表於2019-04-23

使用難度

hystrix

每個專案都需要引入hystrix包,或者在框架裡引入,並且官方僅支援java

<!-- https://mvnrepository.com/artifact/com.netflix.hystrix/hystrix-core -->
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.18</version>
</dependency>
複製程式碼

編寫可熔斷呼叫

public class CommandHelloWorld extends HystrixCommand<String> {

    private final String name;

    public CommandHelloWorld(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        return "Hello " + name + "!";
    }

    @Override
    protected String getFallback() {
        return "Hello World";
    }
}
複製程式碼

destinationrule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
複製程式碼

無應用內程式碼,不需要了解特定語言相關知識,比如hystrix內部的執行緒池,訊號量等。

配置能力

hystrix

hystrix官方提供大量配置項可供使用 Hystrix

hystrix對比服務網格istio的destinationrule

istio

istio同樣提供大量的指標可供配置 通訊路由

hystrix對比服務網格istio的destinationrule

hystrix和istio都提供大量的配置項進行自定義使用

業務侵入性

hystrix硬編碼在業務程式碼裡

destinationrule不在業務程式碼裡

靈活性

destinationrule 隨時可以新增和刪除,無需改動程式碼,並且支援所有語言的應用

hystrix 硬編碼,必須改動應用程式碼或者配置,僅限java使用,並且python, php等語言無官方支援

運維難度

hystrix需要改程式碼或者配置,雖然有apollo/nacos等統一的配置中心,但是還是需要了解hystrix的相關知識,並且可能需要重啟應用等額外操作

destionationrule 運維只需瞭解istio相關知識即可

通過命令: kubectl apply -f 可以直接應用

通過命令: kubectl delete destinationrules.networking.istio.io 服務名 一鍵刪除

維護成本

hystrix需要開發人員和運維人員同時參與維護

destinationrule只需要運維人員維護

熔斷監控

hystrix

hystrix可以在java應用內硬編碼報警指令碼,比如: RegisterCommandExcutionHook.java

關鍵程式碼如下:

HystrixPlugins.getInstance().registerCommandExecutionHook(new HystrixCommandExecutionHook() {
    @Override
    public <T> void onFallbackStart(HystrixInvokable<T> commandInstance) {
        HystrixCommand hystrixCommand = (HystrixCommand) commandInstance;
        String commandKey = hystrixCommand.getCommandKey().toString();
        log.error("Hystrix: {} 介面開始降級", commandKey);
        super.onFallbackStart(commandInstance);
    }
});
複製程式碼

雖然在應用內可以使用程式碼採集足夠的監控指標,但是硬編碼,並且需要開發成本,並且日誌和業務異常混雜在一起,不方便管理

istio

istio可以藉助谷歌開源的prometheus進行監控,不需要應用內的開發,並且預設就支援釘釘等豐富的報警推送

hystrix對比服務網格istio的destinationrule

不過hystrix和istio這兩套環境可以同時存在

相關文章