Dapr API から Spring Boot REST API にアクセスする (コンテナ編)
こんにちは、@studio_meowtoon です。今回は、WSL Ubuntu 22.04 で Daprを Spring Boot コンテナのサイドカーとして連携する方法を紹介します。
目的
分散アプリケーションの為のランタイム Dapr の理解を深めます。
実現すること
Ubuntu の Docker 環境でコンテナとして起動した Spring Boot アプリに 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 -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
Maven ※ こちらの関連記事からインストール方法をご確認いただけます
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker ※ こちらの関連記事からインストール方法をご確認いただけます
$ docker --version
Docker version 23.0.1, build a5ee5b1
Dapr ※ こちらの関連記事からインストール方法をご確認いただけます
$ dapr --version
CLI version: 1.11.0
Runtime version: 1.11.2
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
作成する Web アプリケーションの仕様
No | エンドポイント | HTTPメソッド | MIME タイプ |
---|---|---|---|
1 | /api/data | GET | application/json |
説明を開きます。
/api/data というエンドポイントに対して HTTP GET リクエストを送信すると、JSON データがレスポンスされるシンプルな Web サービスを実装します。
Dapr ランタイムを削除する
この記事では、docker-compose で立ち上げるコンテナ群で Dapr ランタイムを構成します。
Dapr ランタイムを削除します。
$ dapr uninstall --all
出力
ℹ️ Removing Dapr from your machine...
ℹ️ Removing directory: /home/$USER/.dapr/bin
ℹ️ Removing directory: /home/$USER/.dapr
✅ Dapr has been removed successfully
ランタイムを確認します。
$ dapr --version
CLI version: 1.11.0
Runtime version: n/a
ここまでの手順で、Dapr ランタイムは削除されました。
Hello World を表示する手順
Spring Boot WEBアプリの作成
前回の記事からご確認いただけます。
プロジェクトフォルダに移動します。
※ ~/tmp/hello-spring-dapr をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-dapr
Java アプリをビルドします。
$ mvn clean package
ここまでの手順で、target/app.jar Java アプリが作成されました。
コンテナイメージをビルド
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 2ee39bcf1346 11 seconds ago 278MB
ここまでの手順で、app-hello-spring-boot コンテナイメージが作成されました。
docker-compose.yml の作成
docker-compose.yml ファイルを作成します。
$ vim docker-compose.yml
ファイルの内容
version: '3'
services:
############################
# Spring Boot app + Dapr sidecar
app-spring:
image: app-hello-spring-boot
depends_on:
- redis
- placement
ports:
- "3500:3500"
networks:
- net-hello
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:
- net-hello
############################
# Redis state store
redis:
image: redis:alpine
ports:
- "6380:6379"
networks:
- net-hello
networks:
net-hello:
Dapr を Spring Boot アプリのサイドカーとして設定しており、Spring Boot アプリのコンテナは 3500 番ポートでリッスンしています。
Docker 環境で起動する
コンテナを起動します。
docker-compose がインストールされていない場合、以下のコマンドでインストールします。
$ sudo apt update
$ sudo apt install docker-compose
$ docker-compose up -d
Creating hello-spring-dapr_placement_1 ... done
Creating hello-spring-dapr_redis_1 ... done
Creating hello-spring-dapr_app-spring_1 ... done
Creating hello-spring-dapr_app-spring-dapr_1 ... done
コンテナを確認します。
$ docker ps | grep hello-spring-dapr
865c8eeecc80 daprio/daprd:edge "./daprd --app-id ap…" 42 seconds ago Up 41 seconds hello-spring-dapr_app-spring-dapr_1
5c42585aecb3 app-hello-spring-boot "java -jar app.jar" 43 seconds ago Up 42 seconds 0.0.0.0:3500->3500/tcp, :::3500->3500/tcp, 8080/tcp hello-spring-dapr_app-spring_1
d7fd66f7c573 redis:alpine "docker-entrypoint.s…" 44 seconds ago Up 42 seconds 0.0.0.0:6380->6379/tcp, :::6380->6379/tcp hello-spring-dapr_redis_1
40233d3f74db daprio/dapr "./placement -port 5…" 44 seconds ago Up 42 seconds 0.0.0.0:50006->50006/tcp, :::50006->50006/tcp hello-spring-dapr_placement_1
Dapr API から Spring Boot アプリにアクセスする
別ターミナルからリクエストします。
Spring Boot アプリの api/data エンドポイントを呼び出しています。
$ curl http://localhost:3500/v1.0/invoke/app-hello-spring/method/api/data -w '\n'
出力
{"message":"Hello World!"}
Dapr API から "Hello World!" が取得出来ました。
ここまでの手順で、Dapr を Spring Boot アプリのサイドカーとして設定してコンテナ起動し、 Dapr API から JSON データを取得することが出来ました。
まとめ
- Dapr を含め、コンテナ起動した Spring Boot アプリの REST API を Dapr API 経由で呼び出すことが出来ました。
- この記事の例ではまだ Spring Boot 側のアプリに Dapr への依存関係はありません。
- 今後さらに Spring Boot から Dapr クライアントオブジェクトを操作する方法を学ぶ必要があります。
どうでしたか? WSL Ubuntu で Dapr ランタイムを使用した開発環境が手軽に構築できます。ぜひお試しください。今後も Ubuntu の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推奨コンテンツ