Delving Into Spring Boot Netflix: Netflix's Application Framework
本セッションでは、NetflixにおけるSpringBootフレームワークの活用について、依存関係の取り扱いやプロパティ管理、セキュリティ等の観点から紹介されました。
Netflixではストリーミングやサブスクリプション、支払い処理などのすべてがSpring Bootベースのアプリケーションで運用されています。これらのアプリケーションではSpring Bootに独自のカスタマイズを加えた「Spring Boot Netflix(SBN)」というフレームワークを使用しているそうです。
Netflixでは、ストリーミングやサブスクリプション、支払い処理、スタジオアプリケーション、エンタープライズアプリケーションなど、多様なユースケースに対応しており、これらすべてがSpring Bootベースのアプリケーションで運用されています。
また、Netflixのプラットフォームには、Eureka、Fast Properties、Insight Logsなどさまざまなサービスと統合されているという説明がありました。このうちFast Propertiesについては、後述するプロパティ管理の説明でも取り上げられていました。
依存関係の取り扱い
Netflixでは、Netflix固有の依存関係に特化した「Starters」を作成して利用していると説明がありました。例えば「spring-boot-netflix-starter-rest-server」を依存関係に追加すると、Springの依存関係に加えて可観測性、耐障害性、セキュリティなどの依存関係も同時に追加されます。
また、Netflixがオープンソースとして提供している「Dependency Recommender」というプラグインを適用することで、このプラグインがビルドファイルをスキャン+欠けている依存関係の検出+推奨バージョン適用を自動で実施されます。
ビルドフェーズにおけるアプリケーションの依存関係管理については、「SBN Gradleプラグイン」を使用していると説明されました。これは依存関係だけでなく、Dockerファイルの生成なども行うため、アプリケーションはNetflixのEC2インスタンスに直接デプロイすることも、Dockerを使用してデプロイすることも可能です。
プロパティ管理
次にプロパティ管理について紹介されました。Netflixでは、本番/開発環境など、環境ごとにプロパティ値を分離するためにSpringのProfilesを利用しているとのことでした。Profileがアクティブ化されると、Springが正しいプロパティファイルをロードし、それらをまとめてくれるため、各Profileごとのセクションをロードすることで環境ごとのプロパティを読み込むことができます。
この際、外部システムである「Fast Properties」を利用し、アプリケーションの起動時に外部サービスを呼び出し、特定のインスタンスに関連するすべてのプロパティを取得しているとの説明がありました。
また、プロパティに含まれる機密情報の管理には、「Metatron」という証明書ベースの認証管理ツールを利用しているとのことでした。
セキュリティ
NetflixはSpring Securityを活用し、「Secure By Default(デフォルトで安全)」を標準としています。デフォルトで安全とは、すべてのアプリケーションエンドポイントが認証されなければならない、という意味であると解説されました。
また、アプリケーションリソースをセキュリティ領域(Security Realms)にグループ化し、下記のように各領域で異なる認証・認可ルールを適用していると述べられました。
- アプリケーション領域:ほとんどのAPIエンドポイントを保護し、少なくとも一人の認証されたユーザを必要とする
- 管理領域:主にアクチュエータエンドポイントなどの管理エンドポイントを含む
- 匿名領域:無認証でアクセス可能な特定のエンドポイントを追加できる。デフォルトでは空。
その他、柔軟なアクセスコントロールを可能にするためのリクエストチェーン内のアイデンティティの伝播についても説明がありました。
これらのセキュリティ構成により、Netflixでは安全かつ柔軟なアクセスコントロールが実現されているという説明がありました。
サービス間通信
次に、サービス間通信(IPC:Inter-Process Communication)について説明がありました。Netflixでは、REST、Web Client、GraphQL、gRPCといった技術が利用されており、本講演ではとくにIPCクライアント側のgRPCに焦点を当てて説明されました。
NetflixのIPC Clientは上図に示す要素からなる共通的な構成となっており、これらの要素が組み合わさって、REST、Web Client、GraphQL、gRPCのいずれのIPCクライアントでも使用可能な基盤が構築されています。
また、Netflixでは、gRPCサーバに対する呼び出しを簡単にするために、以下の機能を持つプリコンフィグされたgRPCクライアントを提供しています。
- 可観測性:アクセスログやメトリクス、トレースなど
- 耐障害性:リトライ、同時実行数制限、フォールバックなど
ユーザーは@GrpcSpringClientアノテーションを使用し、名前を提供するだけで、この名前がプロパティと関連付けられ、すべてが自動的にロードおよび構成することができます。
@GrpcSpringClientアノテーションの実装には、以下のSpringのビルディングブロックを使用していると説明がありました。
- BeanDefinitionRegistryPostProcessor:プログラム的にBean定義を登録
- ReflectionUtils、AnnotationUtils:クラスを検査しアノテーションを検出
- FactoryBean:クライアント名とともにBeam定義を作成、特定のクライアントプロパティをロード
以上、NetflixにおけるSpring Bootフレームワークの活用についての紹介でした。
おわりに
以上、SpringOne 2024のハイライトでした。ライブストリーミングされたセッションは8月29日の時点でYouTubeに公開され、誰でも視聴できるようになっています。本稿で興味を持ったセッションがあれば動画もチェックしてみてください。