必要な依存関係
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.10</version>
</dependency>
<dependency>
<groupId>net.jodah</groupId>
<artifactId>failsafe</artifactId>
<version>2.3.1</version>
</dependency>
Fluent-hcはhttpリクエストの作成に使用され、フェイルセーフはセキュリティ障害の再試行を定義するために使用されます。いわゆるセキュリティ障害の再試行は、実際には特定のタスクが失敗したことを意味しますが、問題ではありません。いくつかの接続障害などが発生しました。。。
安全障害を達成するためのフェイルセーフ
インターセプトされた例外、遅延再試行、および試行回数を構成できます
private final RetryPolicy<Object> retryPolicy = new RetryPolicy<>()
//如果获得这个异常,则执行重试
.handle(SocketTimeoutException.class)
//延迟俩秒
.withDelay(Duration.ofSeconds(2))
//最多尝试俩次
.withMaxRetries(2);
知識を広げる
1.フェイルオーバー:
フェイルオーバーとは、バックアップ操作モードである「フェイルオーバー」を意味します。主要コンポーネントが異常な場合、その機能はバックアップコンポーネントに移されます。重要な点は、マスターとバックアップがあり、マスターに障害が発生したときにバックアップをアクティブにして、マスターとして設定できることです。たとえば、
Mysqlのデュアルマスターモードでは、使用中のマスターに障害が発生すると、スタンバイマスターをマスターとして使用できます。2.failfast:高速障害は
、エラーを見つけるために可能な限り文字通り「高速障害」です。システムは、システムができるように、事前設定されたエラープロセスの実行に従って、対応するメソッドは「フォールトトレラント(フォールトトレランス)」です。例として、JAVAコレクション(コレクション)の高速障害を取り上げます。同じコレクションのコンテンツに対して複数のスレッドが動作している場合、フェイルファストイベントが発生する可能性があります。例:スレッドAがイテレーターを介してコレクションをトラバースするときに、コレクションのコンテンツが他のスレッドによって変更された場合、スレッドAがコレクションにアクセスすると、ConcurrentModificationException例外がスローされます(間違った実行が間違ったプロセスに設定されていることがわかりました) 、フェイルファストイベントが生成されます。
3.フェイルバック:障害
後の自動回復。クラスターネットワークシステム(2つ以上のサーバーが相互接続されているネットワーク)では、サーバーを修復する必要があるため、ネットワークリソースとサービスを一時的にバックアップシステムにリダイレクトする必要があります。この後、ネットワークリソースとサーバーを元のホストに復元するプロセスは自動回復と呼ばれます
。4。フェイルセーフ:
フェイルセーフとは「フェイルセーフ」を意味し、障害が発生した場合でも害を及ぼすことはなく、損傷を最小限に抑えます。ウィキペディアの鮮やかな例は、信号機の「衝突監視モジュール」です。エラーまたは衝突信号を検出すると、交差点の信号機をすべて緑色のライトとして表示するのではなく、点滅するエラーモードに変えます。
Getリクエストを作成する
//传入重试机制
String content = Failsafe.with(retryPolicy).get(() ->
//构建一个get请求
//请求connectTimeout()设置连接超时
//socketTimeout() 设置文本读取超时
//execut() 执行远程连接的核心方法,就是发起一个HttpRequest并返回一个HttpResponse
//returnContent() 获取返回请求结果Content,其实也就是流文本
Request.Get(url)
.connectTimeout(1000)
.socketTimeout(500)
.execute().returnContent().asString()
);
connectTimeout()は接続タイムアウトを
設定しますsocketTimeout()はテキスト読み取りタイムアウトを設定します
execute()リモート接続を実行するコアメソッドは、HttpRequestを開始し、HttpResponseを返すことです
returnContent()返されたリクエスト結果のコンテンツを取得します。これは実際にはストリームです。テキスト
ビルドポストリクエスト
String content = Failsafe.with(retryPolicy).get(() ->
//构建一个post请求
//请求体body可以使用方法bodyString()按照文本格式传入即可
// 如:json字符串的文本类型APPLICATION_JSON
//设置连接时间和文本读取时间,
//execute执行这个请求获得respond
Request.Post(h5Url)
.bodyString(dataJson, ContentType.APPLICATION_JSON)
.connectTimeout(DEFAULT_CONNECT_TIMEOUT)
.socketTimeout(DEFAULT_SOCKET_TIMEOUT)
.execute().returnContent().asString()
);
フォーム送信を構築するために頻繁に使用される追加のメソッドbodyForm()メソッドがいくつかあります。
.bodyForm(Form.form().add("username", "vip").add("password", "secret").build())
さまざまなテキストタイプを返す必要性に応じて、asBytes()、asString()は、ファイルsaveContent()への直接書き込みもサポートします。
.saveContent(new File("result.dump")); //保存为文件
カスタム応答処理
前述のように、HttpResponseオブジェクトはexecut()の実行後に取得され、handleResponse()メソッドを使用して応答処理をカスタマイズできます。
Document result = Request.Get(url)
.execute().handleResponse(new ResponseHandler<Document>() {
public Document handleResponse(final HttpResponse response) throws IOException {
...}
});
コンポーネントfluent-hcの利点:fluent-hcの
本質は、HttpClientをカプセル化することです。チェーン操作はシンプルで、解釈が簡単で、
接続管理やリソース割り当てを処理する必要がありません。
接続プールテクノロジーは、リソースオーバーヘッドを削減し、パフォーマンスを向上させます。
エグゼキュータのオブジェクトは、接続プールから取得したHttpClientオブジェクトです。HTTP接続プールテクノロジを使用すると、HTTP接続を頻繁に確立する時間のオーバーヘッドが削減され、TCP接続が確立および解放されるときのソケット通信サーバー側リソースの浪費が削減され、より高い同時実行性がサポートされます。