Spring Boot と Spring Cloud を使用してマイクロサービス アーキテクチャで API ゲートウェイを実装する: クライアントと複数のマイクロサービス間の対話プロセスを簡素化する
1. はじめに
1 マイクロサービスアーキテクチャの開発動向
ビジネスの急速な成長と反復により、従来のモノリシック アプリケーションでは、今日の大規模なディストリビューションのニーズを満たすことができなくなりました。新しいサービス アーキテクチャ パターンであるマイクロサービス アーキテクチャは、アプリケーションをより小さな単位に分割することで開発効率と拡張性を向上させます。各ユニットは独立して開発、テスト、展開できるため、ビジネスの変化や要件に迅速に対応できます。
2 マイクロサービス アーキテクチャにおける課題
マイクロサービス アーキテクチャもいくつかの課題に直面しており、重要な課題の 1 つは、オープン API インターフェイスをどのように管理および保護するかです。マイクロサービス アーキテクチャには多数のサービス インスタンスとインターフェイス リソースが存在するため、外部にサービスを提供するには共通の入り口が必要であり、サービス リソースを保護するには認証と認可が必要です。
3 APIゲートウェイの機能と価値
マイクロサービス アーキテクチャの下での課題に対処するために、API ゲートウェイが登場しました。API ゲートウェイはサービスの単一のエントリ ポイントであり、ルーティング、転送、セキュリティ、モニタリング、プロトコル変換などの機能を提供します。API ゲートウェイは、API インターフェイスを管理および保護し、さまざまなマイクロサービスのリクエストに均一にアクセスして処理し、同時にサービスの可用性と信頼性を向上させることができます。
2. Spring Boot と Spring Cloud の概要
1 Spring Bootの特徴とメリット
Spring Boot は、独立した Spring アプリケーションを迅速に構築するためのフレームワークであり、自動構成と構成上の規則を通じて、Spring アプリケーションを迅速に開発およびデプロイできます。Spring Boot には、自己完結型、デプロイが容易、XML 設定不要、自動アセンブリ、および複数のスターター パッケージという特徴と利点があります。
2 Spring Cloudの主な機能とコンポーネント
Spring Cloud は、Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Bus、Spring Cloud Sleuth、Spring Cloud Stream などの多数のコンポーネントと機能を提供する Spring Boot ベースのマイクロサービス フレームワークです。その中で、Spring Cloud Netflix には、Netflix Eureka、Netflix Hystrix、Netflix Zuul などの実用的なマイクロサービス コンポーネントが多数含まれており、マイクロサービス アーキテクチャの開発をより簡単かつ便利にします。
3 Spring Cloud Gatewayの基本原理と特徴
新世代の API ゲートウェイとして、Spring Cloud Gateway はルーティングと転送にフィルター チェーン ベースのアプローチを使用します。さまざまなサービス検出コンポーネントと負荷分散戦略を統合でき、ダイナミック ルーティング、サーキット ブレーカー、電流制限、リクエストの再試行などの機能をサポートします。さらに、Spring Cloud Gateway は、コードが簡潔で、拡張が容易で、パフォーマンスが高いという特徴もあります。
@RestController
public class ApiController {
@RequestMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return "Hello, " + name + " from API";
}
}
上記は単純な Spring Boot REST インターフェイスですが、API Gateway はルーティングとプロキシを実装することでこのインターフェイスを外部クライアントに公開し、高パフォーマンスおよび高可用性のサービスを提供します。
3. マイクロサービスアーキテクチャでのAPIゲートウェイの実装
1 マイクロサービス アーキテクチャにおける API ゲートウェイの役割と利点の概要を説明する
マイクロサービス アーキテクチャでは、各マイクロサービスには独自の REST API があり、他のマイクロサービスまたはフロントエンド アプリケーションによって呼び出されます。しかし、サービスの数の増加と多様化に伴い、クライアントがREST APIを呼び出す方法はますます複雑になり、これらのAPIを管理するための一元的な入口が必要となり、この一元的な入口がAPIゲートウェイとなります。
API ゲートウェイは集中化された入り口として API インターフェイスを管理および保護し、リクエストに対してフロー制御、アクセス制御、ヒューズ、電流制限などの機能を実行できるため、クライアントのリクエストは意識せずに API ゲートウェイを呼び出すだけで済みます。基盤となるマイクロサービスの特定の条件。
マイクロサービス アーキテクチャの利点は、サービスを簡単に分割できることで、アジャイル開発、高速イテレーション、スケーラビリティ、高可用性、パフォーマンスの最適化を効果的に実現できる一方、API ゲートウェイによってシステムのセキュリティ、安定性、可観測性がさらに向上できることです。
2 マイクロサービスアーキテクチャでAPIゲートウェイを実装する際の技術ポイント
2.1 サービスの検出と登録
マイクロサービス アーキテクチャでは、サービスの数が多く不安定であるため、サービスの状態と位置を追跡するメカニズム (サービスの検出と登録) が必要です。サービスの検出と登録は、Consul、Zookeeper、Etcd などのツールを使用して実装できます。サービスが開始されると、サービスは独自のメタデータ (IP アドレス、ポート、正常性ステータスなど) をサービス レジストリに登録します。他のサービスは、サービス検出メカニズムを渡してサービス情報を取得できます。
2.2 ヒューズと電流制限
分散システムで問題のあるサービスを呼び出すと、システム全体がクラッシュする可能性があるため、サービスのアクセスを制御するメカニズム、つまりサーキット ブレーカーと電流制限が必要です。ヒューズ メカニズムは、サービスが異常な場合にサービス コールを再度有効にするまでサービス コールを閉じます。また、電流制限により、フローを制御する目的を達成するためにサービス リクエストが制限されます。
2.3 認証と本人認証
オープンシステムでは、システムのセキュリティを確保するためにリクエスト認証と本人認証が必要です。認証と ID 認証は、OAuth2、JWT などの一般的な認証メカニズムを使用して実装でき、ユーザーの ID と権限を検証して API へのアクセスをユーザーに許可します。
2.4 統合ルーティングと負荷分散
マイクロサービス アーキテクチャでは、サービスが異なるホストにデプロイされ、異なるポートを使用してアクセスされる可能性があるため、クライアントが対応するサービスにアクセスできるようにするための統一されたルーティング方法が必要です。負荷分散テクノロジーを使用すると、サービスの健全性、高いパフォーマンス、およびスケーラビリティを確保できます。
4. Spring Boot と Spring Cloud に基づいて API ゲートウェイを構築する
1 シンプルなマイクロサービス アプリケーションを構築する
まず、user-service と order-service という 2 つのサービスを含む単純なマイクロサービス アプリケーションを構築します。user-service はユーザー関連のリクエストを処理するために使用され、order-service は注文関連のリクエストを処理するために使用されます。
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
@RestController
public class UserController {
@GetMapping("/users/{userId}")
public String getUser(@PathVariable String userId) {
return "User " + userId;
}
}
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
@RestController
public class OrderController {
@GetMapping("/orders/{orderId}")
public String getOrder(@PathVariable String orderId) {
return "Order " + orderId;
}
}
上記は、ユーザー リクエストと注文リクエストをそれぞれ処理する 2 つのマイクロサービスのコードです。
2 サービス検出および登録センターを構築する
私たちはサービス検出とレジストリとして Consul を使用しています。Consul の構築は非常に簡単で、対応するバイナリ パッケージをダウンロードし、コマンド ラインを実行して起動するだけです。
3 Spring Cloud Gateway の統合
APIゲートウェイとしてSpring Cloud Gatewayを使用します。Spring Cloud Gateway は、軽量、高性能、簡単に拡張可能な API ゲートウェイであり、Spring Boot および Spring Cloud と簡単に統合できます。
Spring Cloud Gateway の依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
4 APIゲートウェイの主要機能を実現する
4.1 認証と本人認証
Spring Security と OAuth2 を使用して API ゲートウェイの認証と認証を実装できます。
Spring Security と OAuth2 の依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-resource-server</artifactId>
</dependency>
application.yml ファイルで Spring Security と OAuth2 を構成します。
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: <auth-server-url>/auth/realms/<realm-name>/protocol/openid-connect/certs
次に、次のように各 API インターフェイスを認証する必要があります。
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/users/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://user-service")
.filters(f -> f.oauth2ResourceServer().jwt()))
.route(r -> r.path("/orders/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://order-service")
.filters(f -> f.oauth2ResourceServer().jwt()))
.build();
}
4.2 統合ルーティングと負荷分散
Spring Cloud LoadBalancer を使用すると、API Gateway の統合ルーティングと負荷分散を実現できます。
Spring Cloud LoadBalancer の依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
次に、LoadBalancerClientFilter を追加して、統合ルーティングと負荷分散を実現できます。次に例を示します。
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, LoadBalancerClient loadBalancerClient) {
return builder.routes()
.route(r -> r.path("/users/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://user-service")
.filters(f -> f.filter(loadBalancerClientFilter(loadBalancerClient))))
.route(r -> r.path("/orders/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://order-service")
.filters(f -> f.filter(loadBalancerClientFilter(loadBalancerClient))))
.build();
}
private GatewayFilter loadBalancerClientFilter(LoadBalancerClient loadBalancerClient) {
return (exchange, chain) -> loadBalancerClient.choose(((URI) exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR)).getHost())
.map(serviceInstance -> {
URI uri = exchange.getRequest().getURI();
// 使用选择的服务实例替换URI原始路径中的服务名称
URI newUri = loadBalancerClient.reconstructURI(
new DelegatingServiceInstance(serviceInstance),
uri);
// 重新定义请求的URI
ServerHttpRequest request = exchange.getRequest().mutate()
.uri(newUri)
.build();
return chain.filter(exchange.mutate().request(request).build());
}).orElse(chain.filter(exchange));
}
4.3 ヒューズと電流制限
Sentinel を使用すると、API ゲートウェイのサーキット ブレーカーと電流制限を実現できます。Sentinel は、Alibaba がオープンソース化したトラフィック制御システムで、大量の同時トラフィックに対処し、サーキット ブレーカー保護を実行できます。
Sentinel の依存関係を pom.xml ファイルに追加します。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
次に、application.yml ファイルで Sentinel を構成します。
spring:
cloud:
sentinel:
transport:
dashboard: <sentinel-dashboard-url>
gateway:
enabled: true
上記は Spring Boot と Spring Cloud に基づく API ゲートウェイの構築と実装であり、マイクロサービス アーキテクチャの下でトラフィック制御、ルーティング、セキュリティの問題を十分にサポートし、高可用性とパフォーマンスの最適化を提供できます。
5. APIゲートウェイ導入の効果と限界
このペーパーでは、API ゲートウェイの概念、機能、実装、および主要な機能を紹介し、次に API ゲートウェイの実装効果と制限についてレビューします。
1 APIゲートウェイの効果を実感する
APIゲートウェイを導入することで以下の効果が得られます。
1.1 統合管理 API インターフェース
APIゲートウェイは各マイクロサービスのAPIインターフェースを一元管理できるため、クライアントがマイクロサービスを直接呼び出すことがなくなり、サービスのセキュリティが強化され、システムの可観測性や保守性が向上します。
1.2 統合認証とIdentity認証
APIゲートウェイは、ユーザー認証とID認証を統合的に処理できるため、マイクロサービスごとの繰り返しの認証作業を回避し、サービスのセキュリティ保護を実装してユーザーデータのセキュリティを確保します。
1.3 ヒューズと電流制限保護
API ゲートウェイは、ヒューズと電流制限メカニズムを通じてマイクロサービスのアクセスを保護し、過剰なトラフィックによるサーバーのダウンタイムを防止し、システムの安定性と可用性を向上させることができます。
1.4 統合ルーティングと負荷分散
API ゲートウェイは、統合ルーティングと負荷分散の機能を完了し、トラフィックの効率的なスケジュールとバランスをとり、過剰なトラフィックによる単一障害点を回避し、システムの耐災害性とスケーラビリティを向上させることができます。
2 API ゲートウェイ実装の制限事項
API ゲートウェイには多くの利点がありますが、API ゲートウェイの実装には次の制限もあります。
2.1 単一障害点
API ゲートウェイは集中型サービスであるため、単一障害点が発生し、システム全体がクラッシュする可能性があります。
2.2 パフォーマンスのボトルネック
API ゲートウェイによるリクエストの処理プロセスにパフォーマンスのボトルネックが発生し、リクエストの遅延や処理の失敗が発生する可能性があります。
2.3 依存関係の管理
API ゲートウェイは、依存関係管理とバージョン管理を実現するために多くのオープンソース フレームワークとコンポーネントに依存する必要があります。そうしないと、互換性と安定性の問題が発生します。
2.4 技術的な複雑さ
API ゲートウェイの実装には、分散、マイクロサービス、ネットワーク、セキュリティ、パフォーマンスなどの複数の分野の技術的知識が必要であり、API ゲートウェイの保守とアップグレードには専門の技術者が必要です。