Spring Boot マイクロサービスをビルドする

完了

このモジュールでは、クラウド対応の Spring Boot マイクロサービスを構築します。 これは、どちらも Azure Spring Apps で管理およびサポートされる Spring Cloud Service レジストリと Spring Cloud Config Server を使用します。

このマイクロサービスは、Spring Data JPA を使用して Azure Database for MySQL データベースとの間で、データの読み書きを行います。

  • Azure Spring Apps は、そのデータベースをサービスに自動的にバインドします。
  • Azure Database for MySQL は、Azure 上で実行されるフル マネージド バージョンの MySQL です。

Azure Spring Apps にアプリケーションを作成する

Azure Spring Apps インスタンスに特定の todo-service アプリケーションを作成します。

az spring app create --name todo-service --resource-group "$RESOURCE_GROUP_NAME" --service "$SPRING_CLOUD_NAME" --runtime-version Java_17

MySQL データベースを作成する

ここで Azure Database for MySQL を作成します。

az mysql server create \
    --name ${SPRING_CLOUD_NAME}-mysql \
    --resource-group "$RESOURCE_GROUP_NAME" \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user "spring"

この操作には数分かかることがあり、JSON ドキュメントが出力されます。そのドキュメント内の password 属性は後で使用するため、コピーしておきます。

次に、そのサーバーに todos データベースを作成し、そのファイアウォールを開いて、Azure Spring Apps からアクセスできるようにします。

az mysql db create \
    --name "todos" \
    --server-name ${SPRING_CLOUD_NAME}-mysql
az mysql server firewall-rule create \
    --name ${SPRING_CLOUD_NAME}-mysql-allow-azure-ip \
    --resource-group "$RESOURCE_GROUP_NAME" \
    --server ${SPRING_CLOUD_NAME}-mysql \
    --start-ip-address "0.0.0.0" \
    --end-ip-address "0.0.0.0"

この操作が完了したら、このワークショップ用に作成したリソース グループに作成されたものを確認できます。

MySQL データベースをアプリケーションにバインドする

Azure Spring Apps により、作成した MySQL データベースをこのマイクロサービスに自動的にバインドできます。

  1. ご使用の Azure Spring Apps インスタンスにアクセスします。

  2. アプリを選択します。

  3. todo-service アプリケーションを選択します。

  4. [サービス コネクタ] を選択し、[+ 作成] を選択します。

    1. [サービスの種類] に、[DB for MySQL 単一サーバー] を選択します。
    2. 接続名を指定します (例: mysql_todos)。
    3. 正しいサブスクリプションが表示されていることを確認します。
    4. 前の手順で作成した MySQL サーバーを選択します。
    5. 前に作成した MySQL データベースを選択します。
    6. [クライアントの種類] として SpringBoot を選択します。
    7. 下部にある [次: 認証] ボタンを選択します。
  5. [認証] ページで、[接続文字列] が選択されていることを確認します。

  6. [続行...データベース資格情報] を選択し、ユーザー名とパスワードのフィールドに入力します。 ユーザー名は "spring" で、パスワードは前にコピーした password 属性です。

    Note

    パスワードを忘れた場合は、az mysql server update -n ${SPRING_CLOUD_NAME}-mysql -g "$RESOURCE_GROUP_NAME" -p <new-password> を使用してパスワードをリセットできます

  7. [Configure firewall rules to enable access to target service] (ターゲット サービスへのアクセスを有効にするようにファイアウォール規則を構成する) が選択されていることを確認します。

  8. [次へ: 確認と作成] をクリックします。

  9. [検証に合格しました] メッセージが表示されたら、[作成] ボタンを選択して サービス コネクタを作成します。

Spring Boot マイクロサービスを作成する

これで、Azure Spring Apps インスタンスをプロビジョニングし、サービス バインドを構成したので、todo-service のコードを準備しましょう。

マイクロサービスを作成するには、コマンド ラインで https://start.spring.io を使用します。

curl https://start.spring.io/starter.tgz -d type=maven-project -d dependencies=web,mysql,data-jpa,cloud-eureka,cloud-config-client -d baseDir=todo-service -d bootVersion=3.1.5.RELEASE -d javaVersion=17 | tar -xzvf -

Note

Spring WebMySQL DriverSpring Data JPAEureka Discovery ClientConfig Client の各コンポーネントを使用します。

Spring Data JPA を使用してデータを管理するための Spring コードを追加する

DemoApplication クラスの横に、Todo JPA エンティティを作成します。

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Todo {

    public Todo() {
    }

    public Todo(String description, boolean done) {
        this.description = description;
        this.done = done;
    }

    @Id
    @GeneratedValue
    private Long id;

    private String description;

    private boolean done;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }
}

次に、このエンティティを管理するために、TodoRepository と呼ばれる Spring Data JPA リポジトリを作成します。

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TodoRepository extends JpaRepository<Todo, Long> {
}

TodoController という Spring MVC コントローラーを追加して、このアプリケーションのコーディングを終了します。

package com.example.demo;

import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import java.util.Arrays;

@RestController
public class TodoController {

    private final TodoRepository todoRepository;

    public TodoController(TodoRepository todoRepository) {
        this.todoRepository = todoRepository;
    }

    @PostConstruct
    public void init() {
        todoRepository.saveAll(Arrays.asList(
                new Todo("First item", true),
                new Todo("Second item", true),
                new Todo("Third item", false)));
    }

    @GetMapping("/")
    public Iterable<Todo> getTodos() {
        return todoRepository.findAll();
    }
}

データベース テーブルを作成するように Spring Boot を構成する

アプリケーションの配置時にデータベース テーブルが自動的に生成されるようにするには、src/main/resources/application.properties 構成ファイルに次の行を追加します。

spring.jpa.hibernate.ddl-auto=create-drop

アプリケーションをデプロイする

これで、"todo-service" プロジェクトをビルドし、Azure Spring Apps に送信できるようになりました。

cd todo-service
./mvnw clean package -DskipTests
az spring app deploy --name todo-service --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" --artifact-path target/demo-0.0.1-SNAPSHOT.jar
cd ..

何らかの問題が発生したときに、アプリケーションのログを確認する場合は、az spring app logs コマンドを使用できます。

az spring app logs --name todo-service --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" -f

クラウドでプロジェクトをテストする

アプリケーションがデプロイされたので、次にそれをテストします。

  1. Azure portal で、Azure Spring Apps インスタンスの [アプリ] に移動します。
    1. todo-gateway登録状態0/1 になっていることを確認します。 この情報は、Spring Cloud Service Registry に正しく登録されていることを示しています。
    2. todo-service を選択し、マイクロサービスの詳細情報を取得します。
  2. 用意されている "テスト エンドポイント" をコピーして貼り付けます。

これで、cURL を使用してエンドポイントをテストできます。 テスト コマンドは次のようになります。

curl https://primary:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX@azure-spring-cloud-workshop.test.azuremicroservices.io/todo-service/default/

そして、このコマンドの結果は、MySQL データベースに前に挿入された 3 つの項目になります。

[{"id":"1","description":"First item","done":true},{"id":"2","description":"Second item","done":true},{"id":"3","description":"Third item","done":false}]

知識を確認

1.

Spring Boot マイクロサービスを Azure Spring Apps にデプロイするには、アプリケーションで何を変更する必要がありますか?

2.

既定で、デプロイ後にマイクロサービスにアクセスするにはどうすればよいですか?