Spring Boot REST API に Dapr API からアクセスする手順 (コンテナ編)
目的
分散アプリケーションの為のランタイム Dapr の理解を深めます。
実現すること
Ubuntu の Docker 環境でコンテナとして起動した Spring Boot WEBアプリに Dapr API からアクセスするシンプルな例を実装します。
※ Spring Boot REST API に Dapr API からアクセスする手順 (基本編) 記事の続きになります。
開発環境
- Windows 11 Home 22H2 を使用しています。
- WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版)
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ 最小構成 Java JDK の導入と Hello World!
$ java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
Maven ※ 最小構成 Maven の導入と Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker Desktop
Version 4.16.3 (96739)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.15.1
$ dapr --version
CLI version: 1.10.0
Runtime version: 1.10.0
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
Dapr ランタイムを削除する
※ これから docker-compose で立ち上げるコンテナ群で Dapr ランタイムが構成されます。
ランタイムの削除
$ dapr uninstall --all
ランタイムの確認
$ dapr --version
CLI version: 1.10.0
Runtime version: n/a
※ ランタイムは削除されました。
"Hello World" を表示する手順
Spring Boot WEBアプリの作成
プロジェクトフォルダに移動
※ ~/tmp/hello-spring-dapr をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-dapr
Java アプリビルド
ビルド
※ target/app.jar が作成されます。
$ mvn clean install
Docker イメージビルド
Dockerfile 作成
$ vim Dockerfile
ファイルの内容
FROM adoptopenjdk/openjdk11:jdk-11.0.11_9-alpine-slim
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
ビルド
$ docker build -t app-hello-spring-boot .
確認
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest 10c6cdc26e44 52 seconds ago 278MB
app-hello-spring-boot イメージが作成されました。
docker-compose.yml の作成
$ vim docker-compose.yml
ファイルの内容
version: '3'
services:
############################
# Spring Boot app
app-spring:
image: app-hello-spring-boot
depends_on:
- redis
- placement
ports:
- "3500:3500"
networks:
- hello-dapr
############################
# Dapr sidecar
app-spring-dapr:
image: daprio/daprd:edge
command: [
"./daprd",
"--app-id", "app-hello-spring",
"--app-port", "8080",
"--dapr-http-port", "3500",
"--dapr-grpc-port", "50051",
"--placement-host-address", "placement:50006",
"--components-path", "/components"
]
volumes:
- "./components/:/components"
depends_on:
- app-spring
network_mode: "service:app-spring"
############################
# Dapr placement service
placement:
image: daprio/dapr
command: ["./placement", "-port", "50006"]
ports:
- "50006:50006"
networks:
- hello-dapr
############################
# Redis state store
redis:
image: redis:alpine
ports:
- "6380:6379"
networks:
- hello-dapr
networks:
hello-dapr:
※ ポイント: Dapr を Spring Boot アプリのサイドカーとして設定しており、Spring Boot アプリのコンテナが 3500 番ポートでリッスンしています。
Docker 環境で起動
コンテナ起動
$ docker-compose up -d
[+] Running 5/5
⠿ Network hello-spring-dapr_hello-dapr Created
⠿ Container hello-spring-dapr-redis-1 Started
⠿ Container hello-spring-dapr-placement-1 Started
⠿ Container hello-spring-dapr-app-spring-1 Started
⠿ Container hello-spring-dapr-app-spring-dapr-1 Started
コンテナ確認
$ docker ps | grep hello-spring-dapr
f78ff3dd48de daprio/daprd:edge "./daprd -app-id app…" hello-spring-dapr-app-spring-dapr-1
1bbee3389e16 app-hello-spring-boot "java -jar app.jar" 0.0.0.0:3500->3500/tcp, 8080/tcp hello-spring-dapr-app-spring-1
40b98ebf6f15 redis:alpine "docker-entrypoint.s…" 0.0.0.0:6380->6379/tcp hello-spring-dapr-redis-1
6b02fc63b165 daprio/dapr "./placement -port 5…" 0.0.0.0:50006->50006/tcp hello-spring-dapr-placement-1
※ Docker Desktop を確認するとコンテナとして起動しています。
リクエストして確認
$ curl -X GET http://localhost:3500/v1.0/invoke/app-hello-spring/method/hello
Hello World!
独自にコンテナ起動した Dapr API から "Hello World!" が取得出来ました。
まとめ
- Dapr を含め、コンテナ起動した Spring Boot アプリの REST API を Dapr API 経由で呼び出すことが出来ました。
- この記事の例ではまだ Spring Boot 側のアプリに Dapr への依存関係はありません。
- 今後さらに Spring Boot から Dapr クライアントオブジェクトを操作する方法を学ぶ必要があります。