你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用无密码连接从 Java JBoss EAP 应用服务连接到 MySQL 数据库

Azure 应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。 它还为应用提供托管标识,这是一项统包解决方案,可以确保安全访问 Azure Database for PostgreSQL 和其他 Azure 服务。 应用服务中的托管标识可以让应用更安全,因为不需在应用中存储机密,例如环境变量中的凭据。

本教程介绍如何执行下列操作:

  • 创建 MySQL 数据库。
  • 使用 WAR 包将示例 JBoss EAP 应用部署到 Azure 应用服务。
  • 将 Spring Boot Web 应用程序配置为将 Microsoft Entra 身份验证与 MySQL 数据库配合使用。
  • 使用服务连接器通过托管标识连接到 MySQL 数据库。

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

先决条件

克隆示例应用并准备存储库

在终端中运行以下命令,以克隆示例存储库并设置示例应用环境。

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/

创建 Azure Database for MySQL

执行以下步骤,在订阅中创建 Azure Database for MySQL 资源。 Spring Boot 应用会在运行时连接到此数据库并存储自身的数据,以便无论你在何处运行应用程序,它都会保存应用程序状态。

  1. 登录到 Azure CLI,(可选)如果有多个订阅连接到登录凭据,请设置订阅。

    az login
    az account set --subscription <subscription-ID>
    
  2. 创建 Azure 资源组。

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. 创建 Azure Database for MySQL 服务器。 该服务器是使用管理员帐户创建的,但它不会被使用,因为我们将使用 Microsoft Entra 管理员帐户来执行管理任务。

    export MYSQL_ADMIN_USER=azureuser
    
    # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export MYSQL_ADMIN_PASSWORD=<admin-password>
    export MYSQL_HOST=<mysql-host-name>
    
    # Create a MySQL server.
    az mysql flexible-server create \
        --name $MYSQL_HOST \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --admin-user $MYSQL_ADMIN_USER \
        --admin-password $MYSQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --tier Burstable \
        --sku-name Standard_B1ms \
        --storage-size 32
    
  4. 创建应用程序的数据库。

    export DATABASE_NAME=checklist
    
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    

创建应用服务

在 Linux 上创建 Azure 应用服务资源。 JBoss EAP 需要高级 SKU。

export APPSERVICE_PLAN=<app-service-plan>
export APPSERVICE_NAME=<app-service-name>

# Create an App Service plan
az appservice plan create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_PLAN \
    --location $LOCATION \
    --sku P1V3 \
    --is-linux

# Create an App Service resource.
az webapp create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --plan $APPSERVICE_PLAN \
    --runtime "JBOSSEAP:7-java8"

使用标识连接来连接 MySQL 数据库

接下来,使用服务连接器连接数据库。

  1. 为 Azure CLI 安装服务连接器无密码扩展:

    az extension add --name serviceconnector-passwordless --upgrade
    
  2. 使用以下命令为 Microsoft Entra 身份验证创建用户分配的托管标识。 有关详细信息,请参阅设置 Azure Database for MySQL 灵活服务器的 Microsoft Entra 身份验证

    export USER_IDENTITY_NAME=<your-user-assigned-managed-identity-name>
    export IDENTITY_RESOURCE_ID=$(az identity create \
        --name $USER_IDENTITY_NAME \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    
  3. 让全局管理员或特权角色管理员向新的用户分配的标志授予以下权限:User.Read.AllGroupMember.Read.AllApplication.Read.ALL 有关详细信息,请参阅 Active Directory 身份验证权限部分。

  4. 使用服务连接器将应用连接到具有系统分配的托管标识的 MySQL 数据库。 要进行此连接,请运行 az webapp connection create 命令。

    az webapp connection create mysql-flexible \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --target-resource-group $RESOURCE_GROUP \
        --server $MYSQL_HOST \
        --database $DATABASE_NAME \
        --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
        --client-type java
    

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

    • 为 Azure 应用服务托管的应用 $APPSERVICE_NAME 启用系统分配的托管标识。

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

    • 在步骤 1 中为系统分配的托管标识添加数据库用户,并将数据库 $DATABASE_NAME 的所有权限授予此用户。 可以从上一命令输出的连接字符串中获取用户名。

    • 在名为 AZURE_MYSQL_CONNECTIONSTRING 的应用中将连接字符串添加到“应用设置”。

      注意

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

部署应用程序

按照以下步骤在数据库中准备数据并部署应用程序。

创建数据库架构

  1. 打开防火墙,以允许从当前 IP 地址进行连接。

    # Create a temporary firewall rule to allow connections from your current machine to the MySQL server
    export MY_IP=$(curl http://whatismyip.akamai.com)
    az mysql flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect \
        --start-ip-address ${MY_IP} \
        --end-ip-address ${MY_IP}
    
  2. 连接到数据库并创建表。

    export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com
    export CURRENT_USER=$(az account show --query user.name --output tsv)
    export RDBMS_ACCESS_TOKEN=$(az account get-access-token \
        --resource-type oss-rdbms \
        --output tsv \
        --query accessToken)
    mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  3. 移除临时的防火墙规则。

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

部署应用程序

  1. 更新“应用设置”中的连接字符串。

    获取由服务连接器生成的连接字符串,并添加无密码身份验证插件。 启动脚本中会引用此连接字符串。

    export PASSWORDLESS_URL=$(\
        az webapp config appsettings list \
            --resource-group $RESOURCE_GROUP \
            --name $APPSERVICE_NAME \
        | jq -c '.[] \
        | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \
        | .value' \
        | sed 's/"//g')
    # Create a new environment variable with the connection string including the passwordless authentication plugin
    export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin'
    az webapp config appsettings set \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
    
  2. 示例应用包含可生成 WAR 文件的 pom.xml 文件。 运行以下命令以生成应用。

    mvn clean package -DskipTests
    
  3. 将 WAR 和启动脚本部署到应用服务。

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/ROOT.war \
        --type war
    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \
        --type startup
    

测试示例 Web 应用

运行以下命令以测试应用程序。

export WEBAPP_URL=$(az webapp show \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --query defaultHostName \
    --output tsv)

# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist

# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item

# Get all lists
curl https://${WEBAPP_URL}/checklist

# Get list 1
curl https://${WEBAPP_URL}/checklist/1

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在 Cloud Shell 中运行以下命令删除资源组:

az group delete --name myResourceGroup

此命令可能需要花费一点时间运行。

下一步

在开发人员指南中详细了解在 Linux 上的应用服务中运行 Java 应用。