フォールトトレラント分散システムスプリングCloud--遅延回路遮断器アセンブリHystrix

パートI:春の雲-リボンのロードバランシングとリモートコール装うの原則と例

はじめに1. hystrix

Hystrixは、多くがそのような残業、異常、Hystrixは、依存関係の問題の場合に保証できるよう、呼び出しが失敗した必然的に依存している、遅れやフォールトトレラントオープンソースライブラリ、分散システムを処理するための分散型システムであり、これは、分散システムの柔軟性を向上させるためには、障害をカスケードを避けるために、失敗する総合的なサービスにはなりません。
「ブレーカ」は、交換サービスユニットが故障した装置自体、障害が(ヒューズと同様の)回路ブレーカーを監視、戻る発信者に期待に沿っている、応答は、代替的に(フォールバック)処理することができます代わりに、このように、それは、分散システムにおける障害の広がりを避けるため、とさえするように、長い間、不必要に占有されませんサービススレッドへの発信者を確保し、処理できない例外発信者を長い時間を待っているか、投げの雪崩。

2.雪崩効果

分散システム環境、サービスとの間で同様の依存性は、通常のビジネスコールより基本的なサービスに依存している、非常に一般的です。示されているように、同期呼び出しのため、在庫のサービスが利用できない場合、商品、サービス要求のスレッドがブロックされている在庫サービス呼び出し要求の大量がある場合、それは最終的に全体の商品サービス資源につながる可能性があり、サービスを提供し続けることができなく排出されます。そして、このような使用は、この現象は、要求されたアバランシェ効果と呼ばれ、コールチェーンに沿って渡すことはできません。出典ます。https://my.oschina.net/7001/blog/1619842

3. hystrix実装原理

マイクロサービスの問題のために、Hystrixソリューションは、サービス制限、タイムアウト監視、サービス・ヒューズ、サービスの低下が挙げられます。

  • アイソレーション(スレッドプールセマフォ隔離検疫):リソース分散型サービスコールの使用を制限、サービスの問題への呼び出しは、他のサービスコールには影響を与えません。
    1)スレッドプール分離モード:現在の要求を格納するスレッドプールを使用して、スレッドプールを処理するための要求、処理タスク戻るタイムアウト設定は、リクエストキュースレッドプールにバルクパック。このアプローチは、各従属サービス要求スレッドプールのために必要となる、特定のリソースの消費量があり、利点は、(トラフィックのピークが来る、スレッドプールのチームゆっくりプロセスに格納されたデータの処理を完了することはできません)バースト性トラフィックに対応できる
    2 )セマフォ分離モード:実行スレッドの現在の数を記録するカウンタ原子(またはセマフォ)を使用して、カウンタの第1の要求判定値は、スレッドの最大数があれば、新しいタイプの変更要求が破棄される設け超えます要求なしカウンタを行うよりもカウント動作+1、-1カウンタ要求が返されます。このアプローチは、厳密に(トラフィックのピークが来て、スレッドが要求されたサービスに依存し続けていない、直接返される他の要求の数を超えた)バースト性トラフィックに対処することができませんでしスレッドと戻り、すぐにモードを、制御されています。
  • 溶融オフ:不良率が閾値を自動的に(ネットワーク障害/タイムアウト生じた結果、故障率)ダウングレードをトリガ達し、ヒューズ障害が急速に急速な回復をトリガします。通話時間の誤差は、またはタイムアウトした場合、通常の条件下では、回路は、閉じた状態(クローズ)にある、回路は、その後の期間にすべてのコールが(高速失敗を)拒否され、吹き状態(オープン)に開かれた、いくつかの時間後に、プロテクター少量の要求は呼び出しが成功した場合、コールは、閉回路状態への復帰をヒューズ状態への復帰に失敗した場合は、試してみるに来ることができ、半吹き状態(ハーフオープン)を入力しようとします。
  • キャッシュ:キャッシュは、要求を提供し、達成するために合併を要求します。
  • リアルタイム監視、警報及び制御(設定の変更)をサポート

4.春クラウドHystrixエントリー

Hystrixは、コールバックメカニズムが失敗したウィンドウ期間中にコールを使用しmetrics.rollingStats.timeInMilliseconds (default: 10 seconds)たサービスの呼び出しを超え、circuitBreaker.requestVolumeThreshold (default: 20 requests)かつてよりも割合が失敗circuitBreaker.errorThresholdPercentage (default: >50%)全体のサービスを避けるために、開発者が提供するオープンショート行いフォールバック方式をここで立ち往生。
ここに画像を挿入説明

4.1紹介Hystrix

POMファイルの輸入依存度

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

注釈@EnableHystrixクラスまたは@EnableCircuitBreakerを添加開始(中でも全く同じで説明継承二注釈コンテンツです)

@SpringBootApplication
@EnableHystrix 
public class Application {

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

}

[追加のコメント上記コントローラは@HystrixCommand(fallbackMethodは、私たちが今言っ名前方法があります)

@RestController
public class TestController{

    @HystrixCommand(fallbackMethod =“ defaultUser”)
    @GetMapping("/user")
    public Object getUser(Map <String,Object> params){
        //调用其他微服务,可能会失败
    }
	/ **
	*	失败的时候返回一些默认信息或者其他有用的东西一些有用的
	* /
    public Object defaultUser(Map <String,Object>params){
        默认值;
    }
}

@HystrixCommand注釈はcommandPropertiesプロパティはコメントの@HystrixPropertyリストと一緒に使用され、構成に追加することができます。より詳細な情報については、参照公式Wikiのを

4.2セキュリティコンテキストを伝播やSpringスコープを使用します

あなたは、ローカルコンテキスト@HystrixCommandにいくつかのスレッドを広めたい場合。それは、コマンドを実行しているため、デフォルトの文は動作しません(もしタイムアウト)スレッドプールインチ あなたは、異なる設定が呼び出し側と同じスレッドを使用してにコメント「隔離政策」しますHystrixスイッチを作るか、コメントで直接使用することができます。コメントでスレッドをセットアップする方法を次の例が示します:

HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)

あなたは、ランタイム例外が発生した場合@SessionScopeまたは@RequestScopeた場合は、それが範囲内でコンテキストを見つけることができないことを示唆している、あなたは同じスレッドを使用する必要があります。また、trueにhystrix.shareSecurityContextプロパティセットに選択することができます。そうすることで、自動的にそのSecurityContextがにリンクされているプラ​​グインHystrix同時方式を設定しますHystrixコマンドを通すためにメインスレッドから転送されました。Hystrix Hystrix複数の同時ポリシーを登録することはできません、あなたが使用することに春の豆とHystrixConcurrencyStrategyによって自分自身を宣言することができます。

4.3健康指標

次の例に示す遮断器の接続状態:

{
    "hystrix": {
        "openCircuitBreakers": [
            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"
}
4.4 Hystrixフローモニタリング

Hystrixストリームの使用を監視するためにバネブートスタータアクチュエータおよび構成に依存するパラメータを導入することができますmanagement.endpoints.web.exposure.include: hystrix.streamするアクセス/actuator/hystrix.streamasクラスタ・モニタ・ステータスを表示します。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
4.5ブレイカー:Hystrixダッシュボード

Hystrixの主な利点の1つは、それが収集する各HystrixCommandに関するメトリックのセットです。Hystrixダッシュボードは、効率的な方法で各回路遮断器の状態を表示します。具体的に公式サイトを参照してください。https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.1.RELEASE/reference/html/#netflix-hystrix-dashboard-starter

POMファイルの輸入依存度

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

注釈クラスの追加を開始@EnableHystrixDashboard

@SpringBootApplication
@EnableHystrix
@EnableHystrixDashboard
public class Application {

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

}

アクセスhystrixあなたは、モニタインターフェース見ることができます/hystrix
ここに画像を挿入説明
:ダッシュボードの説明
黒丸:二つの意味があります。これは、緑から赤へ、インスタンスの状態によって色の変化、その健康度(健康度に悪い)を表し、その大きさの変化は、トラフィック・インスタンスの要求時に起こることができ、大きな流れ、大きな黒丸。だから、黒丸を示すことによって、あなたはすぐに高圧の失敗したインスタンスとインスタンスの例をたくさん見つけることができます。
曲線:フロースルーにおいて観察された増加流量記録の相対的な変化のために2分し、それを減少させました。
ここに画像を挿入説明

4.6装う統合Hystrix

装うデフォルトサポートHystrixが、春には - しないように、ビジネス・ニーズが今あなたが最初に彼をオンにする必要があります使用したい、使用する必要があるため、クラウドDalstonバージョンの後に、デフォルトでオフになって、次のように構成されたYMLファイル:

feign:
  hystrix:
    enabled: true

そして、FeignClient注釈でフォールバック構成プロパティを追加します。

@FeignClient(value = "SERVER-ORDER",fallback = OrderServiceFallBack.class)
public interface OrderServiceClient {

    @RequestMapping("/order")
    public Order getOrder(@RequestParam("ud") String id);

}
@Component
public class OrderServiceFallBack implements OrderServiceClient {
    @Override
    public Object getOrder(String id) {
        return Result.error("测试降级");
    }
}

あなたが特定のエラーメッセージを取得する必要がある場合は、次のように書くことができます。

@Component
public class OrderServiceClientFallBackFactory implements FallbackFactory<OrderServiceClient> {
    @Override
    public OrderServiceClient create(Throwable throwable) {
        return new OrderServiceClient() {
            @Override
		    public Object getOrder(String id) {
		    	String message = throwable.getMessage();
		    	//记录错误信息或者其他业务逻辑
		        return Result.error("测试降级");
		    }
        };
    }
}

クライアントはfallbackFactoryだけで罰金を指定します

@FeignClient(value = "SERVER-ORDER",fallbackFactory = OrderServiceClientFallBackFactory .class)
public interface OrderServiceClient {

    @RequestMapping("/order")
    public Order getOrder(@RequestParam("ud") String id);

}

この時点で、我々はhystrixと装うの統合を完了しました。ソースの表示:springcloud-デモマイクロサービスコード(サービス・プロバイダーコース)のレッスン。

5.重要な設定手順

Execution相关的属性的配置
hystrix.command.default.execution.isolation.strategy 隔离策略,默认是Thread, 可选Thread| Semaphor

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 命令执行超时时 间,默认1000ms

hystrix.command.default.execution.timeout.enabled 执行是否启用超时,默认启用true

hystrix.command.default.execution.isolation.thread.interruptOnTimeout 发生超时是是否中断, 默认true

hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests 最大并发请求 数,默认10,该参数当使用ExecutionIsolationStrategy.SEMAPHORE策略时才有效。如果达到最大并发请求 数,请求会被拒绝。理论上选择semaphore size的原则和选择thread size一致,但选用semaphore时每次执行 的单元要比较小且执行速度快(ms级别),否则的话应该用thread。 semaphore应该占整个容器(tomcat)的线程池的一小部分。 Fallback相关的属性 这些参数可以应用于Hystrix的THREAD和SEMAPHORE策略

hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 如果并发数达到 该设置值,请求会被拒绝和抛出异常并且fallback不会被调用。默认10

hystrix.command.default.fallback.enabled 当执行失败或者请求被拒绝,是否会尝试调用

hystrixCommand.getFallback() 。默认true

Circuit Breaker相关的属性 
hystrix.command.default.circuitBreaker.enabled 用来跟踪circuit的健康性,如果未达标则让request短路。默认true

hystrix.command.default.circuitBreaker.requestVolumeThreshold 一个rolling window内最小的请 求数。如果设为20,那么当一个rolling window的时间内(比如说1个rolling window是10秒)收到19个请求, 即使19个请求都失败,也不会触发circuit break。默认20

hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds 触发短路的时间值,当该值设 为5000时,则当触发circuit break后的5000毫秒内都会拒绝request,也就是5000毫秒后才会关闭circuit。 默认5000

hystrix.command.default.circuitBreaker.errorThresholdPercentage错误比率阀值,如果错误率>=该 值,circuit会被打开,并短路所有请求触发fallback。默认50

hystrix.command.default.circuitBreaker.forceOpen 强制打开熔断器,如果打开这个开关,那么拒绝所 有request,默认false

hystrix.command.default.circuitBreaker.forceClosed 强制关闭熔断器 如果这个开关打开,circuit将 一直关闭且忽略circuitBreaker.errorThresholdPercentage

Metrics相关参数

hystrix.command.default.metrics.rollingStats.timeInMilliseconds 设置统计的时间窗口值的,毫秒 值,circuit break 的打开会根据1个rolling window的统计来计算。若rolling window被设为10000毫秒, 则rolling window会被分成n个buckets,每个bucket包含success,failure,timeout,rejection的次数 的统计信息。默认10000

hystrix.command.default.metrics.rollingStats.numBuckets 设置一个rolling window被划分的数 量,若numBuckets=10,rolling window=10000,那么一个bucket的时间即1秒。必须符合rolling window  % numberBuckets == 0。默认10

hystrix.command.default.metrics.rollingPercentile.enabled 执行时是否enable指标的计算和跟踪, 默认true

hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds 设置rolling  percentile window的时间,默认60000

hystrix.command.default.metrics.rollingPercentile.numBuckets 设置rolling percentile  window的numberBuckets。逻辑同上。默认6

hystrix.command.default.metrics.rollingPercentile.bucketSize 如果bucket size=100,window =10s,若这10s里有500次执行,只有最后100次执行会被统计到bucket里去。增加该值会增加内存开销以及排序 的开销。默认100

hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds 记录health 快照(用 来统计成功和错误绿)的间隔,默认500ms


Request Context 相关参数

hystrix.command.default.requestCache.enabled 默认true,需要重载getCacheKey(),返回null时不 缓存

 hystrix.command.default.requestLog.enabled 记录日志到HystrixRequestLog,默认true
 
 Collapser Properties 相关参数
 
 hystrix.collapser.default.maxRequestsInBatch 单次批处理的最大请求数,达到该数量触发批处理,默认 Integer.MAX_VALU
 
 hystrix.collapser.default.timerDelayInMilliseconds 触发批处理的延迟,也可以为创建批处理的时间 +该值,默认10
 
 hystrix.collapser.default.requestCache.enabled 是否对HystrixCollapser.execute() and  HystrixCollapser.queue()的cache,默认true
 
 ThreadPool 相关参数
 
 线程数默认值10适用于大部分情况(有时可以设置得更小),如果需要设置得更大,那有个基本得公式可以 follow: requests per second at peak when healthy × 99th percentile latency in seconds + some  breathing room 每秒最大支撑的请求数 (99%平均响应时间 + 缓存值) 比如:每秒能处理1000个请求,99%的请求响应时间是60ms,那么公式是: 1000 (0.060+0.012)
 
 基本得原则时保持线程池尽可能小,他主要是为了释放压力,防止资源被阻塞。 当一切都是正常的时候,线程池一般仅会有1到2个线程激活来提供服务
 
 hystrix.threadpool.default.coreSize 并发执行的最大线程数,默认10
 
 hystrix.threadpool.default.maxQueueSize BlockingQueue的最大队列数,当设为-1,会使用
 
 SynchronousQueue,值为正时使用LinkedBlcokingQueue。该设置只会在初始化时有效,之后不能修改threadpool的queue size,除非reinitialising thread executor。默认-1。
 
 hystrix.threadpool.default.queueSizeRejectionThreshold 即使maxQueueSize没有达到,达到 queueSizeRejectionThreshold该值后,请求也会被拒绝。因为maxQueueSize不能被动态修改,这个参数将允 许我们动态设置该值。if maxQueueSize == 1,该字段将不起作用 hystrix.threadpool.default.keepAliveTimeMinutes 如果corePoolSize和maxPoolSize设成一样(默认 实现)该设置无效。如果通过plugin(https://github.com/Netflix/Hystrix/wiki/Plugins)使用自定义 实现,该设置才有用,默认1.
 hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds 线程池统计指标的时间,默 认10000
 
 hystrix.threadpool.default.metrics.rollingStats.numBuckets 将rolling window划分为n个 buckets,默认10

より詳細で完全な構成、Hystrix公式サイトを参照してください。https://github.com/Netflix/Hystrix/wiki/Configuration
場合:春クラウド- Configuration Centerのコンフィグを

公開された118元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_43792385/article/details/104593108