Hystrixサービスサーキットブレーカーとサービス劣化

ソースアドレス:https//gitee.com/peachtec/springcloud

分散した問題

  複雑な分散アーキテクチャのアプリケーションには数十の依存関係があり、各依存関係はある時点で必然的に失敗します

サービス雪崩

  複数のマイクロサービス間で呼び出しを行う場合、マイクロサービスAがマイクロサービスBとマイクロサービスCを呼び出し、マイクロサービスBとマイクロサービスCが他のマイクロサービスを呼び出すと仮定します。これは「ファンアウト」と呼ばれます。リンク上のマイクロサービスの呼び出し応答時間が長すぎるか、利用できない場合、マイクロサービスAの呼び出しはますます多くのシステムリソースを占有し、システムが崩壊します。つまり、「アバランシェ効果」は
  トラフィックが多い場合です。アプリケーションの場合、単一のバックエンド依存関係により、すべてのリソースにすべてのリソースが発生する可能性があります。サーバーは数秒以内に飽和状態になります。これらのアプリケーションは、障害よりも悪いことに、サービス間の遅延の増加、バックアップキュー、スレッド、その他のシステムリソースのタイトさを引き起こし、システム全体でより多くのカスケード障害を引き起こす可能性があります。単一の依存関係の障害がアプリケーションまたはシステム全体をキャンセルできないように、障害と遅延を分離して管理します。

サービス融合

  ヒューズメカニズムは、アバランシェ効果に対応するマイクロサービスリンク保護メカニズムです。
  ファンアウトリンクのマイクロサービスが利用できない場合、または対応する時間が長すぎる場合、サービスが低下し、マイクロサービスが低下します。ノードの呼び出しはヒューズになります。エラーレターの応答情報を返します。ノードのマイクロサービス呼び出しが正常であることが検出されると、呼び出しリンクが復元されます。SpringCloudフレームワークでは、ヒューズメカニズムはHystrixによって実装されます。 。Hystrixはマイクロサービス間の呼び出しを監視します。失敗した呼び出しが特定のレベルに達すると、しきい値が設定されると、デフォルトでは5秒以内に20回の呼び出しが失敗すると、ヒューズメカニズムがアクティブになります。ヒューズメカニズムの注釈は@です。 HystrixCommand

Hystrixとは

  Hystrixは、分散システムの遅延とフォールトトレランスを処理するために使用されるオープンソースライブラリです。分散システムでは、タイムアウトや例外など、多くの依存関係の呼び出しに必然的に失敗します。Hystrixは、依存関係の問題、全体的なサービス障害を引き起こさない、分散システムの復元力を向上させるためのカスケード障害を回避する。
  「ヒューズ」自体はスイッチングデバイスです。サービスユニットに障害が発生すると、回路ブレーカーのフォールトモニタリングが発信者に通知します。 。サービスの呼び出し元のスレッドが不必要に長時間占有されないようにするために、長時間待機したり、呼び出しメソッドの未処理の例外をスローしたりする代わりに、サービスが期待して処理できる代​​替応答を返します。これにより、分散システムでの障害の拡大、さらには雪崩を回避できます。

Hystrixの役割

  1.保護を提供し、サードパーティのクライアントライブラリ(通常はネットワーク)を介してアクセスされる依存関係の遅延と障害を制御します。
  2.複雑な分散システムでのカスケード障害を停止します。
  3.迅速に失敗し、迅速に回復します。
  4.可能であれば、ロールバックして通常どおりダウングレードします。
  5.ほぼリアルタイムの監視、アラーム、および操作制御を有効にします。

Hystrixはどのような問題を解決しますか

  複雑な分散アーキテクチャのアプリケーションには数十の依存関係があり、各依存関係はある時点で必然的に失敗します。ホストアプリケーションがこれらの外部障害から分離されていない場合、それは排除される可能性があります。
  たとえば、30のサービスに依存するアプリケーションの場合、それぞれの稼働時間は99.99%ですが、次のことが期待できます。

99.99 30 =稼働時間の99.7%
10億リクエストの0.3%= 3,000,000の失敗
/月に2時間以上のダウンタイム(すべての依存関係に優れた稼働時間があったとしても)。
  

  現実は通常もっと悪いです。システム全体を柔軟に設計せず、すべての依存関係が適切に実行されている場合でも、数十のサービスのそれぞれに対する0.01%の一時停止時間の合計の影響は、1か月に発生する可能性のあるダウンタイムの時間数に等しくなります。
  すべてが正常な場合、リクエストフローは次のようになります。
ここに画像の説明を挿入
  多くの依存サービスの1つが送信に失敗すると、すべてのユーザーリクエストがブロックされる可能性があります。
ここに画像の説明を挿入
  トラフィックの多いアクセスでは、単一のバックエンドサービスにエラーが発生し、リソースはわずか数秒で飽和状態になります(必ずしもリソースが飽和状態になるとは限りません。たとえば、失敗した要求がタイムアウトに戻ると、スレッド数が急激に増加し、要求を解放できない場合は、ネットワークの輻輳が発生します)。
  アプリケーションはリクエストを受信し、ネットワークを介して各依存サービスにアクセスします。この時点で、各サービスに潜在的なエラーがある可能性があります。サービスがダウンしたときと比較して、さらに恐ろしいのは、これらのサービスがサービス間の遅延を増加させ、バックアップキュー、スレッド、およびその他のリソースが占有され、システム全体のカスケード障害が発生する可能性があることです(サービスクラスター全体がダウン。、サーバーに到達できなくても)。
ここに画像の説明を挿入

Hystrixの設計原則

  1.単一の依存サービスがコンテナー全体(例:tomcat、jbossなど)のユーザースレッドを使い果たすのを防ぎます
  。2。キューイング(回復を待つのではなく、回線間で中断)する代わりに、負荷を減らしてすぐに失敗します。
  3.ユーザーを障害から保護するために許可されているバックアップメカニズムを提供します。
  4.分離技術(分離、スイムレーン、開回路など)を使用して、依存するサービス障害の影響を制限します
  。5 ほぼリアルタイムのインジケーター、監視、およびアラーム
  を通じて検出時間最適化します。ほとんどの場合、構成の変更を低遅延で伝達します。 Hystrixの側面リカバリ時間を最適化し、動的な属性変更をサポートします。これにより、低遅延のフィードバックループを通じてリアルタイムの運用上の変更を行うことができます。
  6.ネットワーク要求の失敗(ネットワークの輻輳)だけでなく、サービスクラスター全体の実行が失敗するのを防ぎます。
  

Hystrixはどのようにして設計目標を達成しますか?

Hystrixは、これを次の方法で
  実行します。1。実行用に別のスレッドによって実行されるHystrixCommandまたはHystrixObservableCommandオブジェクトに依存サービス(または依存関係)をラップします(コマンドモード)。
  2.要求のタイムアウトに費やされた時間が、定義されたしきい値(構成されたタイムアウト期間)を超えています。Hystrixは、実際の要求時間よりもわずかに長いタイムアウト構成を提供します。これらの要求がタイムアウトすると、要求は直接拒否されます(これは、タイムアウト例外を返す主な理由でもあります)。
  3. Hystrixは小さなスレッドプール(またはセマフォ)を維持します。セマフォまたはスレッドプールがいっぱいの場合、要求は待機またはキューイングする代わりに直接拒否されます。
  4.成功または失敗(Hystrixクライアントによってスローされた例外)、タイムアウト、およびスレッド拒否を計算します
  。5 サービスのエラーの割合がしきい値を超えると、回路ブレーカーが作動します(作動します)。特定の要求(切断される要求)は、接続が接続されている間、自動または手動で停止されます。
  6.失敗した要求、要求の拒否、要求のタイムアウト、または切断のフォールバック戦略を実装します。
  7.リアルタイムの監視と動的な構成。
  Hystrixを使用して依存サービスをカプセル化すると、上の図に示されている状況のアーキテクチャーは、次の図の状況のようになります。各依存関係は互いに分離されます(HystrixCommandまたはHystrixObservableCommandによる分離)。依存関係でエラー、タイムアウト、リソース(スレッド、セマフォ)の制限、または拒否が発生すると、フォールバックロジックが実行されます。フォールバックロジックは、依存関係が任意のタイプの障害を送信したときに応答します。
ここに画像の説明を挿入

サービス融合

  サービスヒューズはサービスプロバイダーで実行されるので、サービスプロバイダーモジュールを変換します。便宜上、サービスプロバイダーモジュールを直接作成します。コードは他のサービスプロバイダーモジュールのコードを直接コピーしてから、Hystrixを追加します。関連コード

  1. Hystrixjarパッケージの依存関係をインポートする
<!-- hystrix-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. コントロールレイヤーインターフェイスにヒューズノートを追加し、ヒューズにする方法を指定します
    @GetMapping("/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGet")//指定服务熔断执行的方法
    private Dept get(@PathVariable("id") Integer id) {
    
    
        Dept dept = service.queryById(id);
        if (dept == null) {
    
    
            throw new RuntimeException("用户不存在");
        }
        return dept;
    }

    /**
     * 备选方法
     */
    private Dept hystrixGet(@PathVariable("id") Integer id) {
    
    
        return new Dept().setId(id)
                .setName("没用对应信息")
                .setDbSource("mysql中没有这个数据库");
    }
  1. オープンサービスサーキットブレーカ
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到eureka
@EnableDiscoveryClient//服务发现
@EnableCircuitBreaker
public class Dept_Hystrix_8001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Dept_Hystrix_8001.class, args);
    }
}
  1. テストのためにサービスを開始すると、どのようにクエリを実行しても、以前のようにエラーページが直接表示されず、間違ったクエリがサービスサーキットブレーカーで指定されたメソッドを呼び出すことがわかります。
    ここに画像の説明を挿入
サービスの低下

  サービスの低下はサービスコンシューマーで実行され、使用するようにFeignを構成する方が便利なので、パブリックモジュールでFeignサービスレイヤーインターフェイスのメソッドを直接変更します。

  1. パブリックモジュールのクラスを編集してFallbackFactoryクラスを実装し、メソッドを再作成すると、新しいメソッドはFeignサービスレイヤーインターフェイスクラスを返します。
@Component
public class ClientFallbackFactory implements FallbackFactory {
    
    
    @Override
    public ClientService create(Throwable throwable) {
    
    
        return new ClientService() {
    
    
            @Override
            public boolean addDept(Dept dept) {
    
    
                return false;
            }

            @Override
            public Dept queryById(Integer id) {
    
    
                return new Dept().setId(id).setName("服务已关闭").setDbSource("no database");//测试案例
            }

            @Override
            public List<Dept> queryAll() {
    
    
                return null;
            }
        };
    }
}
  1. FeignのサービスレイヤーインターフェイスクラスでFeignのリターンファクトリのタイプを構成します
@FeignClient(value = "SPRINGCLOUD-SERVER",fallbackFactory = ClientFallbackFactory.class)
@Component
public interface ClientService {
    
    
    @PostMapping("/dept/add")
    boolean addDept(Dept dept);

    @GetMapping("/dept/get/{id}")
    Dept queryById(@PathVariable("id") Integer id);

    @GetMapping("/dept/get")
    List<Dept> queryAll();
}
  1. Feignのコンシューマーモジュールのyaml構成ファイルでダウングレードサービスをオンにします
# 开启降级服务
feign:
  hystrix:
    enabled: true
  1. テストを開始します
    ここに画像の説明を挿入
ダッシュボードフローモニタリング

  Hystrixとクライアントには関連する操作があり、これらのリクエストを監視できます。ダッシュボードはこれらの情報を監視するための監視ページです。

  1. 「springcloud-consumer-hystrix-dashboard」モジュールを作成します。このモジュールはダッシュボードの監視ページであり、jarパッケージをインポートします。
<dependencies>
  <!-- dashboard -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  </dependency>
  <!-- hystrix-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  </dependency>
  <!-- Ribbon -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  </dependency>
  <!-- Eureka -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
  <dependency>
      <groupId>org.peach</groupId>
      <artifactId>springcloudentity</artifactId>
      <version>1.0</version>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
  </dependency>
</dependencies>
  1. yamlファイルを構成し、最初に簡単な経験をして、ポートを構成します
server:
  port: 9001
hystrix:
  dashboard:
    proxy-stream-allow-list: "*"
  1. スタートアップクラスの監視をオンにする
@SpringBootApplication
@EnableHystrixDashboard//开启监控
public class DeptConsumerDashboard_9001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(DeptConsumerDashboard_9001.class, args);
    }
}
  1. 各サービスプロバイダーモジュールに「spring-boot-starter-actuator」サービス監視の依存関係があることを確認してから、テストを開始し、ブラウザーhttp:// localhost:9001 / hystrixにアクセスします。ダッシュボードのデフォルトページが表示されます。
    ここに画像の説明を挿入
  2. これでダッシュボードは空になり、何もありません。ダッシュボードを内部で構成し、サービスプロバイダーモジュールに登録して、監視する必要のあるインターフェイスに「@HystrixCommand」アノテーションを追加します。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到eureka
@EnableDiscoveryClient//服务发现
@EnableCircuitBreaker
public class Dept_Hystrix_8001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Dept_Hystrix_8001.class, args);
    }
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet() {
    
    
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }
}
  1. テストするサービスを開始します。ブラウザはhttp:// localhost:8001 /actuator/hystrix.streamにアクセスします。実際のポートは独自のサービスに従ってアクセスされます。サービスが開始されるとアクセスアドレスが常にpingを実行していることがわかります。似たようなものハートビートの場合、監視対象のインターフェイスにアクセスすると、ページにデータが表示されます。これは、ハートビートパケットの送信に相当します。
    ここに画像の説明を挿入
  2. 次に、ダッシュボードのアドレスにアクセスし、フローを監視するページに移動し、
    ここに画像の説明を挿入
    監視ページ入ると、監視対象のインターフェイスのステータス情報が表示されます。現在アクセスできません。
    ここに画像の説明を挿入
    インターフェイスにアクセスすると、監視情報が表示されます。また、変更
    ここに画像の説明を挿入
    チャットインターフェースの詳細については。
      
      黒丸2つの意味は、色の変化、緑<黄<オレンジ<赤色漸減の代表例の健康によって、あり;流量の例を要求することによって変化するそのサイズ、流れが大きいほど、黒丸が大きくなるため、黒丸の表現を通じて、多数のインスタンスで障害のケースと高電圧のケースをすばやく見つけることができます。
    ここに画像の説明を挿入
      最初の線の
      曲線:流れの相対的な変化を記録します。2分以内に、フローの上下傾向を観察するために使用できます
    ここに画像の説明を挿入
      その他
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_45481406/article/details/110404439