Spring Cloud Hystrixによるマイクロサービスのフォールトトレランス処理

9510 ワード

エラーの許容方法
フォールトトレランスメカニズム:
1、ネットワーク要求にタイムアウトを設定する:ネットワーク要求にタイムアウトを設定しなければならない.一度のリモートコールは1つのスレッド/プロセスに対応している.応答が遅すぎると、このスレッドは解放されず、システム資源を占有している.このようなスレッドが多すぎると、資源が消耗し、最終的にサービスが利用できない.
2、遮断器モードを使用する:遮断器は間違いのない操作を招きやすいエージェントに対して理解することができ、このエージェントはしばらくの間呼び出しに失敗した回数を統計し、正常な要求に依存するサービスか直接戻るかを決定することができる.遮断器は、依存するサービスが正常に回復したかどうかを自動的に診断することもでき、回復した場合、サービスが要求されるように回復します.
ブレーカ状態変換の論理:
1、通常の場合、遮断器は閉じ、依存するサービスを正常に要求することができる.
2、一定時間以内に要求失敗率が一定の閾値(エラー率が50%に達し、100回/分)に達すると遮断器が開き、この場合、依存するサービスは要求されなくなる.
3、遮断器がしばらく開いた後、自動的に半開状態に入る.この時、遮断器は依存するサービスへのアクセスを要求することを許可することができ、要求呼び出しが成功した場合、遮断器を閉じ、そうでなければ開放状態を維持し続ける.
一、Hystrix遮断器の概要
Hystrixはタイムアウト機構と遮断器モードを実現したツールクラスライブラリである.
HystrixはNetflixオープンソースの遅延とフォールトトレランスライブラリであり、リモートシステム、サービス、サードパーティライブラリへのアクセスを分離し、カスケードの失敗を防止し、システムの可用性とフォールトトレランスを向上させるために使用されます.
Hystrixフォールトトレランス機構:
1.ラップ要求:HystrixCommandラップを使用して依存の呼び出しロジックをラップし、各コマンドは独立したスレッドで実行し、これは設計モード「コマンドモード」を使用した.
2、トリップメカニズム:あるサービスのエラー率が一定の閾値を超えた場合、Hystrixは自動または手動でトリップし、そのサービスをしばらく停止することができる.
3、資源隔離:Hystrixは各依存に対して小型のスレッドプールを維持し、もしスレッドプールがいっぱいになったら、その依存への要求はすぐに拒否され、キュー待ちではなく、それによって判定の失敗を加速する.
4、監視:Hystrixはリアルタイムで運行指標と配置の変化を監視できる.成功、失敗、タイムアウト、拒否されたリクエストなど.
5.フォールバックメカニズム:要求が失敗し、タイムアウトし、拒否された場合、或いはブレーカが開いた場合、フォールバックロジックを実行する.ロールバックロジックはカスタマイズできます.
6、自己修復:遮断器がしばらく開くと、自動的に半開状態に入り、遮断器が開く、閉じる、半開の論理変換になる.
Hystrixスレッド分離ポリシーと伝播コンテキスト:
THREAD:スレッド分離、HystrixCommandは単独のスレッド上で実行され、同時要求はスレッドプール内のスレッド数によって制限される.
SEMAPHORE:信号量分離、HystrixCommandは呼び出しスレッド上で実行され、オーバーヘッドは比較的小さく、同時要求は信号量個数に制限されます.
Hystrixモニタ:
Hystrixはリアルタイムに近いモニタリングを提供し、HystrixCommandとHystrixObserv-ableCommandは実行時に実行結果と実行指標を生成します.例えば、1秒あたりの実行要求数、成功数などです.
SpringCloudはこのコンポーネントを統合した.マイクロサービスアーキテクチャでは、次の図に示すように、1つのリクエストが複数のサービスを呼び出す必要があるのはよくあります.
下位レベルのサービスで障害が発生すると、チェーン障害が発生します.特定のサービスに対する呼び出しが1つのバルブ値(Hystricは5秒20回)に達しない場合、遮断器が開かれる.
遮断がオンの場合、チェーン障害を回避することができ、fallbackメソッドは固定値を直接返すことができます.
二、準備
この文章は前の文章の工事に基づいて、まず前の文章の工事をスタートさせ、eureka-server工事をスタートさせる.サービス-hiプロジェクトを開始し、ポートは8762です.
三、ribbonで遮断器を使う
サービス-ribbon工事のコードを改造して、まずpox.xmlファイルにspring-cloud-starter-hystrixの開始依存性を追加するには、次の手順に従います.
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-hystrixartifactId>
dependency>

プログラムの起動クラスServiceRibbonApplicationプラス@EnableHystrix注記でHystrixをオンにします.
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

HelloServiceクラスを改造し、hiServiceメソッドに@HystrixCommand注記を付けます.この注記はこのメソッドに対してヒューズの機能を作成し、fallbackMethodヒューズメソッドを指定し、ヒューズメソッドは直接文字列を返し、文字列は「hi,」+name+」,sorry,error!」,コードは次のとおりです.
@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }
}

起動:service-ribbonプロジェクト、アクセス時http://localhost:8764/hi?name=forezpを選択します.
hi forezp,i am from port:8762
サービスhiプロジェクトを閉じ、再アクセスするとhttp://localhost:8764/hi?name=forezpを選択します.
hi ,forezp,orry,error!
これは、service-hiエンジニアリングが使用できない場合、service-ribbonがservice-hiのAPIインタフェースを呼び出すと、応答のタイムアウトを待つのではなく、高速に失敗し、応答のタイムアウトを待つ文字列のセットを直接返すことを示しており、コンテナのスレッドのブロックをよく制御しています.
四、Feignで使用する遮断器
Feignはブレーカー付きで、DバージョンのSpring Cloudではデフォルトで開いていません.プロファイルで開くように設定し、プロファイルに次のコードを追加する必要があります.
feign.hystrix.enabled=true
サービス-feignプロジェクトに基づいて改造するには、FeignClientのSchedualServiceHiインタフェースの注釈にfallbackの指定クラスを加えるだけでいいです.
@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

SchedualServiceHiHystricは、SchedualServiceHiインタフェースを実装し、Iocコンテナに注入する必要があります.コードは次のとおりです.
@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

四servcie-feignプロジェクトを起動し、ブラウザが開きます.http://localhost:8765/hi?name=forezp、この時点でservice-hiプロジェクトが開始されず、Webページが表示されます.
sorry forezp
サービス-hiプロジェクトを開き、再度アクセスし、ブラウザが表示されます.
hi forezp,i am from port:8762
これは遮断器が機能していることを証明した.
五、Hystrix Dashboard(遮断器:Hystrix計器盤)
サービス-ribbon改造に基づいて、Feignの改造はこれと同じです.
優先はpom.xmlはspring-cloud-starter-hystrix-dashboardの初期依存性を導入します.
<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-hystrix-dashboardartifactId>
        dependency>

メインプログラム起動クラスに@EnableHystrixDashboard注記を追加し、hystrixDashboardを開きます.
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

ブラウザを開く:アクセスhttp://localhost:8764/hystrix画面は次のとおりです.
モニタstreamをクリックし、次のインタフェースにアクセスします.http://localhost:8764/hi?name=forezp
モニタ画面が表示されます.
ソースコードのダウンロード:https://github.com/forezp/SpringCloudLearning/tree/master/chapter4