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つのコア機能を提供します。
可以使用 @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秒間開いた後、ハーフオープン状態になり、リクエストの転送を試みます。それでも失敗する場合は、開いたままにします。成功した場合は、サーキットブレーカーを閉じます。