教程:使用与 Azure 数据库的无密码连接将 Spring 应用程序部署到 Azure Spring Apps
本文介绍如何在部署到 Azure Spring Apps 的 Spring Boot 应用程序中使用与 Azure 数据库的无密码连接。
在本教程中,你将使用 Azure 门户或 Azure CLI 完成以下任务。 以下过程介绍了这两种方法。
- 预配 Azure Spring Apps 实例。
- 生成应用并将其部署到 Azure Spring Apps。
- 使用托管标识运行连接到 Azure 数据库的应用。
注意
本教程不适用于 R2DBC。
先决条件
- Azure 订阅。 如果还没有此订阅,请在开始之前创建一个免费帐户。
- 需要 Azure CLI 2.45.0 或更高版本。
- Azure Spring Apps 扩展。 可以使用以下命令安装扩展:
az extension add --name spring
- Java 开发工具包(JDK)版本 8、11 或 17。
- Git 客户端。
- 用来测试功能的 cURL 或类似的 HTTP 实用工具。
- 如果选择运行 Azure Database for MySQL,则 MySQL 命令行客户端。 可以使用常用的客户端工具 mysql.exe 命令行工具通过 Azure Cloud Shell 连接到服务器。 或者,可以在本地环境中使用
mysql
命令行。 - 如果选择运行 Azure SQL 数据库,则 ODBC Driver 18 for SQL Server。
准备工作环境
首先,使用以下命令设置一些环境变量:
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 实例。
使用以下命令通过 Azure Spring Apps 扩展更新 Azure CLI:
az extension update --name spring
使用以下命令登录到 Azure CLI 并选择活动订阅:
az login az account list --output table az account set --subscription <name-or-ID-of-subscription>
使用以下命令创建资源组以包含 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 数据库实例。
使用以下命令创建 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-user
或 admin-password
参数,系统默认将生成默认管理员用户或随机管理员密码。
使用以下命令创建新数据库:
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.All
、GroupMember.Read.All
和 Application.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.url
和spring.datasource.username
。注意
如果看到错误消息
The subscription is not registered to use Microsoft.ServiceLinker
,请运行命令az provider register --namespace Microsoft.ServiceLinker
来注册服务连接器资源提供程序,然后再次运行连接命令。
生成并部署应用
以下步骤介绍如何下载、配置、生成和部署示例应用程序。
使用以下命令克隆示例代码存储库:
git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql passwordless-sample
将以下依赖项添加到 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 开发人员指南的入门部分。
使用以下命令更新 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
使用以下命令使用 Maven 生成项目:
cd passwordless-sample ./mvnw clean package -DskipTests
使用以下命令为应用部署 目标/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
使用以下命令在部署后查询应用状态:
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