springcloud(グリニッジ):Hystrixフォールトトレランス構成

概要概要

分散型フレームワークでは、サービス間のリモートコールが必要になることがよくあります。このように、ネットワーク上の理由やサービス自体によっては、コールの失敗や遅延が発生する場合があります。これらの条件が発生すると、外部インターフェイスサービスの遅延が直接発生します。パーティが多数の遅延インターフェイスまたはサービスを呼び出すと、解放できないタスクとスレッドリソースのバックログが発生し、最終的にはコールチェーン全体に広がり、最終的にシステム全体がダウンします。

springcloudでは、上記の問題に対してSpring Cloud Hystrixの耐障害性保護が提供されます。また、NetflixのオープンソースフレームワークHystrixに基づいて実装され、サービスの低下、サービスヒューズ、スレッドの分離、要求のキャッシュ、要求のマージ、サービスの監視などの強力な機能を備えています。 。

  • リソースの分離:スレッドプールの分離とセマフォの分離を含み、分散サービスを呼び出すためのリソースの使用を制限します。呼び出されたサービスの問題は、他のサービス呼び出しには影響しません。
  • ダウングレードメカニズム:時間の経過と不十分なリソース(スレッドまたはセマフォ)のダウングレード。ダウングレード後、ダウングレードインターフェイスと連携して、最下位のデータを返すことができます。
  • ヒューズ:障害率がしきい値に達すると、劣化が自動的にトリガーされ(たとえば、ネットワーク障害/タイムアウトのために障害率が高くなります)、ヒューズによってトリガーされた高速障害はすぐに回復します。
  • キャッシュ:リクエストキャッシュとリクエストマージの実装を提供します。

機構

隔離

  1. スレッドプール分離モード:スレッドプールを使用して現在の要求を保存し、スレッドプールが要求を処理し、タスクリターン処理のタイムアウト時間を設定し、蓄積された要求が最初にスレッドプールキューに入ります。この方法では、依存するサービスごとに一定のリソース消費があるスレッドプールが必要です。利点は、突然のトラフィックに対応できることです(トラフィックのピークが来ると、データをスレッドプールチームに保存して処理を遅くすることができます)。
  2. セマフォ分離モード:アトミックカウンタ(またはセマフォ)を使用して、現在実行中のスレッドの数を記録します。要求は、最初にカウンタの値を決定することです。スレッドの最大数を超えると、このタイプの新しい要求は破棄されます。カウンタ+1に対してカウント動作要求を実行し、カウンタ-1を返すように要求します。この方法は、スレッドを厳密に制御してすぐに戻り、突然のトラフィックに対応できません(トラフィックのピークが来ると、処理されるスレッドの数が数を超え、他の要求が直接返され、依存サービスは要求され続けません)

ヒューズ

通常の状況では、回路ブレーカーは閉じた状態(Closed)です。呼び出しが失敗またはタイムアウトし続ける回路が開いて融合状態(Open)になります。一定期間内の後続の呼び出しはすべて拒否されます(Fail Fast)。一定期間が経過すると、保護デバイスはハーフオープン状態(ハーフオープン)入ろうとし、少数のリクエストを受信して​​試行します。それでもコールが失敗した場合はヒューズ状態に戻り、コールが成功した場合は回路クローズ状態に戻ります。

ブレーカ

  • 特定のしきい値に達したとき(デフォルトは10秒以内に20を超えるリクエストです)
  • 失敗率が特定のレベルに達すると(デフォルトでは、要求の50%以上が10秒以内に失敗します)
  • 上記のしきい値に達すると、回路ブレーカーが開きます
  • 有効にすると、すべてのリクエストが転送されるわけではありません
  • しばらくすると(デフォルトは5秒)、この時点で回路ブレーカーが半分開いており、要求の1つが転送されます。成功した場合は回路ブレーカーが閉じ、失敗した場合は開き続けます。

ダウングレード

特定のサービスまたはインターフェースで多数のインターフェース呼び出し例外が発生すると、サービスまたはインターフェース全体が融合され、呼び出されなくなります。これは劣化になります。

 

簡単なspringcloud(グリニッジ)プロジェクト、レジストリ、コンシューマー、およびサービスプロバイダーを事前に準備してください。コンシューマーサービスは、Feignリモートコールに基づいています。

Spring Cloud Hystrixはサービスの低下、サービスヒューズ、その他の機能を実現するための消費者側であるため、消費者サービスには次の依存関係が導入されています

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

Feignコールインターフェイスの変換

package com.leolee.msf.feignInterface;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient("database-web")
public interface TestClinet {

    @RequestMapping(value = "/test/hello", method = RequestMethod.GET)
    public String feignHello();

    @RequestMapping(value = "/test/value", method = RequestMethod.GET)
    public String feignValue();
}

重要なポイントは次のとおりです。

package com.leolee.msf.service;


import com.leolee.msf.feignInterface.TestClinet;
import com.leolee.msf.service.serviceInterface.TestService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @ClassName TestServiceImpl
 * @Description: TODO
 * @Author LeoLee
 * @Date 2020/8/18
 * @Version V1.0
 **/
@Service("loginService")
public class TestServiceImpl implements TestService {

    @Autowired
    private TestClinet testClinet;

    @HystrixCommand(fallbackMethod = "fallback")
    @Override
    public String getFeignValue() {
        return testClinet.feignValue();
    }

    public String fallback() {
        return "Hystrix";
    }
}

Feignインターフェイスを挿入した後、呼び出し元のメソッドに@HystrixCommand(fallbackMethod = "fallback")を追加します

fallbackMethodはfallback()メソッドを指します。タイムアウトが発生すると、リモート呼び出しをアクティブに破棄し、代わりにローカルのfallback()メソッドを呼び出します。

関連する構成

ribbon:
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 默认为;轮询,这里改为随机
#  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
  ConnectTimeout: 5000 # 连接超时时间(ms)
  ReadTimeout: 5000 # 通信超时时间(ms)

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 7000 # 设置hystrix的超时时间为6000ms

feign.hystrix.enabled = trueは、偽の障害耐性を有効にします

Hystrixのデフォルトの通話タイムアウト時間は6000msで、実際の状況に応じて調整できます

おすすめ

転載: blog.csdn.net/qq_25805331/article/details/108297545