SpringBoot

Spring Boot 3.2 と JDK21で構築するマイクロサービス基盤の全手順

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

前提条件と開発環境の準備

本セクションでは、マイクロサービスをローカルから本番環境まで一貫して動かすために最低限必要なツールと設定方法を解説します。各ツールは公式ドキュメント(2026‑05‑09 時点)に基づいているので、インストール手順でつまずくリスクが低減されます。また、環境変数の確認ポイントも合わせて示すため、作業後に「動作確認済み」かどうかをすぐに判断できます。

必要なツール一覧

以下のツールは いずれか の OS(Windows・macOS・Linux)で共通して利用できるものです。各項目の冒頭に簡単な説明文を入れ、続く箇条書きでインストール手順や確認コマンドを示します。

  • JDK 21
  • Oracle JDK または OpenJDK の公式サイトからダウンロードし、JAVA_HOME を設定してください。
  • java -version21.x.x と表示されればインストール完了です。

  • ビルドツール(Maven 3.9+ / Gradle 8.5+)

  • Maven は mvn -v、Gradle は gradle -v でバージョンを確認できます。Spring Boot 3.2 が要求する最低バージョン以上がインストールされていることを必ずチェックしてください。

  • Docker & Docker Compose

  • Windows/macOS は Docker Desktop、Linux は Docker Engine を利用します。docker versiondocker compose version がそれぞれ表示されれば準備完了です。

  • IDE(統合開発環境)

  • IntelliJ IDEA(Community または Ultimate)、Eclipse IDE for Enterprise Java Developers、VS Code + Java Extension Pack のいずれでも構築可能です。使用する IDE に合わせて「Spring Boot」「Lombok」「MapStruct」等のプラグインを追加してください。

  • Git

  • Config Server が外部リポジトリと連携できるように、git --version が表示されることを確認します。認証が必要なプライベートリポジトリを利用する場合は SSH 鍵や Personal Access Token の設定も忘れずに行ってください。

ポイント
ツールのインストール後は必ずターミナルで echo $PATHecho $JAVA_HOME(Windows は echo %JAVA_HOME%)を実行し、環境変数が正しく反映されているか確認しましょう。


プロジェクト雛形作成と依存関係設定

この章では Spring Initializr で生成したベースプロジェクトに対して、Spring Cloud 2023 系との互換性を保つための BOM 設定や、将来の非推奨化リスクへの対策方法を示します。正しい依存関係の管理はビルドエラー防止だけでなく、マイクロサービス全体のバージョン統一に直結する重要な作業です。

Spring Initializr の使い方

Spring Initializr は Web UI でも REST API でも利用できますが、ここでは最も一般的な GUI 手順を紹介します。
1. https://start.spring.io にアクセスし、以下の項目を設定して ZIP をダウンロードしてください。

項目 推奨値
Project Maven Project(Gradle でも可)
Language Java
Spring Boot 3.2.x (最新リリース)
Packaging Jar
Java 21
  1. Dependencies に次のモジュールを選択します。
  2. Spring Web – REST API の土台
  3. Spring Data JPA – 永続化層
  4. Spring Cloud Discovery Client (Netflix Eureka) – サービスレジストリ(※後述)
  5. Config Server – 外部設定管理
  6. Gateway – API ゲートウェイ
  7. Lombok – ボイラープレート削減
  8. MapStruct – DTO ↔ Entity マッピング

  9. ダウンロードした ZIP を解凍し、IDE で Import すればプロジェクト雛形が完成します。

Spring Cloud 2023.x との互換性と Eureka のサポート状況

Spring Cloud 2023 系は spring-cloud-dependencies BOM によってバージョン管理されます。BOM を導入すると、個別のスターティングパッケージが自動的に適切なバージョンへ固定されるため、依存関係衝突を防げます。

Eureka の非推奨化リスク

  • 公式情報(2026‑04‑30) によれば、spring-cloud-starter-netflix-eureka-client は 2024 年以降も機能的にサポートされていますが、将来的なメンテナンスコスト削減の観点から 「非推奨になる可能性」 が示唆されています。
  • 現時点(2026‑05)では まだ利用可能 であり、既存プロジェクトへの影響はありませんが、長期的なロードマップを考慮すると ConsulZookeeper などの代替ディスカバリサービスへの移行計画を立てることが推奨されます。
  • 詳細は公式リリースノート(Spring Cloud 2023.0.x Release Notes)をご確認ください。

実務的な対策
- pom.xmleureka-client を明示的に記述しつつ、同時に spring-cloud-starter-consul-discovery も依存追加しておくと、コードベースの差分が最小限で済みます。
- アプリケーションプロパティで spring.cloud.discovery.client.simple.instances.* を利用できるようにしておくと、テスト時にローカルモックへ切り替えやすくなります。


コアコンポーネント実装

この章ではマイクロサービス基盤の中核である Eureka ServerConfig ServerAPI Gateway の最小構成コードと必須設定ファイルを示します。各コンポーネントは単体テストが可能なように設計し、後続サービスがシームレスに統合できることを前提にしています。

Eureka サービスレジストリ

Eureka Server は @EnableEurekaServer アノテーションだけで起動できます。以下のコードは 最小構成 ですので、まずはローカルで動作確認してください。

  • 設定ファイルsrc/main/resources/application.yml
    yaml
    server:
    port: 8761

eureka:
client:
register-with-eureka: false # サーバー自身は登録しない
fetch-registry: false # 他のレジストリも取得しない
instance:
hostname: localhost

注意点
Spring Cloud 2023.x では eureka.client.service-url.defaultZone が必須です。クライアント側で正しい URL を設定していないと、起動時に「Eureka server not reachable」の警告が出ます。

クライアント側の基本設定

@EnableDiscoveryClient を付与したサービスは自動的に Eureka に登録されます。

Config Server 設定

Config Server は外部 Git リポジトリと連携させるだけで、プロファイル別設定を即座に配信できます。以下のコードは シンプルな構成 です。

  • 設定例application.yml
    yaml
    server:
    port: 8888

spring:
cloud:
config:
server:
git:
uri: https://github.com/your-org/microservice-config.git
clone-on-start: true # 起動時にリポジトリをクローン
timeout: 5 # タイムアウト秒数(任意)

ベストプラクティス
- プライベートリポジトリの場合は usernamepassword(または PAT)を環境変数で渡す。
- 設定ファイル名は {application}-{profile}.yml 形式に統一し、CI パイプラインで自動生成すると管理が楽になります。

API Gateway 構成

Spring Cloud Gateway は RouteLocatorBuilder による DSL でルーティングとフィルタを定義します。以下は 基本的なルートカスタムロギングフィルタ のサンプルです。

  • gateway の application.yml(CORS とヘルスチェックの例)
    yaml
    spring:
    cloud:
    gateway:
    globalcors:
    corsConfigurations:
    '[/*]':
    allowedOrigins: "
    "
    allowedMethods:
    - GET
    - POST
    - PUT
    - DELETE

management:
endpoints:
web:
exposure:
include: health,info,gateway

補足
複数サービスが増える場合は application.ymlroutes: 配列で一元管理すると可読性が向上します。


コンテナ化・ローカルスタック起動と Kubernetes デプロイ

マイクロサービスを Docker 化し、Docker Compose でローカル環境を再現する手順と、Kind または Minikube を用いた軽量 K8s クラスタへのデプロイ方法を示します。コンテナ化により「動作する環境がどこでも同じ」という保証が得られ、本番リリース前の検証が格段に楽になります。

Dockerfile と Docker Compose(修正版)

Dockerfile は マルチステージビルド を採用し、最終イメージは JDK 21 の JRE だけを残すことでサイズを 150 MB 以下に抑えられます。以下のポイントで以前の誤植を修正しています。

  • WORKDI R → 正しくは WORKDIR
  • ビルドステージとランタイムステージの分離を明示

docker‑compose.yml の例

docker compose up --build を実行すると、4 つのコンテナが同時に起動し、http://localhost:8080/api/products へアクセスできることを確認してください。

Kind / Minikube へのデプロイ手順

ローカル K8s クラスタは Kind(Docker 上で動く軽量クラスター)か Minikube のどちらでも構いません。ここでは Kind を例に、マニフェスト作成からデプロイまでの流れを示します。

  1. クラスタ作成
    bash
    kind create cluster --name ms-demo
    # Minikube なら: minikube start

  2. ローカルイメージのレジストリ登録
    Docker イメージを Kind の内部レジストリにプッシュします。
    bash
    docker tag eureka-server:latest kind.local/eureka-server:latest
    kind load docker-image kind.local/eureka-server:latest --name ms-demo

# 他のサービスも同様にロード

  1. Kubernetes マニフェスト(例)
    k8s/ ディレクトリ配下に deployment.yamlservice.yaml を配置します。

yaml
# k8s/gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway
spec:
replicas: 2
selector:
matchLabels:
app: gateway
template:
metadata:
labels:
app: gateway
spec:
containers:
- name: gateway
image: kind.local/gateway:latest
ports:
- containerPort: 8080


apiVersion: v1
kind: Service
metadata:
name: gateway-svc
spec:
type: NodePort
selector:
app: gateway
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 任意のポート

  1. マニフェスト適用
    bash
    kubectl apply -f k8s/

  2. 動作確認
    bash
    kubectl get pods -o wide
    curl http://localhost:30080/api/products # NodePort 経由でアクセス

Tip:Ingress を利用すれば、外部からの HTTPS アクセスやドメイン名ベースのルーティングが可能です。ingress-nginx コントローラを追加すると、本番に近い構成でテストできます。


テスト戦略・CI/CD・運用のベストプラクティス

マイクロサービスは 単体テスト統合テストパフォーマンステスト を段階的に実施し、さらに自動化された CI/CD パイプラインでデリバリーを高速化します。ここでは Testcontainers を用いた本物コンテナ環境でのテスト例と、GitHub Actions によるフルパイプライン、そして運用段階で重要になる Observability と Security のポイントをまとめます。

統合テスト(Testcontainers)

Testcontainers は Docker コンテナを起動したまま JUnit テストを実行できるため、Eureka や Config Server など外部依存サービスの挙動を 実環境に近い形で検証 できます。以下は product-service の統合テスト例です。

  • ポイント
  • @DynamicPropertySource によりテスト実行時に Eureka の URL が自動で注入されます。
  • テストは mvn verify(または ./gradlew check)だけで完結し、CI 上でも同様に動作します。

GitHub Actions パイプライン

以下は ビルド → テスト → Docker イメージ作成 → Kind デプロイ を自動化したサンプルです。GitHub の main ブランチへの push がトリガーになります。

  • ベストプラクティス
  • testcontainers 用に Docker デーモンを有効化し、CI 環境でもローカルと同等のテストが走るようにする。
  • イメージは GitHub Container Registry(GHCR)へプッシュし、K8s クラスタで直接参照できるように kind load を実行する。

Observability とパフォーマンスチューニング

項目 推奨設定・ツール
JVM オプション -XX:MaxRAMPercentage=75 -XX:+UseZGC -Djava.security.egd=file:/dev/./urandom(JDK 21 の ZGC は低レイテンシに有効)
メトリクス収集 spring-boot-starter-actuator + micrometer-registry-prometheus を依存追加し、/actuator/prometheus エンドポイントを公開。Grafana で可視化するとボトルネックが把握しやすい。
ログ集約 Logback の JSON レイアウト+EFK(Elasticsearch‑Fluentd‑Kibana)または Loki‑Promtail‑Grafana スタックを採用。サービス間の相関検索に役立つ。
リソース制限 Docker Compose では deploy.resources.limits、K8s では resources.requests/limits を明示的に設定し、CPU・メモリ不足による OOM キラーを防止。
ヘルスチェック Spring Boot Actuator の health エンドポイントを K8s の Liveness/Readiness Probe にマッピング。障害時の自動再起動が可能になる。

セキュリティ考慮事項

  1. 通信暗号化
  2. Service‑to‑Service 間は Spring Cloud LoadBalancer が内部で HTTP を使用するため、必ず gateway の外部エンドポイントだけ HTTPS にし、Ingress で TLS 終端を行う。
  3. 認可・認証
  4. Spring Security と OAuth2 Resource Server(Keycloak 等)を組み合わせ、Gateway でトークン検証を集中させると各サービスの実装がシンプルになる。
  5. コンテナイメージの脆弱性スキャン
  6. GitHub Actions の trivy アクションや Dependabot を利用し、ビルド時に CVE を自動検出・通知するパイプラインを構築する。

まとめ:上記の Observability と Security の設定は「開発完了」だけでなく「運用開始」直後にも必ず実装すべき項目です。早期に組み込むほど、障害対応コストが大幅に削減できます。


まとめ

本稿では Spring Boot 3.2 と JDK 21 を基盤としたマイクロサービスアーキテクチャの全体像を、環境構築 → プロジェクト雛形作成 → コアコンポーネント実装 → コンテナ化・K8s デプロイ → テスト・CI/CD・運用 というフローで体系的に解説しました。特に以下の点が重要です。

項目 キーポイント
環境準備 JDK 21、Docker、IDE の正しいインストールと環境変数設定
依存管理 Spring Cloud 2023.x BOM によるバージョン統一、Eureka の非推奨リスクを認識
コンテナ化 WORKDIR 修正済みのマルチステージ Dockerfile、docker‑compose でローカルスタック再現
K8s デプロイ Kind/Minikube へのイメージロードとマニフェスト管理
CI/CD Testcontainers + GitHub Actions によるフルパイプライン自動化
Observability & Security Actuator+Prometheus、TLS/OAuth2、脆弱性スキャンの導入

次のステップ
1. 本記事の手順でローカルスタックを構築し、すべてのサービスが期待通りに起動することを確認。
2. GitHub リポジトリへコードをプッシュし、CI が自動でビルド・テスト・デプロイできるか検証。
3. 本番環境用に Helm Chart を作成し、実際のクラウド(EKS/GKE 等)へ展開してみる。

この一連の流れを習得すれば、Spring Boot と JDK 21 の最新スタックで スケーラブルかつ保守性の高いマイクロサービス を自信を持って提供できるようになります。ぜひサンプルリポジトリをクローンし、ハンズオン形式で体験してみてください。

スポンサードリンク

-SpringBoot