「Hystrixサーキットブレーカー」

Hystrixサーキットブレーカー

Hystrixはスプリングクラウドのサーキットブレーカーツールです。いわゆるサーキットブレーカーは、ビジネスが失敗またはダウンした場合一旦断路器发现就断掉业务的接口路に、プリセットビジネスにジャンプするか、エラープロンプトを報告することです。

ここに画像の説明を挿入

hystrix(断路器) 直接调用在 ribbo(负载均衡) 里面


Hystrixサーキットブレーカの機能

1-ダウングレード

バックグラウンドサービスの要求でエラーが発生した場合は、別のコードを実行してクライアントに応答を返すことができます
エラーメッセージまたはキャッシュされたデータベースである可能性があるダウングレード応答

ダウングレードコードが実装されている場合:

  • @HystrixCommand(fallbackMethod = "ダウングレードメソッド")
  • ダウングレードメソッドを実装するには、ダウングレードコードを追加します

2-ヒューズ

サーバー障害は雪崩効果を引き起こす可能性がありますが、熔断可以快速断开故障服务,保护其他服务不受影响

融着の条件

  • 10秒間に20件のリクエスト(満たす必要があります)
  • 50%が失敗し、劣化したコードが実行されました

半開き

  • サーキットブレーカが開いてから5秒後に、ハーフオープン状態になります。
  • リクエストを試してください、
    • 要求は成功し、回路ブレーカーを閉じて、自動的に通常に戻ります
    • 要求は失敗し、回路ブレーカーは開いたままになります

膨張(雪崩の原因)

の原因

ここに画像の説明を挿入

対応する測定

ここに画像の説明を挿入


hystrixサーキットブレーカーを実装する

依存関係(pom.xml)

xmlの方法

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

視覚化

ここに画像の説明を挿入


application.ymlを変更します

spring:
  application:
    name: hystrix
    
server:
  port: 3001
  
eureka:
  client:    
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
      
ribbon:
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 2
  OkToRetryOnAllOperations: true

ここに画像の説明を挿入

只有改掉名字就行了


メインプログラム

@EnableCircuitBreaker hystrixサーキットブレーカーを有効にする

サーキットブレーカを起動すると、サーキットブレーカは2つのコア機能を提供します。

  • 1-ダウングレード----タイムアウト、エラー、または到達不能の場合、サービスはダウングレードされ、エラーメッセージまたはキャッシュされたデータが返されます

  • 2-ヒューズ----使用圧力が高すぎてエラー率が大きすぎる場合、すべての要求がヒューズになり、すべての要求が直接ダウングレードされます

ここに画像の説明を挿入

可以使用 @SpringCloudApplication 注解代替三个注解

//@EnableCircuitBreaker
//@EnableDiscoveryClient
//@SpringBootApplication

@SpringCloudApplication
public class Sp06RibbonApplication {
    
    

	public static void main(String[] args) {
    
    
		SpringApplication.run(Sp06RibbonApplication.class, args);
	}
	
	@LoadBalanced
	@Bean
	public RestTemplate getRestTemplate() {
    
    
		SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
		f.setConnectTimeout(1000);
		f.setReadTimeout(1000);
		return new RestTemplate(f);
	}
}

重点是添加注解就行了别的代码不重要


コントローラにダウングレードメソッドを追加する

  • getItems()などの各メソッドにダウングレードメソッドを追加します。ダウングレードメソッドgetItemsFB()を追加します。
  • @HystrixCommandアノテーションを追加し、ダウングレードメソッドの名前を指定します

コード構造

@RestController
public class RibbonController {
    
    
 @Autowired
    private RestTemplate restTemplate;

    @GetMapping ("/item-service/{orderId}")
    @HystrixCommand(fallbackMethod = "getItemsFB") //远程调用失败 跳转到当前的方法
    public JsonResult<List<Item>> getItems(@PathVariable String orderId){
    
    
        return restTemplate.getForObject("http://item-service/{1}", JsonResult.class,orderId);
    }

    @HystrixCommand(fallbackMethod = "decreaseNumberFB") //远程调用失败 跳转到当前的方法
    @PostMapping("/item-service/decreaseNumber")
    public JsonResult<?> decreaseNumber(@RequestBody List<Item> items){
    
    
        return restTemplate.postForObject("http://item-service/decreaseNumber", items, JsonResult.class);
    }

	//降级方法的参数和返回值,需要和原始方法一致,方法名任意
	public JsonResult<List<Item>> getItemsFB(String orderId) {
    
    
		return JsonResult.err("获取订单商品列表失败");
	}
	public JsonResult decreaseNumberFB(List<Item> items) {
    
    
		return JsonResult.err("更新商品库存失败");
	}
}

これはサーキットブレーカのコアを説明するデモコードです。他のコードは重要ではありません。

ここに画像の説明を挿入

説明: 当前业务的降级是getItemesFB方法

getItemsのメソッドはgetItemsFBです

ここに画像の説明を挿入

説明:超时、出错、不可到达时,エラーメッセージを返す対応するダウングレードメソッドを開始する場合

hystrixタイムアウト設定

タイムアウトymlで
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
タイムアウトを待機するようにhystrixを設定した後、ダウングレードコードが実行され、ダウングレードの結果がすぐにクライアントに返されます。デフォルトのタイムアウト時間は1000ミリ秒です。

hystrixの劣化をテストするために、hystrix待機タイムアウトを非常に小さく(500ミリ秒)
設定します重要:この設定は通常、リボンの再試行タイムアウト期間よりも長くする必要があります(例:10秒)。

spring:
  application:
    name: hystrix
    
server:
  port: 3001
  
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
      
ribbon:
  MaxAutoRetriesNextServer: 2
  MaxAutoRetries: 1
  OkToRetryOnAllOperations: true
  
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 500

ここに画像の説明を挿入

テストのためにプロジェクトを開始します

ここに画像の説明を挿入
ここに画像の説明を挿入


hystrixヒューズ

リンク全体が特定のしきい値に達します。デフォルトでは、10秒以内に20を超えるリクエストが生成されると、最初の条件が満たされます。
最初の条件が満たされたときに、要求されたエラーの割合がしきい値よりも大きい場合、回路ブレーカーが開き、デフォルトは50%です。
Hystrixのロジックは、最初に最初の条件が満たされているかどうかを判断し、次に2番目の条件が満たされているかどうかを判断します。両方の条件が満たされると、回路ブレーカーがオンになります。
  • サーキットブレーカーを5秒間開いた後、ハーフオープン状態になり、リクエストの転送を試みます。それでも失敗する場合は、開いたままにします。成功した場合は、サーキットブレーカーを閉じます。

おすすめ

転載: blog.csdn.net/weixin_45103228/article/details/114105702