概要概要
分散型フレームワークでは、サービス間のリモートコールが必要になることがよくあります。このように、ネットワーク上の理由やサービス自体によっては、コールの失敗や遅延が発生する場合があります。これらの条件が発生すると、外部インターフェイスサービスの遅延が直接発生します。パーティが多数の遅延インターフェイスまたはサービスを呼び出すと、解放できないタスクとスレッドリソースのバックログが発生し、最終的にはコールチェーン全体に広がり、最終的にシステム全体がダウンします。
springcloudでは、上記の問題に対してSpring Cloud Hystrixの耐障害性保護が提供されます。また、NetflixのオープンソースフレームワークHystrixに基づいて実装され、サービスの低下、サービスヒューズ、スレッドの分離、要求のキャッシュ、要求のマージ、サービスの監視などの強力な機能を備えています。 。
- リソースの分離:スレッドプールの分離とセマフォの分離を含み、分散サービスを呼び出すためのリソースの使用を制限します。呼び出されたサービスの問題は、他のサービス呼び出しには影響しません。
- ダウングレードメカニズム:時間の経過と不十分なリソース(スレッドまたはセマフォ)のダウングレード。ダウングレード後、ダウングレードインターフェイスと連携して、最下位のデータを返すことができます。
- ヒューズ:障害率がしきい値に達すると、劣化が自動的にトリガーされ(たとえば、ネットワーク障害/タイムアウトのために障害率が高くなります)、ヒューズによってトリガーされた高速障害はすぐに回復します。
- キャッシュ:リクエストキャッシュとリクエストマージの実装を提供します。
機構
隔離
- スレッドプール分離モード:スレッドプールを使用して現在の要求を保存し、スレッドプールが要求を処理し、タスクリターン処理のタイムアウト時間を設定し、蓄積された要求が最初にスレッドプールキューに入ります。この方法では、依存するサービスごとに一定のリソース消費があるスレッドプールが必要です。利点は、突然のトラフィックに対応できることです(トラフィックのピークが来ると、データをスレッドプールチームに保存して処理を遅くすることができます)。
- セマフォ分離モード:アトミックカウンタ(またはセマフォ)を使用して、現在実行中のスレッドの数を記録します。要求は、最初にカウンタの値を決定することです。スレッドの最大数を超えると、このタイプの新しい要求は破棄されます。カウンタ+1に対してカウント動作要求を実行し、カウンタ-1を返すように要求します。この方法は、スレッドを厳密に制御してすぐに戻り、突然のトラフィックに対応できません(トラフィックのピークが来ると、処理されるスレッドの数が数を超え、他の要求が直接返され、依存サービスは要求され続けません)
ヒューズ
通常の状況では、回路ブレーカーは閉じた状態(Closed)です。呼び出しが失敗またはタイムアウトし続けると、回路が開いて融合状態(Open)になります。一定期間内の後続の呼び出しはすべて拒否されます(Fail Fast)。一定期間が経過すると、保護デバイスはハーフオープン状態(ハーフオープン)に入ろうとし、少数のリクエストを受信して試行します。それでもコールが失敗した場合はヒューズ状態に戻り、コールが成功した場合は回路クローズ状態に戻ります。
ブレーカ
- 特定のしきい値に達したとき(デフォルトは10秒以内に20を超えるリクエストです)
- 失敗率が特定のレベルに達すると(デフォルトでは、要求の50%以上が10秒以内に失敗します)
- 上記のしきい値に達すると、回路ブレーカーが開きます
- 有効にすると、すべてのリクエストが転送されるわけではありません
- しばらくすると(デフォルトは5秒)、この時点で回路ブレーカーが半分開いており、要求の1つが転送されます。成功した場合は回路ブレーカーが閉じ、失敗した場合は開き続けます。
ダウングレード
特定のサービスまたはインターフェースで多数のインターフェース呼び出し例外が発生すると、サービスまたはインターフェース全体が融合され、呼び出されなくなります。これは劣化になります。
例
簡単なspringcloud(グリニッジ)プロジェクト、レジストリ、コンシューマー、およびサービスプロバイダーを事前に準備してください。コンシューマーサービスは、Feignリモートコールに基づいています。
Spring Cloud Hystrixはサービスの低下、サービスヒューズ、その他の機能を実現するための消費者側であるため、消費者サービスには次の依存関係が導入されています
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
Feignコールインターフェイスの変換
package com.leolee.msf.feignInterface;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient("database-web")
public interface TestClinet {
@RequestMapping(value = "/test/hello", method = RequestMethod.GET)
public String feignHello();
@RequestMapping(value = "/test/value", method = RequestMethod.GET)
public String feignValue();
}
重要なポイントは次のとおりです。
package com.leolee.msf.service;
import com.leolee.msf.feignInterface.TestClinet;
import com.leolee.msf.service.serviceInterface.TestService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @ClassName TestServiceImpl
* @Description: TODO
* @Author LeoLee
* @Date 2020/8/18
* @Version V1.0
**/
@Service("loginService")
public class TestServiceImpl implements TestService {
@Autowired
private TestClinet testClinet;
@HystrixCommand(fallbackMethod = "fallback")
@Override
public String getFeignValue() {
return testClinet.feignValue();
}
public String fallback() {
return "Hystrix";
}
}
Feignインターフェイスを挿入した後、呼び出し元のメソッドに@HystrixCommand(fallbackMethod = "fallback")を追加します
fallbackMethodはfallback()メソッドを指します。タイムアウトが発生すると、リモート呼び出しをアクティブに破棄し、代わりにローカルのfallback()メソッドを呼び出します。
関連する構成
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 默认为;轮询,这里改为随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
ConnectTimeout: 5000 # 连接超时时间(ms)
ReadTimeout: 5000 # 通信超时时间(ms)
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 7000 # 设置hystrix的超时时间为6000ms
feign.hystrix.enabled = trueは、偽の障害耐性を有効にします
Hystrixのデフォルトの通話タイムアウト時間は6000msで、実際の状況に応じて調整できます