Dapr API から Spring Boot REST API にアクセスする (シンプル編)

# Dapr API から Spring Boot REST API にアクセスする (シンプル編)

こんにちは、@studio_meowtoon です。今回は、WSL Ubuntu 22.04 で　Dapr ランタイムと Spring Boot アプリを連携する方法を紹介します。
![spring-boot_with_dapr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/96405024-53a8-3626-3833-0c13340693ec.png)

## 目的

分散アプリケーションの為のランタイム [Dapr](https://docs.dapr.io/concepts/overview/) の理解を深めます。  

## 実現すること

Ubuntu の Docker 環境で Spring Boot アプリに Dapr API からアクセスするシンプルな例を実装します。

## 開発環境

+ Windows 11 Home 22H2 を使用しています。  

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
```

Java JDK [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/4d11e94a2389758759cd)

```sh
$ 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 [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/f4cdc4039158153365fb)

```sh
$ 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 [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/3bceee25ac67cc73ebbe)

```sh
$ docker --version
Docker version 23.0.1, build a5ee5b1
```

Dapr [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/a00f2802a171959b5728)

```sh
$ dapr --version
CLI version: 1.11.0
Runtime version: 1.11.2
```

</details>

※ この記事では基本的に Ubuntu のターミナルで操作を行います。

## 作成する Web アプリケーションの仕様

|No|エンドポイント|HTTPメソッド|MIME タイプ|
|:--|:--|:--|:--|
|1|/api/data|GET|application/json|

<details>
<summary>説明を開きます。</summary>

:::note info
**/api/data** という**エンドポイント**に対して **HTTP GET** リクエストを送信すると、**JSON データ**がレスポンスされるシンプルな Web サービスを実装します。
:::

</details>

## Hello World を表示する手順

### Spring Boot アプリの作成

こちらの関連記事からご確認いただけます。

https://qiita.com/studio_meowtoon/items/37ac0082a3228e4de570

#### プロジェクトフォルダの作成

プロジェクトフォルダを作成します。
※ ~/tmp/hello-spring-dapr をプロジェクトフォルダとします。

```sh
$ mkdir -p ~/tmp/hello-spring-dapr
$ cd ~/tmp/hello-spring-dapr
```

#### アプリケーションクラスの作成

:::note warn
構成を単純にする為に全ての要素を記述しています。 
:::

```sh
$ mkdir -p src/main/java/com/example/springdapr
$ vim src/main/java/com/example/springdapr/Application.java
```

ファイルの内容

```java:Application.java
package com.example.springdapr;

import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
@RequestMapping("/api")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @GetMapping("/data")
    public Map<String, String> getData() {
        Map<String, String> map = Map.of("message", "Hello World!");
        return map;
    }
}
```

#### pom.xml の作成

```sh
$ vim pom.xml
```

ファイルの内容

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>hello-spring-dapr</artifactId>
    <version>1.0</version>
    <name>hello-spring-dapr</name>

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
```

#### Spring Boot アプリだけで実行する

Java アプリをビルドします。

```sh
$ mvn clean package
```

アプリを起動します。
※ アプリを停止するときは ctrl + C を押します。

```sh
$ mvn spring-boot:run
```

別ターミナルからコマンドで確認します。

```sh
$ curl http://localhost:8080/api/data -w '\n'
```

出力
```
{"message":"Hello World!"}
```

:::note info
ここまでの手順で、ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
:::

:::note warn
ここで、Spring Boot アプリを一旦停止します。
:::

#### Dapr ランタイムを起動

Dapr ランタイムについては前回の記事でご確認いただけます。

https://qiita.com/studio_meowtoon/items/a00f2802a171959b5728

Dapr バーション確認  

```sh
$ dapr --version
CLI version: 1.11.0
Runtime version: 1.11.2
```

Dapr ランタイム起動

:::note warn  
ここでは Spring Boot アプリのプロジェクトフォルダルートで実行しています。  
:::

:::note alert
この記事の例では、Dapr ランタイムが Docker で動作しています。この場合、Docker サービスの起動が必要です。
:::

```sh
$ dapr run \
    --app-id hello-spring-dapr \
    --app-port 8080 \
    --dapr-http-port 3500 \
    -- java -jar target/app.jar
```

|No |オプション|値|説明|
|:--|:--|:--|:--|
|1  |--app-id        |hello-spring-dapr|Dapr ランタイムでのアプリの識別名<br/>※ この例ではSpring Boot 側に特に設定ファイルは必要ありません。|
|2  |--app-port      |8080             |Spring Boot アプリがリッスンするポート番号|
|3  |--dapr-http-port|3500             |Dapr ランタイムがリッスンするポート番号|
|4  |-- java -jar    |target/app.jar   |Spring Boot アプリの jar ファイルを同時に実行します。|

#### Dapr API から Spring Boot アプリにアクセスする

別ターミナルからリクエストします。 

:::note info
Spring Boot アプリの **api/data** エンドポイントを呼び出しています。  
:::

```sh
$ curl http://localhost:3500/v1.0/invoke/hello-spring-dapr/method/api/data -w '\n'
```

出力

```
{"message":"Hello World!"}
```

Dapr API から "Hello World!" が取得出来ました。  

:::note info
ここまでの手順で、Dapr ランタイム経由で Spring Boot アプリを起動し、 Dapr API から JSON データを取得することが出来ました。
:::

## まとめ

+ Spring Boot アプリの REST API を Dapr API 経由で呼び出すことが出来ました。
+ この記事の例ではまだ Spring Boot 側のアプリに Dapr への依存関係はありません。
+ 今後さらに Spring Boot から Dapr クライアントオブジェクトを操作する方法を学ぶ必要があります。

どうでしたか？ WSL Ubuntu で Dapr ランタイムを使用した開発環境が手軽に構築できます。ぜひお試しください。今後も Ubuntu の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

## 推奨コンテンツ

https://qiita.com/studio_meowtoon/items/38d2632f3851cb2f89e1

## 参考資料

+ [Dapr SDK Java](https://docs.dapr.io/developing-applications/sdks/java/)