生成 Spring Boot 微服务

已完成

在本模块中,我们将生成一个启用云的 Spring Boot 微服务。 它使用 Spring Cloud 服务注册表和 Spring Cloud Config Server,两者均由 Azure Spring Apps 管理和支持。

此微服务将使用 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”,密码则是之前复制的密码属性。

    注意

    如果忘记了密码,则可以使用 az mysql server update -n ${SPRING_CLOUD_NAME}-mysql -g "$RESOURCE_GROUP_NAME" -p <new-password> 重置密码

  7. 验证是否选择了“配置防火墙规则以启用对目标服务的访问权限”

  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 -

注意

我们将使用 Spring WebMySQL DriverSpring Data JPAEureka Discovery ClientConfig Client 组件。

添加 Spring 代码以使用 Spring Data JPA 管理数据

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 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 门户中,转到 Azure Spring Apps 实例中的“应用”。
    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 Apps,你需要在应用程序中进行哪些更改?

2.

默认情况下,如果在部署微服务后对其进行访问?