Hystrix の原理とその使用法

目次

1.コンセプト

1.1. 分散システムが直面する問題

1.2 ハイストリックスとは

1.3、ヒストリックスの役割

1.4、Hystrix ワークフロー

2. ハイストリックス事件

2.1. 通常のマイクロサービス (サービスプロバイダー) の構築

2.2. ストレステスト

2.2.1、Jメーターの圧力テスト

2.2.2. クライアントのストレステスト

3. 解決策

3.1. サービスのダウングレード

3.1.1. サーバー側のマイクロサービスのダウングレード

3.1.2. クライアントマイクロサービスのダウングレード

3.1.3、コードの最適化

4. サービスヒューズ

4.1. ヒューズの概念

4.2. ヒューズ操作 (サーバー側マイクロサービス)

4.2.1、サービス層

 4.2.2、コントローラー層

4.3. ヒューズの原理

4.3.1、ヒューズの種類

4.3.2. サーキットブレーカーのプロセス

5. サービス監視 Hystrix ダッシュボード

5.1 Hystrix ダッシュボードの概要

5.2、Hystrix ダッシュボードサービスの構築

5.2.1、POM ファイル:

5.2.2. yamlファイル(ポート番号)の設定

5.2.3、メインの起動クラスを作成します。

5.2.4. http://localhost:9001/hystrix にアクセスし、次のページを取得します。

5.3、サーキットブレーカーのデモンストレーション (9001 監視 8001)

5.3.1. 監視アドレスを入力します http://localhost:8001/hystrix.stream

5.3.2. マイクロサービスを複数回呼び出し、監視インターフェイスで監視ストリームを開く


1.コンセプト

1.1. 分散システムが直面する問題

1. 分散アーキテクチャ内のアプリケーションには多数の依存関係があり、それぞれの依存関係がある時点で必ず失敗します。

2. サービスアバランチ:

  • 複数のマイクロサービス間で呼び出しを行う場合、マイクロサービス A がマイクロサービス B と C を呼び出し、B と C が他のマイクロサービスを呼び出す、つまり「ファンアウト」とします。
  • ファンアウト リンク上のマイクロサービスの呼び出し応答時間が長すぎるか利用できず、A への呼び出しがますます多くのシステム リソースを占有することになり、システム クラッシュ (カスケード障害)、つまり「雪崩効果」が発生します

1.2 ハイストリックスとは

 1. Hystrix は、分散システムのレイテンシー耐障害性を処理するためのオープンソース ライブラリです

 2. Hystrix は、依存関係の問題が発生した場合に、サービス全体の障害を引き起こさず、連鎖的な障害を回避し、分散システムの弾力性を向上させることができます。

 3. Hystrix は「サーキット ブレーカー」として機能します。サービス ユニットに障害が発生すると、サーキット ブレーカーの障害監視を通じて、長時間待機する代わりに、予期された処理可能な代替応答 (フォールバック) を呼び出し元に返します。呼び出し元が処理できない例外。したがって、雪崩を回避できます。

1.3、ヒストリックスの役割

 1. サービスのダウングレード (フォールバック): サーバーがビジー状態の場合、クライアントは待つことができず、すぐにわかりやすいプロンプトを返します。

発生: 異常なプログラム動作、タイムアウト、サービスヒューズがサービス低下を引き起こす、スレッドプール/セマフォもサービス低下を引き起こす

 2. サービス中断 (Break): 最大サービス アクセスに達した後、アクセスを直接拒否し、サービス ダウングレード メソッドを呼び出し、わかりやすいプロンプトを返します。

 3. リアルタイムに近い監視 (FlowLimit): 同時実行性の高い seckill など、群がったり密集したりすることは厳禁です (1 秒あたり N)。秩序ある方法で処理を進めます。

1.4、Hystrix ワークフロー

 1. HystrixCommand または HystrixObservableCommand オブジェクトを構築してリクエストをカプセル化します

 2. コマンドを実行するために、Hystrix はコマンドを実行する 4 つの方法を提供します。

 3. リクエストに応答するためにキャッシュを使用するかどうかを決定します。キャッシュが有効であり、キャッシュが使用可能な場合は、キャッシュを直接使用してリクエストに応答します。

 4. ヒューズが開いているかどうかを確認し、開いている場合はステップ 8 に進みます。

 5. スレッド プール/キュー/セマフォがいっぱいかどうかを確認し、いっぱいの場合は手順 8 に進みます。

 6. HystrixObservableCommand.construct() または HystrixCommand.run() を実行し、実行が失敗またはタイムアウトした場合は手順 8 に進み、それ以外の場合は手順 9 に進みます。

 7. 統計ヒューズ監視インジケーター。

 8. フォールバック バックアップ ロジックに従います。

 9. リクエスト応答を返します。

2. ハイストリックス事件

2.1. 通常のマイクロサービス (サービスプロバイダー) の構築

  コントローラー: 2 つの項目 (URL マッピング ルール) を提供します。

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_OK(id);
        log.info("result:" + result);
        return result;
    }

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_TimeOut(id);
        log.info("result:" + result);
        return result;
    }
}

2.2. ストレステスト

2.2.1、Jメーターの圧力テスト

2.2.2. クライアントのストレステスト

 サービス: 2.1 で提供されるマイクロサービス インターフェイスを呼び出します。

@Component
@FeignClient(value = "Provider-hystrix-payment")
public interface OrderHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}

3. 解決策

3.1. サービスのダウングレード

  • 独自の通話タイムアウトのピーク値を設定し、ピーク値内で正常に実行できる
  • ボトムアップ方式で対処する必要性を超えて、サービスのダウングレード フォールバックを実行する

3.1.1. サーバー側のマイクロサービスのダウングレード

1. POM ファイル: hystrix 開発シナリオを追加

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

2. ビジネス クラス: @HystrixCommand はボトムアップ ロジックを宣言します

         ビジネスロジックをカバー、タイムアウト例外、計算例外(int i=10/0)もカバー可能

@Service
public class PaymentService {
    //注解中声明paymentInfo_TimeOutHandler方法为兜底业务逻辑,
    //同时声明该业务逻辑的正常执行时长为3秒钟以内
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",
                    commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})
    public String paymentInfo_TimeOut(Integer id) {
        int timeNumber = 10;
        try{
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut,id:" + id + "\t";
    }

    //兜底业务逻辑
    public String paymentInfo_TimeOutHandler(Integer id) {
        return "线程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOutHandler,id:" + id + "\t";
    }
}

3. メインのスタートアップ クラス: @EnableCircuitBreaker を追加してアクティブ化します。

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class, args);
    }
}

3.1.2. クライアントマイクロサービスのダウングレード

1. POM ファイル: hystrix 開発シナリオを追加

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

2. yaml 設定ファイル: Hystrix サービスのダウングレードを有効にする

#开启hystrix
feign:
  hystrix:
    enabled: true

3. メインのスタートアップ クラス: @EnableHystrix を追加して Hystrix をアクティブ化します。

@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class, args);
    }
}

4. ビジネスクラス: 最終的なロジックを宣言する

@HystrixCommand (fallbackMethod = " paymentTimeOutFallbackMethod "、commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds"、value = "1500")})

@RestController
@Slf4j
public class OrderHystrixController {

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
    })
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        return orderHystrixService.paymentInfo_TimeOut(id);
    }

    public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {
        return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
    }
}

5. 試験結果 

3.1.3、コードの最適化

1) 各メソッドには、コード拡張 (ビジネス タイムアウト)を引き起こす最終的な要因があります- クライアント マイクロサービス コードの最適化 (コントローラー)

        特別なビジネス ロジックに加えて、通常のビジネス ロジックについては、一般的なボトムアップ方式を設計し、コードの拡張を防ぐためにグローバルに設定できます。

   1. @DefaultProperties (defaultFallback = " payment_Global_FallbackMethod ") はフォールバック メソッドを宣言します

   2. @HystrixCommand は、このアノテーションを使用してボトムアップ メソッドをマークするために使用されます。

   3. グローバル フォールバック ロジックpayment_Global_FallbackMethodを作成します。

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {

    @Resource
    private OrderHystrixService orderHystrixService;

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        return orderHystrixService.paymentInfo_TimeOut(id);
    }

    //下面是全局fallback方法
    public String payment_Global_FallbackMethod() {
        return "Global异常处理信息,请稍后重试.o(╥﹏╥)o";
    }
}

         試験結果:

2) 肝心な部分はビジネスと一緒に書かれており、コードは混沌としています (サーバーがダウンしているかシャットダウンしています) - クライアント マイクロサービスの分離 (サービス)

1. 新しいサービス クラスを作成し、サービス インターフェイスを実装します。

         サービス クラスは、サーバー側のマイクロサービスへのリモート呼び出し時のサーバー ダウンタイムのボトムアップ ロジックです。

@Component
public class OrderFallbackService implements OrderHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "OrderFallbackService fallback, paymentInfo_OK";
    }

    @Override
    public String paymentInfo_TimeOut(Integer id) {
        return "OrderFallbackService fallback, paymentInfo_TimeOut";
    }
}

2.サービスインターフェース、@FeignClient アノテーション、 フォールバック属性を追加

        サービス インターフェイスはサーバー側インターフェイスへのリモート呼び出しです。 サービス クラスがリモート呼び出しインターフェイスの往復ロジックであることを宣言するには、@FeignClient アノテーションにfallback = OrderFallbackService.class を追加する 必要があります。

@Component
@FeignClient(value = "Provider-hystrix-payment", fallback = OrderFallbackService.class)
public interface OrderHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}

3. yaml ファイルを設定し、Hystrix 機能を有効にします

#开启hystrix
feign:
  hystrix:
    enabled: true

4. テスト: Eureka サーバー、サーバー マイクロサービス、およびクライアント マイクロサービスを順番に開き、サーバー マイクロサービスを手動で閉じる前後にクライアント URL インターフェイスを呼び出して、サーバーへのリモート呼び出しを実行し、結果を表示します。

4. サービスヒューズ

4.1. ヒューズの概念

        ヒューズ メカニズムは、雪崩効果に対処するためのマイクロサービスリンク保護メカニズムであり、ファンアウト リンクのマイクロサービスに障害が発生したり、応答時間が長すぎる場合、サービスがダウングレードされノード マイクロサービスの呼び出しが中断されます。 、すぐにエラー応答メッセージを返します。ノードのマイクロサービス呼び出し応答が正常であることが検出されると呼び出しリンクが再開されます。

4.2. ヒューズ操作 (サーバー側マイクロサービス)

4.2.1、サービス層

        1. 中断されたビジネス ロジックに @HystrixCommand アノテーションを追加します。

                1) サーキットブレーカー宣言後の往復ロジック

                2) ヒューズのパラメータを設定する

        2.paymentCircuitBreaker_fallbackヒューズロジックを追加

@Service
public class PaymentService {
    /** 服务熔断 */
    //表示在时间窗口期中10次请求有6次是错误的,就有调用断路器
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {
            //是否开启断路器
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
            //请求次数
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
            //时间窗口期
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
            //失败率达到多少后跳闸
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),
    })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
        if(id < 0){
            throw new RuntimeException("id,不能为负数");
        }

        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;
    }

    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
        return "id不能为负数,请稍后再试,/(ToT)/~~ id:" + id;
    }
}

 4.2.2、コントローラー層

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/circuit/{id}")
    public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
        String result = paymentService.paymentCircuitBreaker(id);
        log.info("result:" + result);
        return result;
    }
}

4.3. ヒューズの原理

4.3.1、ヒューズの種類

        1) ヒューズオープン: リクエストは現在のサービスを呼び出さなくなり、内部設定は通常 MTTR (平均障害処理時間) になります。

                                オープン時間が設定時間に達すると半ヒューズ状態となります。

        2) ヒューズオフ: ヒューズがオフになると、サービスはヒューズを停止します。

        3) ヒューズ半オープン: 一部のリクエストはルールに従って現在のサービスを呼び出します。リクエストが成功し、ルールを満たしていれば、

                                その後、現在のサービスが通常に戻ったとみなされ、サーキットブレーカーがオフになります。

4.3.2. サーキットブレーカーのプロセス

 1) サーキット ブレーカー オープン設定: スナップショット時間ウィンドウ、合計リクエストしきい値、エラー パーセンテージしきい値

スナップショット時間ウィンドウ: つまり、サーキット ブレーカーが開いているかどうかに関係なく、統計リクエストとエラー データが必要な統計時間範囲 (デフォルトは 10 秒)

リクエストの総数のしきい値: スナップショット時間枠内で、ヒューズの対象となる前に、リクエストの総数のしきい値が満たされる必要があります (デフォルトは 20)

エラー割合のしきい値: リクエストの合計数がしきい値を超えると、応答エラーの割合がしきい値 (デフォルトは 50%) に達するとサーキット ブレーカーがオンになります。

 2) サーキットブレーカーの動作プロセス:

  1. リクエストの総数と失敗率が特定のしきい値に達すると、サーキット ブレーカーがオンになります。
  2. 有効にすると、すべてのリクエストは転送されなくなります
  3. 一定時間 (デフォルトでは 5 秒) が経過すると、サーキット ブレーカーが半開きになり、リクエストの 1 つが転送されるようになります。
    1. 成功するとサーキットブレーカーが閉じます
    2. 失敗した場合は開き続けます

 3) サーキットブレーカーが開いた後:

        別のリクエストがある場合、メイン ロジックは呼び出されず、ダウングレード フォールバックが直接呼び出されます。サーキットブレーカーによりエラーが自動的に検出され、劣化したロジックがメインロジックに切り替えられ、応答遅延の影響が軽減されます。

5. サービス監視 Hystrix ダッシュボード

5.1 Hystrix ダッシュボードの概要

        Hystrix は、準リアルタイムの通話監視 (Hystrix ダッシュボード) を提供します。Hystrix は、Hystrix を通じて開始されたすべてのリクエストの実行情報を継続的に記録し、それらを統計レポートとグラフィックの形式でユーザーに表示します。多くの成功、失敗など。Spring Cloud は、監視コンテンツを視覚的なインターフェイスに変換する Hystrix ダッシュボードの統合も提供します。

5.2、Hystrix ダッシュボードサービスの構築

5.2.1、POM ファイル:

        hystrix-ダッシュボード開発シーンを追加

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

5.2.2. yamlファイル(ポート番号)の設定

server:
  port: 9001

5.2.3、メインの起動クラスを作成します。

        @EnableHystrixDashboard アノテーションを追加して、Hystrix ダッシュボード コンポーネントをアクティブにします。

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoardMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashBoardMain9001.class, args);
    }
}

5.2.4. http://localhost:9001/hystrix にアクセスし、次のページを取得します。

5.3、サーキットブレーカーのデモンストレーション (9001 監視 8001)

5.3.1. 監視アドレスを入力します http://localhost:8001/hystrix.stream

5.3.2. マイクロサービスを複数回呼び出し、監視インターフェイスで監視ストリームを開く

 1) 監視結果を表示します。

 2) モニタリング指標の説明:

 

おすすめ

転載: blog.csdn.net/weixin_44302046/article/details/124796700