JavaにおけるマイクロサービスAPIゲートウェイパターン:統合エンドポイントによるサービスアクセスの簡素化
マイクロサービスAPIゲートウェイのデザインパターンの意図
APIゲートウェイのデザインパターンは、マイクロサービスアーキテクチャ内のマイクロサービスのセットに対して、統一されたインターフェースを提供することを目的としています。クライアントの単一のエントリポイントとして機能し、リクエストを適切なマイクロサービスにルーティングし、結果を集約することで、クライアント側のコードを簡素化します。
別名
- APIファサード
- Backend for Frontends (BFF)
マイクロサービスAPIゲートウェイパターンの詳細な説明と実例
実例
大規模なeコマースプラットフォームでは、APIゲートウェイはすべてのクライアントリクエストの単一のエントリポイントとして使用され、クライアント側の開発を簡素化します。ユーザーがサイトにアクセスしたり、モバイルアプリを使用したりすると、製品情報、ユーザー認証、注文処理、支払いに関するリクエストはすべてAPIゲートウェイを介してルーティングされます。APIゲートウェイは、ユーザー認証、不正利用を防ぐためのレート制限、監視のためのロギングなどのタスクを処理し、全体のセキュリティ最適化を強化します。この設定により、クライアントインターフェースが簡素化され、すべてのバックエンドマイクロサービスがクライアントに直接影響を与えることなく独立して進化できるようになり、マイクロサービス間の通信が強化されます。また、ポリシーを適用しトラフィックを監視するための一元的なポイントを提供することで、セキュリティも強化されます。
平易な言葉で
マイクロサービスアーキテクチャを使用して実装されたシステムでは、APIゲートウェイは個々のマイクロサービスへの呼び出しを集約する単一のエントリポイントです。
Wikipediaによると
APIゲートウェイは、APIフロントエンドとして機能するサーバーであり、APIリクエストを受信し、スロットリングとセキュリティポリシーを適用し、リクエストをバックエンドサービスに渡し、その後レスポンスをリクエスターに返します。ゲートウェイには、多くの場合、リクエストとレスポンスをその場でオーケストレートおよび変更するための変換エンジンが含まれています。ゲートウェイは、分析データの収集やキャッシュの提供などの機能も提供できます。ゲートウェイは、認証、認可、セキュリティ、監査、規制順守をサポートする機能を提供できます。
JavaでのマイクロサービスAPIゲートウェイのプログラム例
この実装は、APIゲートウェイパターンがeコマースサイトでどのように見えるかを示しています。ApiGateway
は、ImageClientImpl
とPriceClientImpl
をそれぞれ使用して、イメージと価格のマイクロサービスを呼び出します。デスクトップデバイスでサイトを閲覧する顧客は、価格情報と製品画像の両方を見ることができるため、ApiGateway
は両方のマイクロサービスを呼び出し、DesktopProduct
モデルにデータを集約します。ただし、モバイルユーザーには価格情報のみが表示されます。製品画像は表示されません。モバイルユーザーの場合、ApiGateway
は価格情報のみを取得し、それを使用してMobileProduct
に入力します。
これがイメージマイクロサービスの実装です。
public interface ImageClient {
String getImagePath();
}
public class ImageClientImpl implements ImageClient {
@Override
public String getImagePath() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50005/image-path"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
これが価格マイクロサービスの実装です。
public interface PriceClient {
String getPrice();
}
public class PriceClientImpl implements PriceClient {
@Override
public String getPrice() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50006/price"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
ここでは、APIゲートウェイがリクエストをマイクロサービスにどのようにマッピングするかを確認できます。
public class ApiGateway {
@Resource
private ImageClient imageClient;
@Resource
private PriceClient priceClient;
@RequestMapping(path = "/desktop", method = RequestMethod.GET)
public DesktopProduct getProductDesktop() {
var desktopProduct = new DesktopProduct();
desktopProduct.setImagePath(imageClient.getImagePath());
desktopProduct.setPrice(priceClient.getPrice());
return desktopProduct;
}
@RequestMapping(path = "/mobile", method = RequestMethod.GET)
public MobileProduct getProductMobile() {
var mobileProduct = new MobileProduct();
mobileProduct.setPrice(priceClient.getPrice());
return mobileProduct;
}
}
JavaでマイクロサービスAPIゲートウェイパターンを使用する場合
- マイクロサービスアーキテクチャを構築するとき、およびクライアントからマイクロサービスの複雑さを抽象化する必要がある場合。
- 単一のリクエストで複数のマイクロサービスを消費する必要がある場合。
- 単一のポイントで認証、認可、セキュリティの適用を行う場合。
- 特にクラウド環境で、クライアントとサービス間の通信を最適化する場合。
マイクロサービスAPIゲートウェイパターンのJavaチュートリアル
- 新しいSpring Cloud Gatewayの探索 (Baeldung)
- Spring Cloud - Gateway (tutorialspoint)
- Spring Cloud Gatewayの始め方 (DZone)
マイクロサービスAPIゲートウェイパターンのメリットとトレードオフ
メリット
- マイクロサービスからクライアントを切り離し、サービスを独立して進化させることができます。
- 複数のサービスへのリクエストを集約することで、クライアントを簡素化します。
- セキュリティ、ロギング、レート制限などのクロス切断的な関心事の一元化された場所。
- キャッシュやリクエスト圧縮などのパフォーマンス最適化の可能性。
トレードオフ
- 単一障害点が発生しますが、これは高可用性設定で軽減できます。
- 適切にスケーリングされていない場合、ボトルネックになる可能性があります。
- デプロイと管理の点で複雑さが増します。
JavaにおけるマイクロサービスAPIゲートウェイパターンの実世界の応用例
- 単一のビューのために複数のサービス(製品情報、価格設定、在庫)が集約されるeコマースプラットフォーム。
- さまざまなバックエンドサービスを消費するが、使いやすさのために簡素化されたインターフェースを必要とするモバイルアプリケーション。
- 複数のマイクロサービスアーキテクチャを活用するクラウドネイティブアプリケーション。
関連するJavaデザインパターン
- アグリゲーターマイクロサービス - APIゲートウェイパターンは、マイクロサービスのセットに統一されたインターフェースを提供するために、アグリゲーターマイクロサービスパターンと組み合わせて使用されることがよくあります。
- サーキットブレーカー - APIゲートウェイは、複数のマイクロサービスを呼び出す際にカスケード障害を防ぐために、サーキットブレーカーパターンを使用できます。
- プロキシ - APIゲートウェイパターンは、プロキシパターンの特殊な形式であり、ゲートウェイはクライアントの単一のエントリポイントとして機能し、リクエストを適切なマイクロサービスにルーティングし、結果を集約します。