使用以下步骤从 Dapr API 访问 Spring Boot REST API(容器版)
使用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 –version
WSL 版本:1.0.3.0
内核版本:5.15.79.1
WSLg 版本:1.0.47Ubuntu
$ lsb_release -a
没有可用的 LSB 模块。
发行商 ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
版本: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
版本 4.16.3 (96739)
$ docker –version
Docker 版本 20.10.22, build 3a2c30b
$ docker-compose –version
Docker Compose 版本 v2.15.1
Dapr ※ 安装 Dapr CLI 的步骤
$ dapr –version
CLI 版本:1.10.0
运行时版本: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 应用程序的 sidecar,并且 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 クライアントオブジェクトを操作する方法を学ぶ必要があります。
公式参考资料
- Dapr SDK Java