Hystrixサービス低下エントリレイダースのSpringCloud

理論的な知識

  • 何Hystrixこと?

    HystrixオープンソースのNetflixは、リソースのシステム使用不能溶液の枯渇を引き起こして、遅延を回避するサービス成分分離、信頼を介してサービスの分離、異常です。それはちょっとあまりにも公式の、言った、そしてそれは、次の3つの中で主に機能します:

  • サービスのダウングレード

    すべての「マイクロサービスは」間のHTTPレスト方法を通じてWebプロジェクトであるのでSpringCloudは、呼び出された「マイクロ・サービスを提供しています。」それはWebプロジェクトがあるので、それは誤りである可能性が高い、エラーはメモリ不足サーバ、エラーを渡すクライアントパラメータ、ネットワークの問題であってもよいし、彼らはまた、おそらく人工(これがあるべきであるサービスヒューズ)。理由はいくつかの理由の他の言葉では、これにより、発信者に正しい情報を返すことができません。

    単一SpringBoot私たちの現在のプロジェクトのために、我々はそのようなAjax呼び出しインタフェースとして、いくつかの方法を使用して、サーバーエラーならば、我々は、フロントエンド処理エラーになります。そこリトライコール・インタフェース、またはのようなユーザーフレンドリープロンプトに彼女について「サービス忙しい、後でもう一度試してください」があります。

    ない優しい取引におけるこれらの「エラー」の場合は、分散システムでは、また、いくつかの「エラー」が発生します、とするとき、複数のサービス間の呼び出し、それがワンである、プロジェクト全体の麻痺に私たちをリードします我々は発生しませんしなければなりません。だからHystrix使うサービスはダウングレードこの問題に良い解決策に。実際には、これは私たちに似ているのtry-catch私はキャッチでコードを実行し、エラーが発生し、そのようなAメカニズム。

    サービス低下することにより、特定の時間または特定のサービスの問題を保証することができ、全体のプロジェクトは、障害をカスケード避けるために、それによって、分散システムの柔軟性を高めるために、問題につながることはありません。

  • サービスヒューズ

    サービス低下のコードの建設の下を見て、全体のサービスは以下のこの理論の外観のすべてを読んで、コードの一部を格下げ、あなたが啓発されます。

    Hystrixは生命に、「サーキットブレーカー」を意味し、我々は、ヒューズ、その理由を切り替えます。

    私たちは、全体のサービスを提供する場合、サービスをダウングレードするように設定され、サービスプロバイダエラーが発生した場合、それはプログラムの動作を保証するためにダウングレードした後にメソッドを呼び出します。しかし、その後?問題があり、それを知らない、呼び出し側は、ビジネスは、サービスがエラーであったであろう、発生したとき、その後、呼び出し方法に降格、と呼ばれていたであろうこのサービスを呼び出すことが間違っています。図面のように:

    次のように彼らの対話は次のとおりです。

    クライアント:私はあなたの方法Aを呼び出したいです

    サーバー:いいえ、私は与えられていました。あなたはそれをダウングレードするメソッドを呼び出して、あなたは私を行います!

    クライアント:ああ、サーバーエラーが、その後、私はそれはそれメソッドを格下げ呼び出します。

    子供の後。

    クライアント:私はあなたの方法Aを呼び出したいです

    サーバー:だけは言っていませんか?私は与えられていました。あなたはそれをダウングレードするメソッドを呼び出して、あなたは私を行います!

    クライアント:ああ、サーバーエラーが、その後、私はそれはそれメソッドを格下げ呼び出します。

    しばらく別の子の後。

    クライアント:私はあなたの方法Aを呼び出したいです

    サーバー:永遠にそれはないですか?私はあなたがああダウングレードするには、このメソッドを呼び出すために行く、私が与えられていると述べました。私のコードを聞かせて、もう一度実行することがありますか?

対話は、問題を示し、上記サーバは、クライアントがダウンスケーリングメソッドを呼び出しますとき、エラーが発生しました。新しいアクセスがある場合、サーバーは、いくつかの故意のエラーコードを実行されますので、しかし、クライアントは常に、サーバーを呼び出します。これを回避することができない、ああ、私はあなたが私を訪問し、私が間違っていた知っている、ダウングレード方法への直接アクセス、私はエラーコードを実行できません。

私たちの家庭は、融合のようなこのサービスは、吹き付けられます。家庭電気負荷の検出は、電気製品の一部が切断され、大きすぎる場合には、他の利用可能性を確保します。あなたはシステムを呼び出すときに、一定時間内に、このサービスで発生するエラーの数が一定値に達すると、ある分散システムでは、我々はない過去のコールに、回路ブレーカを開いて、しかし彼はコールダウンスケーリング方法に直接移動できるようになります。最初の呼び出しとしてこのサービスを見つけたが、それは「ハーフオープン」状態に回路ブレーカになり、時間のさらなる期間の後、エラーが発生していないがあった場合、それはサーキットブレーカーとなり、徐々に過去に電話をかけますそのすべてを介してすべてのサービスという、閉じました。

  • サービスを制限

    サービスには、名前が示すように、このシーンの上に、我々はこのような高い同時実行など、サービスを制限する方法により、問題を解決するためにスパイクも同様に、トラフィックのアクセスを制限することで、理解する方がはるかに簡単にそれを制限します。制限アルゴリズムの主流は、以下のとおりです。リーキーバケットトークンアルゴリズム

バーコードのスタートコード

そんなに使用は何のコードを掲載しませんか?これはあなたをいじめていませんか?

  • 私たちが必要とするいくつかの項目を作成します。

    モジュール名 コードネームプロジェクト リマーク
    ユーレカレジストリ ユーレカ・アロン-7000 テスト中ではなく、クラスタ・レジストリを使用して
    クライアント(消費者、サービス呼び出し側) hystrix消費者-80 装うまたはOpenFeignサービスコールを使用して
    サーバー(プロバイダー、サービス・プロバイダ) hystrixプロバイダ-8001

    3つのプロジェクトが少しのコードを作成する(プロジェクトコードアドレス

  • クライアントとサーバーがHystrix依存性を結合している(もちろん、ここで終わりではサービス低下どのような最終用途)
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
  • サービスのダウングレード

    2つのサービスの低下ソリューションがあります。サービスは、サービスコールおよびサービスプロバイダからダウングレードすることができ、それぞれ、「明らかに」誤りであります
1.当事者は、サービスプロバイダからサービスをダウングレードするには

シミュレートするには、次の方法のプロバイダ側をみましょう「レスポンスタイムアウトエラーを。」

  /**
     * 这个方法会造成服务调用超时的错误
     * 其实本身体不是错误,而是服务响应时间超过了我们要求的时间,就认为它错了
     * @param id
     * @return
     */
    public String timeOutError(Integer id){
        return "服务调用超时";
    }

私たちは、それは次のコメントを追加し、コールバックメソッドのエラーを定義しました:

/**
* 这个方法会造成服务调用超时的错误
* 其实本身体不是错误,而是服务响应时间超过了我们要求的时间,就认为它错了
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "TimeOutErrorHandler",commandProperties = {
    @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String timeOutError(Integer id){
    try {
        //我们让这个方法休眠5秒,所以一定会发生错误,也就会调用下边的fallbakcMethod方法
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "服务正常调用"+id;
}

/**
*   这个就是当上边方法的“兜底”方法
*/
public String TimeOutErrorHandler(Integer id) {
    return "对不起,系统处理超时"+id;
}

三点に注意を払うにトップノート:

  1. このパラメータのfallCallbackMethodは「キャッチオール」アプローチであります
  2. この方法でfallCallbackMethod文のこの方法は、矛盾しないようにし、
  3. プロパティ対応する属性の名前と値は、本実施の形態に配置されている缶commandProperties複数@HystrixPropertyライト注釈は、応答タイムアウトを設定します

最後に、メインの起動クラスでこのコメントを追加

@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableCircuitBreaker
public class ProviderAppication_8001 {
    public static void main(String[] args) {
        SpringApplication.run(ProviderAppication_8001.class, args);
    }
}

これは、サービスプロバイダーの観点で取り扱い、当社のエラーなので、サービス呼び出し側が何もしない、3つのプロジェクト(消費者、provder、ユーレカ)を起動します。次に訪問しhttp://localhost/consumer/hello/999、理論的には、返すことで通常の通話999へのサービスを、我々は人工的なタイムアウトエラーを作成するので、我々は確かにフォールバックに戻りますので、その後、しかし、申し訳ありませんが、タイムアウト処理システム999、およびこれは3秒後に戻ります。

あなたはタイムアウトエラーの上に感じる場合はトラブルの多くを実証し、実行時エラーがプロセスに直接書き込むことができ、例えば:int i = 10/0;のfallbackMethodを呼び出します。このタイムアウト設定を使用する理由は、あなたがHystrixエラーがフォールバックできるか知っているように、それはより多くの設定の参照ですhttps://github.com/Netflix/Hystrix/wiki/Configuration

2.サービスは、サービス提供者側からのダウングレード

そして、サービス低下でサービス・プロバイダは、サービス呼び出し側(クライアント、顧客)サービス低下がより一般的に使用される方法を実行するに比べて。これら2と比較すると、前者は、「前処理」を発生することがあり、自分のエラーのためにサービスプロバイダーを有効にするので、私たちは私への発信者のアクセスは、この「キャッチオール」のアプローチを呼び出しますことを保証しなければならないです。しかし、私は私のサービスがダウンしている場合を考えますか?クライアントは私を呼び出していない、そしてそれは私の「キャッチオール」アプローチを受け取ることがありますか?そのため、クライアントサービスの低下は、より一般的に用いられている方法です。

私は、クライアントとサーバにあった場合には、小さな問題は、サービス低下を行った、呼び出しされるのですか?私が最初に何を呼ぶのでしょうか?彼らは自分自身、あなたの巧妙な小さな頭の少しタッチをしたいです。

  • ないプロジェクトの紛争やコードにするために、私は以下の私たちの新しいクラスseriveなので、別のインターフェイスの実装を使用し、(春がそれを管理できるようにする、である)コメントアウトし、この@Serviceトップます
@Service
public class OrignService implements IExampleService {
    /**
     * 不用这个做演示,就空实现
     */
    @Override
    public String timeOutError(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "服务正常调用"+id;
    }
    /**
     * 不发生错误的正确方法
     */
    @Override
    public String correct(Integer id) {
        return "访问正常,服务端没有进行任何错误"+id;
    }
}
  • マスターブートカテゴリに以下のコメントを追加します。
@EnableHystrix //注意这个和服务端的注解是不一样的
  • application.ymlにHystrixために装うサポートを開きます
feign:
    hystrix:
        enabled:true
  • プロジェクトの前にプロバイダがインターフェイスを装う置く@HystrixCommond

3.改善ソリューション
  • 以上の2つのオプションが可能なように見えるが、実際のですか?私は、これは資格のプログラマがそれを行う必要がありますされる、と思いましたか?各インターフェイス我々は、フォールバック方式を書かなければなりませんでしたか?そして、私たちのビジネスのコードが一緒に書くには?「低カップリング、高凝集」のような意味ですか?
  • 最初のソリューションは、名前が示すように、コントローラクラス全体で@DefaultPropertiesを使用することで、それをデフォルトの「キャッチオール」のアプローチを与えることである、方法がfallbackMethodに格下げのあらゆるニーズに設定されていないだろう、私たちはちょうど良い@HystrixCommandを追加する必要がありますA。この方法では、記事の最後にあるコードは、コメントを書いていないコードが示すように、あまりにも簡単です
  • 第二の溶液:私たちのクライアントはそれを呼び出す装うことではないでしょうか?ローカルインタフェースクラス装うがあり、私たちは、このクラスがうまく設定されている指示します。直接コードに。
@Component
//@FeignClient(value = "hystrix-provider") //这是之前的调用
@FeignClient(value = "hystrix-provider",fallback = ProviderServiceImpl.class) //这回使用了Hystrix的服务降级
public interface IProviderService {
    @GetMapping("provider/hello/{id}")
    public String hello(@PathVariable("id") Integer id);
}
@Component
public class ProviderServiceImpl implements IProviderService {
    @Override
    public String hello(Integer id) {
        return "调用远程服务错误了";
    }
}
  • 二つの方法上記の比較:
    • 私たちのファーストクラスとビジネスクラスを結合させたが、あなたは、各メソッドのためにフォールバックしたい場合は、我々はメソッドを記述する必要があり、コードがあまりにも肥大化しています。しかし、それはデフォルトの方法を提供することができる、デフォルトプロパティのメモを提供し、後者ではありません。このメソッドは、呼び出しリボンの組み合わせRestTemplateを使用して直接法に適しています
    • 第二は、すべてのフォールバック方式が一緒に書いたに対処するためのインタフェースクラス装うサービス低下の問題の実装を提供し、私たちのビジネスのコードが完全に切り離さ。最初の比較では、我々はDefalutPropetiesを達成するための統一されたアプローチを定義することができます。この方法は、クライアントを呼び出すような適当なふりでこれをお勧めし比較します。

サービスヒューズ

私はあなたが理解できると確信している何の理論的な知識は、サービスの上に吹き、見に戻って来てください。サービス低下を有効にすると、メカニズムを融合デフォルトのサービスで有効になって、我々は唯一のようないくつかのプロパティの@HystrixCommandのトップであること、その上にいくつかのパラメータを設定する必要があります。

@HystrixCommand(fallbackMethod = "TimeOutErrorHandler",commandProperties = {
    @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
    @HystrixProperty(name="circuitBreaker.enabled",value="true"),//开户断路器
    @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="20"),//请求次数的峰值
    @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),//检测错误次数的时间范围
    @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60")//请求失败率达到多少比例后会打开断路器
})

これらの構成は、することができhttps://github.com/Netflix/Hystrix/wiki/Configuration理解するだけでなく、すべてのデフォルト設定で、閲覧HystrixCommandPropertiesクラス属性(アイデアそこを使用して検索を)開くには

サービスを制限

あまりにも多くのものが、私がフォローアップの注意を楽しみにしています。

プロジェクトコードと複数のアドレスを学びます

「小魚やJava」からマイクロチャネル世間の注目いいえ、「SpringCloud」を返信GET

おすすめ

転載: www.cnblogs.com/Lyn4ever/p/12528913.html