教程:使用与 Azure 数据库的无密码连接将 Spring 应用程序部署到 Azure Spring Apps

本文介绍如何在部署到 Azure Spring Apps 的 Spring Boot 应用程序中使用与 Azure 数据库的无密码连接。

在本教程中,你将使用 Azure 门户或 Azure CLI 完成以下任务。 以下过程介绍了这两种方法。

  • 预配 Azure Spring Apps 实例。
  • 生成应用并将其部署到 Azure Spring Apps。
  • 使用托管标识运行连接到 Azure 数据库的应用。

注意

本教程不适用于 R2DBC。

先决条件

准备工作环境

首先,使用以下命令设置一些环境变量:

export AZ_RESOURCE_GROUP=passwordless-tutorial-rg
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demodb
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_SPRING_APPS_SERVICE_NAME=<YOUR_AZURE_SPRING_APPS_SERVICE_NAME>
export AZ_SPRING_APPS_APP_NAME=hellospring
export AZ_DB_ADMIN_USERNAME=<YOUR_DB_ADMIN_USERNAME>
export AZ_DB_ADMIN_PASSWORD=<YOUR_DB_ADMIN_PASSWORD>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>

使用以下值替换占位符,在本文中将使用这些值:

  • <YOUR_DATABASE_SERVER_NAME>:Azure 数据库服务器的名称,在 Azure 中应是唯一的。
  • <YOUR_AZURE_REGION>:要使用的 Azure 区域。 默认情况下可以使用 eastus,但我们建议你配置一个离居住位置更近的区域。 可以使用 查看可用区域 az account list-locations的完整列表。
  • <YOUR_AZURE_SPRING_APPS_SERVICE_NAME>:Azure Spring Apps 实例的名称。 该名称必须为 4 到 32 个字符,只能包含小写字母、数字及连字符。 服务名称的第一个字符必须是字母,最后一个字符必须是字母或数字。
  • <AZ_DB_ADMIN_USERNAME>:Azure 数据库服务器的管理员用户名。
  • <AZ_DB_ADMIN_PASSWORD>:Azure 数据库服务器的管理员密码。
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>:用户分配的托管标识服务器的名称,该名称在整个 Azure 中应唯一。

预配 Azure Spring Apps 的实例

使用以下步骤预配 Azure Spring Apps 实例。

  1. 使用以下命令通过 Azure Spring Apps 扩展更新 Azure CLI:

    az extension update --name spring
    
  2. 使用以下命令登录到 Azure CLI 并选择活动订阅:

    az login
    az account list --output table
    az account set --subscription <name-or-ID-of-subscription>
    
  3. 使用以下命令创建资源组以包含 Azure Spring Apps 服务和 Azure Spring Apps 服务的实例:

    az group create \
        --name $AZ_RESOURCE_GROUP \
        --location $AZ_LOCATION
    az spring create \
        --resource-group $AZ_RESOURCE_GROUP \
        --name $AZ_SPRING_APPS_SERVICE_NAME
    

创建 Azure 数据库实例

使用以下步骤预配 Azure 数据库实例。

  1. 使用以下命令创建 Azure Database for MySQL 服务器:

    az mysql flexible-server create \
        --resource-group $AZ_RESOURCE_GROUP \
        --name $AZ_DATABASE_SERVER_NAME \
        --location $AZ_LOCATION \
        --admin-user $AZ_DB_ADMIN_USERNAME \
        --admin-password $AZ_DB_ADMIN_PASSWORD \
        --yes
    

注意

如果未提供 admin-useradmin-password 参数,系统默认将生成默认管理员用户或随机管理员密码。

  1. 使用以下命令创建新数据库:

    az mysql flexible-server db create \
        --resource-group $AZ_RESOURCE_GROUP \
        --database-name $AZ_DATABASE_NAME \
        --server-name $AZ_DATABASE_SERVER_NAME
    

创建分配有公共终结点的应用

使用以下命令创建应用。

az spring app create \
    --resource-group $AZ_RESOURCE_GROUP \
    --service $AZ_SPRING_APPS_SERVICE_NAME \
    --name $AZ_SPRING_APPS_APP_NAME \
    --runtime-version=Java_17
    --assign-endpoint true

连接 Azure Spring Apps 到 Azure 数据库

首先,安装 Azure CLI 的服务连接或无密码扩展:

az extension add --name serviceconnector-passwordless --upgrade

然后,使用以下命令为 Microsoft Entra 身份验证创建用户分配的托管标识。 有关详细信息,请参阅设置 Azure Database for MySQL 灵活服务器的 Microsoft Entra 身份验证

export AZ_IDENTITY_RESOURCE_ID=$(az identity create \
    --name $AZ_USER_IDENTITY_NAME \
    --resource-group $AZ_RESOURCE_GROUP \
    --query id \
    --output tsv)

重要

创建用户分配的标识后,请让“全局管理员”或“特权角色管理员”为此标识授予以下权限:User.Read.AllGroupMember.Read.AllApplication.Read.ALL。 有关详细信息,请参阅 Active Directory 身份验证权限部分。

接下来,使用以下命令创建与数据库的无密码连接。

az spring connection create mysql-flexible \
    --resource-group $AZ_RESOURCE_GROUP \
    --service $AZ_SPRING_APPS_SERVICE_NAME \
    --app $AZ_SPRING_APPS_APP_NAME \
    --target-resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --database $AZ_DATABASE_NAME \
    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID

此服务连接器命令将在后台执行以下任务:

  • 为 Azure Spring Apps 托管的应用 $AZ_SPRING_APPS_APP_NAME 启用系统分配的托管标识。

  • 将 Microsoft Entra 管理员设置为当前已登录用户。

  • 添加为步骤 1 中创建的托管标识命名 $AZ_SPRING_APPS_SERVICE_NAME/apps/$AZ_SPRING_APPS_APP_NAME 的数据库用户,并向此用户授予数据库 $AZ_DATABASE_NAME 的所有权限。

  • 向应用 $AZ_SPRING_APPS_APP_NAME添加两个配置: spring.datasource.urlspring.datasource.username

    注意

    如果看到错误消息 The subscription is not registered to use Microsoft.ServiceLinker,请运行命令 az provider register --namespace Microsoft.ServiceLinker 来注册服务连接器资源提供程序,然后再次运行连接命令。

生成并部署应用

以下步骤介绍如何下载、配置、生成和部署示例应用程序。

  1. 使用以下命令克隆示例代码存储库:

    git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql passwordless-sample
    
  2. 将以下依赖项添加到 pom.xml 文件:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

    此依赖项增加了对 Spring Cloud Azure 初学者的支持。

    注意

    有关如何使用材料清单(BOM)管理 Spring Cloud Azure 库版本的详细信息,请参阅 Spring Cloud Azure 开发人员指南入门部分。

  3. 使用以下命令更新 application.properties 文件:

    cat << EOF > passwordless-sample/src/main/resources/application.properties
    
    logging.level.org.springframework.jdbc.core=DEBUG
    spring.datasource.azure.passwordless-enabled=true
    spring.sql.init.mode=always
    
    EOF
    
  4. 使用以下命令使用 Maven 生成项目:

    cd passwordless-sample
    ./mvnw clean package -DskipTests
    
  5. 使用以下命令为应用部署 目标/demo-0.0.1-SNAPSHOT.jar 文件:

    az spring app deploy \
        --name $AZ_SPRING_APPS_APP_NAME \
        --service $AZ_SPRING_APPS_SERVICE_NAME \
        --resource-group $AZ_RESOURCE_GROUP \
        --artifact-path target/demo-0.0.1-SNAPSHOT.jar
    
  6. 使用以下命令在部署后查询应用状态:

    az spring app list \
        --service $AZ_SPRING_APPS_SERVICE_NAME \
        --resource-group $AZ_RESOURCE_GROUP \
        --output table
    

    应会看到类似于以下示例的输出。

    Name               Location    ResourceGroup    Production Deployment    Public Url                                           Provisioning Status    CPU    Memory    Running Instance    Registered Instance    Persistent Storage
    -----------------  ----------  ---------------  -----------------------  ---------------------------------------------------  ---------------------  -----  --------  ------------------  ---------------------  --------------------
    <app name>         eastus      <resource group> default                                                                       Succeeded              1      2         1/1                 0/1                    -
    

测试应用程序

若要测试应用程序,可使用 cURL。 首先,使用以下命令在数据库中创建新的“todo”项:

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done": "true"}' \
        https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io

此命令返回创建的项,如以下示例所示:

{"id":1,"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done":true}

接下来,使用以下 cURL 请求检索数据:

curl https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io

此命令返回“todo”项列表,包括已创建的项,如以下示例所示:

[{"id":1,"description":"configuration","details":"congratulations, you have set up JDBC correctly!","done":true}]

清理资源

若要清理本教程期间使用的所有资源,请使用以下命令删除资源组:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

后续步骤