アプリケーション開発

Spring Boot と Spring Cloud GCP を使用した Java アプリのモダナイズ

#appdev

※この投稿は米国時間 2020 年 10 月 29 日に、Google Cloud blog に投稿されたものの抄訳です。

6 か月ごとにリリースされる新しい Java 言語機能、Kotlin などの新しい JVM 言語、従来のモノリシック アプリケーションから Spring Boot などの最新のフレームワークを備えたマイクロサービス アーキテクチャへの移行。これはもう Java デベロッパーにとってはまさにわくわくするような機会の連続と言えそうです。さて、Spring Cloud GCP は、企業が既存のアプリケーションをモダナイズし、Google Cloud 上でクラウドネイティブ アプリケーションを簡単に構築できるようにするために開発されました。

2 年前に始めてリリースされた Spring Cloud GCP を使用することで、Spring Boot アプリケーションでは通常の Spring Boot API を使用して 12 を超える Google Cloud サービスを簡単に利用できます。つまり、Google Cloud 固有のクライアント ライブラリについて学ばなくても、マネージド サービスのメリットを活用し、実現することができるのです。

  1. Spring Boot アプリケーションをすでに所有している場合は、コードをほとんどまたは一切変更せずに、Google Cloud サービスに簡単に移行できます。

  2. 新規に Spring Boot アプリケーションを作成する場合は、既知のフレームワーク API を使用して Google Cloud サービスを活用することができます。

メジャーリーグ ベースボールは最近、Google Cloud でクラウドへの旅に乗り出しました。GKE と Anthos を使用してインフラストラクチャをモダナイズすることに加え、マイクロサービス アーキテクチャを使用したモダナイゼーションも行っています。Spring Boot はすでに組織内の標準 Java フレームワークとなっています。Spring Cloud GCP により、MLB は既存の Spring Boot の知識を活用して Google Cloud を迅速に採用できました。

「私たちは Spring Cloud GCP を使用して、サービス アカウントの認証情報と Google Cloud サービスへのアクセスを管理しています。」 - MLB プリンシパル ソフトウェア エンジニア Joseph Davey 氏

同様に、オンライン小売業者である bol.com は、Spring Cloud GCP を使用して、GCP 上で Spring Boot アプリケーションをより簡単に開発できました。

「[bol.com] は Spring Boot に大きく依存していますが、私たちには Spring Boot 上に独自のモジュールを構築して Spring Boot アプリケーションを GCP と統合するほどの十分な能力はありません。Spring Cloud GCP がその負担を取り除いてくれたおかげで、Google Cloud Platform への統合がとても簡単になっています。」 - bol.com ソフトウェア エンジニア Maurice Zeijen 氏

カスタムコードをほとんどまたは一切使用しなくなることによるデベロッパーの生産性の向上

Spring Cloud GCP を使用すると、新しいアプリの開発や既存アプリの移行などにより、フルマネージド データベースの採用、イベント ドリブン アプリの作成、分散トレースと一元化ロギングの追加、シークレットの取得などが可能になります。これらはすべて、カスタムコードまたはカスタム インフラストラクチャをほとんどまたは一切必要とせずに維持できます。それでは、Spring Cloud GCP がもたらす統合の一部を見てみましょう。

データ

PostgreSQL、MySQL、MS SQL などの通常の RDBMS の場合、Cloud SQL の使用と Spring Data で Hibernate の継続使用が可能、また JDBC 構成を更新するだけで Cloud SQL に接続できます。それでは、Firestore、Datastore、グローバルに分散された RDBMS Cloud Spanner などの Google Cloud データベースについてはどうでしょうか。Spring Cloud GCP は必要なすべてのデータ抽象化を実装しているので、ビジネス ロジックを書き直すことなく、Spring Data とそのデータ リポジトリを引き続き使用可能です。たとえば、Spring Data がサポートする他のデータベースを使用するのと同じように、フルマネージド NoSQL データベースである Datastore の使用を開始できます。

Hibernate / JPA クラスにアノテーションを付けるのと同じように、Spring Cloud GCP アノテーションを使用して POJO クラスにアノテーションを付けることができます。

  @Entity(name = "books")
public class Book {
	@Id
	Long id;
	String title;
	String author;
	int year;
}

次に、独自のデータアクセス オブジェクトを実装するのではなく、Spring Data リポジトリ インターフェースを拡張して、完全な CRUD オペレーションとカスタムクエリ メソッドを取得できます。

  public interface BookRepository extends DatastoreRepository<Book, Long> {
	List<Book> findByAuthor(String author);
	List<Book> findByYearGreaterThan(int year);
	List<Book> findByAuthorAndYear(String author, int year);
}

Spring Data と Spring Cloud GCP は、CRUD オペレーションを自動的に実装し、クエリを生成します。何よりも、データ変更イベントの監査やキャプチャなどの組み込み Spring Data 機能が使用できます。

DatastoreFirestoreSpanner のための、Spring Data の完全なサンプルは GitHub をご覧ください。

メッセージ

非同期メッセージ処理とイベント ドリブン アーキテクチャの場合、複雑な分散メッセージング システムを手動でプロビジョニングして維持するのではなく、単に Pub/Sub を使用します。Spring Integration や Spring Cloud Stream などの高レベルの抽象化を使用すれば、わずかな構成変更でオンプレミス メッセージング システムから Pub/Sub に切り替えられます。

たとえば、Spring Integration を使用すると、メッセージを一般公開できる汎用ビジネス インターフェースを定義して、Pub/Sub にメッセージを送信するように構成できます。

  @MessagingGateway
public interface OrdersGateway {
  @Gateway(requestChannel = "ordersRequestOutputChannel")
  void sendOrder(Order order);
}

同じ方法でメッセージを消費できます。以下に、Spring Cloud Stream と標準の Java 8 ストリーミング インターフェースを使用して、単にアプリケーションを構成するだけで Pub/Sub からメッセージを受信する例を示します。

  @Bean
public Consumer<Order> processOrder() {
  return order -> {
    logger.info(order.getId());
    };
};

Spring IntegrationSpring Cloud Stream の完全なサンプルについては、GitHub をご覧ください。

オブザーバビリティ

ユーザー リクエストが複数のマイクロサービスによって処理されていて、それらのマイクロサービスにまたがるコールスタック全体を可視化することが必要な場合は、分散トレースをサービスに追加できます。Google Cloud では、すべてのトレースを Cloud Trace に保存できるため、独自のトレース サーバーやストレージを管理する必要はありません。

Spring Cloud GCP Trace スターターを依存関係に追加するだけで、必要なすべての分散トレース コンテキスト(トレース ID、スパン ID など)がキャプチャされ、伝播されて、Cloud Trace に報告されます。

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>

これが必要なもののすべて - カスタムコードは必要ありません。すべてのインストルメンテーションとトレース機能は Spring Cloud Sleuth を使用します。Spring Cloud GCP は Spring Cloud Sleuth のすべての機能をサポートしているため、分散トレースは Spring MVC、WebFlux、RestTemplate、Spring Integration などと自動的に統合されます。

trace waterfall view.jpg

Cloud Trace は分散トレースグラフを生成します。ただし、[ログを表示] チェックボックスを確認してください。このトレース / ログ相関機能によりログメッセージを各トレースに関連付けられるため、問題を特定するリクエストに関するログを確認できます。Spring Cloud GCP Logging スターターとその事前定義されたロギング構成を使用して、トレース相関データを含むログエントリを自動的に生成することができます。

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-logging</artifactId>
</dependency>

LoggingTrace の完全なサンプルについては、GitHub をご覧ください。

シークレット

マイクロサービスでは、データベースのパスワードやその他の資格情報などのシークレットへのアクセスが必要になる場合があります。従来、資格情報は HashiCorp Vault などのシークレット ストアに保存されていました。Vault は Google Cloud で引き続き使用できますが、Google Cloud ではこの目的に Secret Manager サービスを提供しています。Spring Cloud GCP Secret Manager スターターを追加するだけで、標準の Spring プロパティを使用してシークレット値の参照を開始できます。

  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-logging</artifactId>
</dependency>

アプリケーション プロパティ ファイルで、特別なプロパティ構文を使用してシークレット値を参照できます。

  spring.datasource.password=${sm://books-db-password}

Secret Manager の完全なサンプルについては、GitHub をご覧ください。

開発を支援する、オープンソースのコンポーネント群

Spring Cloud GCP は、Spring Boot と Spring Cloud のリリース トレインに厳密に従います。現在、Spring Cloud GCP 1.2.5 は、Spring Boot 2.3 と Spring Cloud Hoxton のリリース トレインで動作します。Spring Cloud GCP 2.0 が進行中で、これは Spring Boot 2.4 と Spring Cloud Ilford リリース トレインをサポートします。

チームはこれまで、コアの Spring Boot と Spring Cloud の統合に加えて、デベロッパーのニーズに応えるコンポーネントの開発に取り組んできました。

私たちにとっては、デベロッパーの成功が重要です。フィードバック、機能のリクエスト、GitHub での問題点をお聞かせください。お客様のニーズを理解し、開発作業に優先順位を付けることができます。

試してみましょう

実際の活動をご覧になりますか。Google Cloud Next ’20: OnAir がお届けするデベロッパー向けの実践的な基調講演をご覧ください。講演では、Daniel Zou が Anthos や Service Mesh などを使用してアプリケーションをモダナイズするときの Spring Boot と Spring Cloud GCP の活用法を紹介しています。

多くのサンプルを使用して、Spring Cloud GCP を簡単に試すこともできます。Qwiklab でガイド付きの Spring Boot on GCP コースを受講することも、Coursera で受講することも可能です。最後に、詳細な機能と構成については、リファレンス ドキュメントをご覧ください。


-デベロッパー アドボケイト Ray Tsang

-ソフトウェア エンジニア Mike Eltsufin