SpringCloud Retryメカニズム構成
まず第一に、ここでの再試行はエラーが報告された後は再試行ではありませんが、ロードバランシングクライアントがリモートリクエストインスタンスが利用できないことを発見した後、別のインスタンスに再試行します。
@bean@loadbalendresttemplate resttemplate(){httpcomponentsclienthtprequestfactory httprequestfactory = new httpcomponentsclienthtprequestfactory(); httprequestFactory.setReadTimeout(5000); httprequestFactory.setConnectTimeout(5000);新しいRESTTEMPLATE(httpRequestFactory);}偽りの再試行メカニズム
Feignは、それ自体でパッケージ化されたRetryerを介して構成を再試行し、デフォルトは5回です
パッケージfeign; static java.util.concurrent.timeunit.seconds;/*** {@link client#execute(requign.request.options)}への呼び出しごとにクローン化されます。 *実装は、再試行操作が継続するかどうかを判断するために状態を維持する場合があります。 * /public Interface Retryerはクローン可能{ /*** retryが許可されている場合(おそらく睡眠後)retunable { /***拡張します。それ以外の場合は、例外を伝播します。 */ void continueorpropagate(retryableException e); retryer clone(); public static classデフォルトの実装retryer {private final int maxattempts;プライベートな最終長い期間。プライベートファイナルロングマックス周辺。 int試行;長い眠り。 public default(){this(100、seconds.tomillis(1)、5); } public default(long period、long maxperiod、int maxattempts){this.period = period; this.maxperiod = maxperiod; this.maxattempts = maxattempts; this.attemp = 1; }feign CANCEL RETRY
@beanretryer feignretryer(){return retryer.never_retry;}プリグインリクエストタイムアウト設定
@beanRequest.options requestoptions(configureableenvironment env){int ribbonedtimeout = env.getProperty( "ribbon.readtimeout"、int.class、6000); int ribbonconnectiontimeout = env.getProperty( "ribbon.connecttimeout"、int.class、3000); new request.options(ribbonconnectiontimeout、ribbonreadtimeout);}スプリングクラウドの各コンポーネントを再試行します
最近、多くの子供用の靴が、Spring Cloud XXXコンポーネントを構成する方法を尋ねてきました。この記事はそれを要約しています。
スプリングクラウドの再試行メカニズムは非常に混oticとしています。異なるバージョンには特定の違いがあり、実装はそれほど違いはありません。幸いなことに、Spring Cloud Camdenは基本的に安定しており、ダルストンでいくつかの改善が行われました。詳細はまだ指定されていません。
以下で詳しく説明しましょう。
私が使用するバージョンは、Spring Cloud Dalston SR4です。これは、Edgware以降にも適しています。 Dalstonの以前のバージョンでは、この記事では説明しません。自分で勉強することができます。
リボン+レストテンプレートの再試行
たとえば、リボンを統合するRESTテンプレートの場合、RESTTEMPLATEは@loadBalancedアノテーションを追加します。
@bean@loadbalancedpublic retttemplate retttemplate(){simpleclienthttprequestfactory simpleclienthtprequestfactory = new simpleclienthttprequestfactory(); simpleclienthttprequestfactory.setConnectTimeout(1000); simpleclienthttprequestfactory.setreadtimeout(1000);新しいRESTTEMPLATE(SimpleClientHttpRequestFactory);}これに基づいて、次の構成を使用して再試行を実現できます。
スプリング:クラウド:Loadbalancer:Retry:Enabled:Trueribbon:#Maxautoretriesへの最初の呼び出しを除き、同じインスタンスの最大回収数:1#最初の選択したサーバーMaxautoretriesNextServer:2#すべての操作がoktoritoroNalloperation:誤って再試行されるかどうかを除く、他のインスタンスの最大回収数:誤って
Feign's Retry
feign自体には、再試行する能力もあります。早春のクラウドでは、Feignはfeign.Retryer.Default#Default()を使用し、5回試しました。しかし、Feignはリボンを統合し、リボンには再試行能力もあり、現時点での行動の混乱につながる可能性があります。
Spring Cloudはこの問題を実現したため、FeignのRetryをfeign.Retryer#NEVER_RETRYに変更することを改善しました。 Feignの再試行を使用する必要がある場合は、リボンの再試行構成を使用してください。したがって、Camdenおよびその後のバージョンの場合、Feignの再試行は次のプロパティを使用して構成できます。
リボン:maxautoretries:1 maxautoretriesnextserver:2 oktoretryonalloperations:false
関連する問題は、https://github.com/spring-cloud/spring-cloud-netflix/issues/467にあります
ズールの再試行
構成:
Zuul:#Zuulの再生可能再生可能:Trueribbon:Maxautoretries:1 maxautoretriesnextserver:2 oktoretryonalloperations:false
上記ではzuul.retryable=trueを使用して、Zuulのグローバルな再試行を有効にしました。実際、指定されたルートを有効/オフにすることもできます。
Zuul.routes。<Routename> .Retryable = true
ローカル構成の優先順位が高くなっています。
HTTP応答コードに基づいて再試行します
ClientName:リボン:RetryAblestatusCodes:404,502
注記:
Hystrixのタイムアウトはタイムアウト時間よりも大きくなければなりません。そうしないと、Hystrix Timeoutが一度試み続ける方法はありません。
一般的に言えば、 ribbon.OkToRetryOnAllOperationsを真に設定することはお勧めしません。この構成が有効になると、POSTリクエストを含むすべての操作が再試行され、リクエスト本体がキャッシュされているため、この時点でサーバーのリソースが影響を受ける可能性があります。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。