Springに適用するgRPCライブラリの比較

Spring環境にgRPCを適用する主要な2つのライブラリを比較します。

概要

Spring環境にgRPCを適用する主要なライブラリは2つあります。

  • net.devh:grpc-server-spring-boot-starter
  • org.springframework.grpc:spring-grpc-spring-boot-starter

どちらもSpringへgRPCを統合しますが、出自、設計、サポート方式、将来性が大きく異なります。

ライブラリ比較

項目 net.devh Spring gRPC
出自 コミュニティのサードパーティー Spring公式プロジェクト
安定性 長期間広く使用 初期段階で急速に発展
最新Spring対応 Spring Boot 3とNative対応に制限 Spring Boot 3、AOT、Native対応
アーキテクチャー gRPCサーバーとクライアントをラップ Spring指向のgRPC抽象化
クライアント方式 Stub生成とアノテーション注入 チャネルファクトリーとSpring Bean
拡張性 従来のgRPC方式 Springエコシステムとの連携
長期的方向性 安定した保守 Spring標準になる可能性

背景

net.devh

  • コミュニティが作成した長年利用されているサードパーティーライブラリ
  • Spring Boot 1.xと2.xの時代に開始
  • 多くの本番環境で使用され、成熟している
  • Springチームによる開発ではない
  • 保守は続くが、新機能は少ない

Spring gRPC

  • Spring公式プロジェクト
  • Spring Framework 6とSpring Boot 3向けに設計
  • Springチームが管理
  • AOT、Native Image、Observabilityと連携

アーキテクチャー

net.devh

  • NettyベースのgRPCサーバーをSpring方式でラップ
  • @GrpcService@GrpcClientを提供
  • Stubとチャネルを直接管理
@GrpcService
public class HelloServiceImpl extends HelloServiceGrpc.HelloServiceImplBase { ... }

@GrpcClient("myService")
private HelloServiceGrpc.HelloServiceBlockingStub stub;

Spring gRPC

  • Springの概念でgRPCを再構成
  • チャネル抽象化、サーバー抽象化、Bean設定を使用
  • Spring AOT、GraalVM、Observabilityなどとの連携を考慮
@Service
class HelloServiceImpl : HelloServiceGrpcKt.HelloServiceCoroutineImplBase()

@Bean
fun helloStub(factory: GrpcChannelFactory) =
    HelloServiceGrpcKt.HelloServiceCoroutineStub(factory.createChannel("local"))

運用上の比較

項目 net.devh Spring gRPC
成熟度 非常に高い 初期段階
企業での利用 多い 増加中
Spring Boot 3とAOT 一部制限 完全対応
ドキュメント 主にGitHub wiki Spring公式ドキュメント
拡張性 従来のgRPC方式 Springネイティブな拡張

どちらを選ぶべきか

即時の安定性が重要ならnet.devh

  • 既存システムや大規模プロジェクトとの高い互換性
  • 豊富なドキュメントと例
  • 実績のある方式

最新のSpring技術を使うならSpring gRPC

  • Spring Boot 3.xとSpring Framework 6.x向けに最適化
  • Springエコシステムと密接に進化
  • AOTとGraalVM Native Imageに適している

混在させない

サーバーとStubの管理方式が異なるため、同じアプリケーションで共存させないでください。

まとめ

net.devh

  • サードパーティー
  • 成熟して安定
  • Spring Boot 1.xと2.x時代のソリューション

Spring gRPC

  • Spring公式プロジェクト
  • Boot 3、Spring 6、Native、Observabilityなどの現代的機能をサポート
  • Springにおける標準gRPCソリューションになる可能性が高い