建置 Spring Boot 微服務

已完成

在本課程模組中,我們將建置一個啟用雲端功能的 Spring Boot 微服務。 其會使用 Spring Cloud 服務登錄和 Spring Cloud 設定伺服器,這兩者都受到 Azure Spring 應用程式所管理和支援。

此微服務會使用 Spring Data JPA 從適用於 MySQL 的 Azure 資料庫資料庫讀取和寫入資料:

  • Azure Spring 應用程式會自動將該資料庫繫結至我們的服務。
  • 適用於 MySQL 的 Azure 資料庫是在 Azure 上執行的 MySQL 完全受控版本。

在 Azure Spring 應用程式上建立應用程式

在 Azure Spring 應用程式執行個體中建立特定的 todo-service 應用程式:

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

建立 MySQL 資料庫

現在請建立適用於 MySQL 的 Azure 資料庫:

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 文件:請複製該文件中的密碼屬性,稍後會用到。

現在,在該伺服器中建立 todos 資料庫,並開放其防火牆,以便 Azure Spring 應用程式存取:

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 應用程式可以自動將我們建立的 MySQL 資料庫繫結至我們的微服務。

  1. 瀏覽至您的 Azure Spring 應用程式執行個體。

  2. 選取應用程式

  3. 選取 [todo-service] 應用程式。

  4. 選取 [服務連接器],然後選擇 [+ 建立]

    1. 針對 [服務類型],選取 [DB for MySQL 單一伺服器]
    2. 指定一個連接名稱,例如 mysql_todos
    3. 確認已顯示正確的訂用帳戶。
    4. 選擇在上述步驟中所建立的 MySQL 伺服器。
    5. 選取稍早所建立的 MySQL 資料庫。
    6. 選取 [SpringBoot] 作為 [用戶端類型]。
    7. 選取底部的 [下一步:驗證] 按鈕。
  5. [驗證] 頁面上,確認已選取 [連接字串]

  6. 選取 [繼續使用...資料庫認證],並填寫使用者名稱和密碼欄位。 使用者名稱為 "spring",而密碼是我們稍早複製的密碼屬性。

    注意

    如果您忘記密碼,您可以使用 az mysql server update -n ${SPRING_CLOUD_NAME}-mysql -g "$RESOURCE_GROUP_NAME" -p <new-password> 來重設密碼

  7. 確認已選取 [設定防火牆規則以啟用對目標服務的存取權]

  8. 按一下 [下一步:檢閱 + 建立]

  9. [驗證通過] 訊息出現之後,選取 [建立] 按鈕以建立服務連接器。

建立 Spring Boot 微服務

現在我們已佈建 Azure Spring 應用程式執行個體並設定好服務繫結,接下來我們要取得程式碼以讓 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 -

注意

我們使用 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;
    }
}

然後,建立 Spring Data JPA 存放庫以管理此項目,稱為 TodoRepository

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 應用程式:

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 入口網站中,前往您 Azure Spring 應用程式執行個體中的 [應用程式]。
    1. 確認 todo-service 的 [註冊狀態] 顯示為 0/1。 此資訊顯示其已在 Spring Cloud 服務登錄中正確完成註冊。
    2. 選取 [todo-service] 以取得微服務的詳細資訊。
  2. 複製/貼上所提供的「測試端點」。

您現在可以使用 cURL 來測試端點。 測試命令看起來應該像這樣:

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

此命令的結果應是之前插入 MySQL 資料庫的三個項目:

[{"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 應用程式,您必須在應用程式中做出哪些變更?

2.

預設情況下,您要如何在您的微服務部署後存取它?