やあ!私の名前は Viacheslav Aksenov です。Java と Kotlin での複雑なバックエンド システムの開発を専門とするバックエンド開発者です。また、私のGitHubで見つけることができる多くの小さなペットプロジェクト: https://github.com/v-aksenov
マイクロサービスは、大規模なアプリケーション内で特定のタスクまたは一連のタスクを実行するように設計された小さな独立したサービスです。各マイクロサービスは、システム内の他のマイクロサービスとは独立して開発およびデプロイされ、API を介して他のマイクロサービスと通信します。
マイクロサービスには、スケーラビリティの向上、フォールト トレランスの向上、俊敏性の向上など、他にもいくつかの利点があります。アプリケーションをより小さく独立したサービスに分割することで、開発者は必要に応じて個々のコンポーネントを簡単にスケールアップまたはスケールダウンでき、ユーザーのニーズや市場の状況の変化に迅速に対応できます。
ただし、マイクロサービスは、堅牢な API 管理、サービス検出、分散トレースの必要性など、いくつかの課題ももたらします。マイクロサービスを適切に設計および実装するには、開発チーム全体での慎重な計画と調整、および開発中のシステムの固有の要件と制約を深く理解する必要があります。
この質問に答えるには、「この現在のサービスは何を担当しているのか?」という質問に答える必要があります。
サービス ビジネス ロジックでは、サードパーティの API から応答を取得する必要がある場合がよくあります。さらに、ビジネス プロセスを処理するために、チェーン内に複数のマイクロサービスがあります。このような状況では、マイクロサービスに HTTP クライアントを実装する必要があります。
マイクロサービス アーキテクチャでは、HTTP クライアントは、HTTP プロトコルを介して他のマイクロサービスと通信するソフトウェア コンポーネントです。 HTTP クライアントは、他のマイクロサービスにリクエストを送信し、レスポンスを受信する役割を果たします。
マイクロサービスが別のマイクロサービスと通信する必要がある場合、通常、HTTP 要求を他のマイクロサービスの適切なエンドポイントに送信します。 HTTP 要求には、受信側のマイクロサービスがタスクを実行するために使用できる JSON オブジェクトや XML ドキュメントなどのデータのペイロードが含まれる場合があります。
Spring Boot サービスに HTTP クライアントを実装するために選択できる方法はいくつかあります。まず、選択する必要があるのは、同期クライアントと非同期クライアントのどちらですか?
たとえば、同期アーキテクチャを使用している場合は、Spring Boot が提供するソリューションのいずれかを選択できます。
Spring Boot では、同期 HTTP クライアントは、他のサービスまたはエンドポイントに HTTP リクエストを送信するために使用されるコンポーネントであり、レスポンスが受信されるまで現在のスレッドをブロックします。 Spring Boot は、 RestTemplate
およびWebClient
クラスを含む、同期 HTTP クライアントを実装するためのいくつかのオプションを提供します。
RestTemplate
Spring Boot で同期 HTTP クライアントを実装するための一般的な選択肢です。 HTTP 要求を作成して応答を処理するためのシンプルで直感的な API を提供し、幅広い HTTP メソッド、要求と応答の種類、およびメッセージ コンバーターをサポートします。 RestTemplate
を使用するには、アプリケーション コンテキストで Bean として構成し、さまざまなメソッドを呼び出して HTTP 要求を作成するために使用する必要があります。
POST HTTP リクエストの RestTemplate の使用例があります。
public RegisterResponse registerUser(UserDto userDto) { HttpEntity<UserDto> requestEntity = new HttpEntity<>(user, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, RegisterResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { RegisterResponse response = responseEntity.getBody(); // handle the response } else { // handle the error } }
Spring Boot で同期 HTTP クライアントを実装するための別のオプションは、 WebClient
クラスを使用することです。 WebClient
は、HTTP 要求を作成し、応答を処理するためのノンブロッキング API を提供するリアクティブ HTTP クライアントであり、高レベルの同時実行性またはスケーラビリティを必要とするアプリケーションに適しています。 WebClient
を使用するには、アプリケーション コンテキストで Bean として構成し、それを使用してさまざまなメソッドを呼び出して HTTP 要求を作成する必要があります。
public RegisterResponse registerUser(UserDto userDto) { Mono<String> responseMono = webClient.post() .uri(endpointPath) .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(user), UserDto.class) .retrieve() .bodyToMono(RegisterResponse.class); responseMono.subscribe(response -> { // handle the response }, error -> { // handle the error }); }
同期 HTTP クライアントを使用すると、現在のスレッドがブロックされ、アプリケーションの全体的なパフォーマンスとスケーラビリティに悪影響を及ぼす可能性があることに注意してください。そのため、アプリケーションの応答性とリソースの使用率を向上させるために、可能であれば、リアクティブ プログラミングを使用したWebClient
などの非同期 HTTP クライアントを使用することをお勧めします。
簡単な答え - Feign ライブラリを使用できます。それは何ですか?
Feign は、RESTful マイクロサービスを構築するために特別に設計された、開発者が HTTP クライアントを簡単に作成できるようにする Java ライブラリです。ローカル メソッド呼び出しのようにコードから呼び出すことができる HTTP API を定義する宣言的な方法を提供し、API の操作とさまざまなマイクロサービス間でのリソースの消費を容易にします。
Feign を使用すると、RESTful エンドポイントの HTTP メソッド、要求パラメーター、および応答タイプを定義するインターフェースを簡単に作成できます。その後、リクエストとレスポンスのシリアライズとデシリアライズ、URL エンコーディング、エラー処理、接続管理など、残りは Feign が処理します。
Feign を使用したユーザー登録の POST リクエストの例を次に示します。
// Client describes as interface with configuration: @FeignClient(name = "exampleRegisterClient") public interface RegisterClient { @PostMapping("/register") RegisterResponse registerUser(@RequestBody UserDto user); } // Bean creation in Spring configuration: @Bean public RegisterClient registerUserApi() { return Feign.builder().target(RegisterClient.class, "https://localhost:9090/api); }
Feign は、HTTP API とやり取りするためのシンプルで宣言的な方法を提供し、開発者が HTTP リクエストの作成の詳細ではなく、マイクロサービスのビジネス ロジックに集中できるようにします。
結論として、Spring Boot は、RestTemplate、WebClient、Feign など、HTTP クライアントをマイクロサービスに実装するための複数のオプションを提供します。 RestTemplate は、同期 HTTP 通信を提供するシンプルで広く使用されているクライアントです。 WebClient は、機能スタイルの API を使用したノンブロッキング HTTP 通信を提供する、よりモダンでリアクティブな代替手段です。 Feign は、API 定義に基づいてコードを生成する宣言型でタイプ セーフなクライアントであり、RESTful マイクロサービスに使いやすいインターフェイスを提供します。
使用する HTTP クライアントを選択するときは、パフォーマンス、スケーラビリティ、使いやすさなど、マイクロサービスの要件を考慮することが重要です。 RestTemplate は、同期通信を必要とする単純なユース ケースに適しています。 WebClient は、高いパフォーマンスとスケーラビリティを必要とするリアクティブでノンブロッキングのユース ケースに適しています。 Feign は、簡素化された API と改善された開発者エクスペリエンスを必要とする、宣言的でタイプ セーフなユース ケースに適しています。
選択する HTTP クライアントに関係なく、統合テストを作成して、外部サービスと対話するときにマイクロサービスが正しく動作することを確認することが重要です。 HTTP クライアントをテストすることで、ネットワーク障害や外部サービスからの予期しない応答など、さまざまなシナリオでマイクロサービスが期待どおりに動作することを確認できます。
私の GitHub で、HTTP クライアントを作成するさまざまな方法を実装する私の例を見つけることができます: https://github.com/v-aksenov