你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用 Linux 上的 Azure 应用服务和 MySQL 生成 JBoss Web 应用
本教程介绍如何在连接到 MySQL 数据库的 Azure 应用服务中生成、配置和部署安全 JBoss 应用程序(使用 Azure Database for MySQL)。 Azure 应用服务是一种可缩放程度高、支持自修补的 Web 托管服务,可轻松地在 Windows 或 Linux 上部署应用。 完成本教程后,Linux 上的 Azure 应用服务中将会运行一个 JBoss 应用。
本教程介绍如何执行下列操作:
- 为 Azure 应用服务和 Azure Database for MySQL 灵活服务器创建安全默认体系结构。
- 使用无密码连接字符串保护数据库连接。
- 使用 JBoss CLI 验证应用服务中的 JBoss 数据源。
- 从 GitHub 存储库将 JBoss 示例应用部署到应用服务。
- 在应用程序代码中访问应用服务应用设置。
- 进行更新并重新部署应用程序代码。
- 从应用服务流式传输诊断日志。
- 在 Azure 门户中管理应用。
- 使用 Azure Developer CLI 预配同一体系结构并进行部署。
- 使用 GitHub Codespaces 和 GitHub Copilot 优化开发工作流。
先决条件
- 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,可以免费创建一个。
- 一个 GitHub 帐户。 你也可以免费获得一个。
- 具备 JBoss 开发的 Java 知识。
- (可选)若要试用 GitHub Copilot,请创建一个 GitHub Copilot 帐户。 有 30 天免费试用版可用。
- 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,可以免费创建一个。
- 已安装 Azure 开发人员 CLI。 可以使用 Azure Cloud Shell 执行这些步骤,因为它已安装 Azure 开发人员 CLI。
- 具备 JBoss 开发的 Java 知识。
- (可选)若要试用 GitHub Copilot,请创建一个 GitHub Copilot 帐户。 有 30 天免费试用版可用。
跳到末尾
可以快速部署本教程中的示例应用,并查看它是否在 Azure 中运行。 只需在 Azure Cloud Shell 中运行以下命令,然后按照提示操作:
mkdir msdocs-jboss-mysql-sample-app
cd msdocs-jboss-mysql-sample-app
azd init --template msdocs-jboss-mysql-sample-app
azd up
1.运行示例
首先,将示例数据驱动的应用设置为起点。 为方便起见,示例存储库包含一个开发容器配置。 开发容器包含开发应用程序所需的所有内容,包括示例应用程序所需的数据库、缓存和所有环境变量。 开发容器可以在 GitHub codespace 中运行,这意味着可使用 Web 浏览器在任何计算机上运行示例。
步骤 1:在新浏览器窗口中:
- 登录到 GitHub 帐户。
- 导航到 https://github.com/Azure-Samples/msdocs-jboss-mysql-sample-app/fork。
- 取消选择“仅复制主分支”。 需要所有分支。
- 选择“创建分支”。
步骤 2:在 GitHub 分支中:
- 为起始分支选择“主”>“starter-no-infra”。 此分支仅包含示例项目,不包含与 Azure 相关的文件或配置。 选择“代码”>“在 starter-no-infra 上创建 codespace”。 设置 codespace 需要几分钟时间。
步骤 3:在 codespace 终端中:
- 运行
mvn clean wildfly:run
。 - 看到通知
Your application running on port 8080 is available.
时,请等待几秒钟,以便 WildFly 服务器完成应用程序的加载。 然后选择“在浏览器中打开”。 应在新的浏览器选项卡中看到该示例应用程序。若要停止 WildFly 服务器,请键入Ctrl
+C
。
遇到问题? 检查故障排除部分。
2.创建应用服务和 MySQL
首先,创建 Azure 资源。 本教程中使用的步骤创建一组默认安全的资源,其中包括应用服务和 Azure Database for MySQL。 对于创建过程,需要指定:
- Web 应用的名称。 它以
https://<app-name>-<hash>.<region>.azurewebsites.net
的形式用作应用的 DNS 名称的一部分。 - “区域”,在世界上以物理方式运行应用。 它还用作应用的 DNS 名称的一部分。
- 应用的运行时堆栈。 在此处选择要用于应用的 PHP 版本。
- 应用的托管计划。 它是定价层,包括应用的一组功能和缩放容量。
- 应用的资源组。 使用资源组可将应用程序所需的所有 Azure 资源分组到一个逻辑容器中。
登录到 Azure 门户并按照以下步骤创建 Azure 应用服务资源。
步骤 1:在 Azure 门户中:
- 在顶部搜索栏中,键入“应用服务”。
- 在“服务”标题下选择标有“应用服务”的项。
- 选择“创建”>“Web 应用”。 还可以直接导航到创建向导。
第 2 步:在“创建 Web 应用”页上,按如下所述填写表单。
- 名称:msdocs-jboss-mysql。 系统将为你生成名为 msdocs-jboss-mysql_group 的资源组。
- 运行时堆栈:Java 17。
- Java Web 服务器堆栈:Red Hat JBoss EAP 8。 如果已使用 Azure 配置了 Red Hat 订阅,请选择“Red Hat JBoss EAP 8 BYO 许可证”。
- 区域:你附近的任何 Azure 区域。
- Linux 计划:新建并使用名称 msdocs-jboss-mysql。
- 定价计划:高级版 V3 P0V3。 准备就绪后,可以纵向扩展到不同的定价层。
- 使用应用进行部署:选择“数据库”。 默认情况下,系统会为你选择“Azure Database for MySQL - 灵活服务器”。 Azure Database for MySQL 是 Azure 上完全托管的 MySQL 数据库即服务,与最新社区版兼容。
- 选择“查看 + 创建”。
- 验证完成后,选择“创建”。
步骤 3:该部署需要数分钟才能完成。 部署完成后,选择“转到资源”按钮。 这将直接转到应用服务应用,但会创建以下资源:
- 资源组:所有已创建资源的容器。
- 应用服务计划:为应用服务定义计算资源。 将创建基本层中的 Linux 计划。
- 应用服务:表示应用并在应用服务计划中运行。
- 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
- Azure Database for MySQL 灵活服务器:只能从虚拟网络访问。 你的数据库和用户创建于此服务器上。
- 专用 DNS 区域:在虚拟网络中启用数据库服务器的 DNS 解析。
- 专用终结点:访问虚拟网络中数据库服务器的终结点。
遇到问题? 检查故障排除部分。
3. 创建无密码连接
在此步骤中,你将生成一个基于托管标识的服务连接,稍后可以使用该链接在 JBoss 服务器中创建数据源。 通过使用托管标识连接到 MySQL 数据库,代码可以避免意外泄露机密。
第 1 步:创建托管标识。
- 在顶部搜索栏中,键入“托管标识”。
- 在“服务”标题下选择标有“托管标识”的项。
- 选择创建。
- 在“资源组”中,选择“msdocs-jboss-mysql_group”。
- 在“区域”中,选择用于 Web 应用的同一区域。
- 在“名称”中,键入 msdocs-jboss-mysql-server-identity。
- 选择“查看 + 创建”。
- 选择“创建”。
第 2 步:在 MySQL 服务器中启用 Microsoft Entra 身份验证。
- 在顶部搜索栏中,键入“msdocs-jboss-mysql-server”。
- 选择名为 msdocs-jboss-mysql-server 的 Azure Database for MySQL 灵活服务器资源。
- 在左侧菜单中,选择“安全”>“身份验证”。
- 在“分配访问权限”中,选择“仅 Microsoft Entra 身份验证”。
- 在“用户分配的托管标识”下,选择“选择”。
- 选择“msdocs-jboss-mysql-server-identity”,然后选择“添加”。 将标识分配到 MySQL 服务器需要一段时间。
- 在“Microsoft Entra 管理员名称”中,选择“选择”。
- 找到并选择 Azure 帐户,然后选择“选择”。
- 选择“保存”并等待操作完成。
第 3 步:添加基于托管标识的服务连接器。
- 在顶部搜索栏中,键入“msdocs-jboss-mysql”。
- 选择名为“msdocs-jboss-mysql”的应用服务资源。
- 在应用服务页面的左侧菜单中,选择“设置”>“服务连接器”。
- 选择创建。
- 在“基本信息”选项卡中:
- 将“服务类型”设置为“DB for MySQL 灵活服务器”。
- 将“MySQL 灵活服务器”设置为“msdocs-jboss-mysql-server”。
- 将“MySQL 数据库”设置为“msdocs-jboss-mysql-database”。
- 将“客户端类型”设置为“Java”。
- 选择“身份验证”选项卡。
- 选择“系统分配的托管标识”。
- 选择“查看 + 创建”选项卡。
- 验证完成后,选择“在 Cloud Shell 上创建”并等待操作在 Cloud Shell 中完成。
- 看到输出 JSON 时,可以关闭 Cloud Shell。 此外,请关闭“创建连接”对话框。
- 选择“刷新”以显示新的服务连接器。
第 4 步:将身份验证插件添加到连接字符串。
- 从左侧菜单中选择“环境变量”。
- 选择“AZURE_MYSQL_CONNECTIONSTRING”。 “值”字段应包含
user
但不包含password
。 用户是托管标识。 - 应用服务应用中的 JBoss 服务器具有身份验证插件来验证托管标识,但你仍需要将其添加到连接字符串中。 滚动到值末尾并追加
&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
。 - 选择“应用”。
- 选择“应用”,然后选择“确认”。
遇到问题? 检查故障排除部分。
4.确认 JNDI 数据源
如果你添加包含适用于 Oracle、SQL Server、PostgreSQL 或 MySQL 的有效 JDBC 连接字符串的应用设置,则应用服务会在 JBoss 服务器中为其添加一个 Java 命名和目录接口 (JNDI) 数据源。 在此步骤中,你使用与应用容器的 SSH 连接来验证 JNDI 数据源。 在此过程中,你将了解如何访问 SSH shell 并运行 JBoss CLI。
步骤 1:返回“应用服务”页:
- 在左侧菜单中,选择“开发工具”>“SSH”。
- 选择“转到”。
步骤 2:在 SSH 终端中:
- 运行
$JBOSS_HOME/bin/jboss-cli.sh --connect
。 - 在 JBoss CLI 连接中,运行
ls subsystem=datasources/data-source
。 应该会看到自动生成的名为AZURE_MYSQL_CONNECTIONSTRING_DS
的数据源。 - 使用
/subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name)
获取数据源的 JNDI 名称。 现在,你已获得一个 JNDI 名称java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
,稍后可以在应用程序代码中使用。
注意
只有对 /home
中文件的更改才能在应用重启之后持久保存。 例如,如果在 JBoss CLI 中编辑 /opt/eap/standalone/configuration/standalone.xml
或更改服务器配置,则更改不会在应用重启之后保留。 若要保留更改,请使用启动脚本,如“在 Azure 应用服务中为 Tomcat、JBoss 或 Java SE 应用配置数据源”中所示
遇到问题? 检查故障排除部分。
5.部署示例代码
在此步骤中,使用 GitHub Actions 配置 GitHub 部署。 这只是部署到应用服务的许多方法之一,也是一种在部署过程中持续集成的好方法。 默认情况下,进入 GitHub 存储库的每个 git push
都会启动生成和部署操作。
与 Tomcat 约定一样,如果要部署到 Tomcat 的根上下文,请将生成的项目命名为“ROOT.war”。
第 1 步:返回“应用服务”页,在左侧菜单中,选择“部署”>“部署中心”。
步骤 2:在“部署中心”页中:
- 在“源”中,选择“GitHub”。 默认情况下,选择 GitHub Actions 作为生成提供程序。
- 登录到 GitHub 帐户,并按照提示授权 Azure。
- 在“组织”中,选择你的帐户。
- 在“存储库”中,选择“msdocs-jboss-mysql-sample-app”。
- 在“分支”中,选择“starter-no-infra”。 这是与示例应用一起使用的同一分支,不包含任何与 Azure 相关的文件或配置。
- 对于“身份验证类型”,请选择“用户分配的标识”。
- 在顶部菜单中,选择“保存”。 应用服务会将工作流文件提交到所选 GitHub 存储库中(在
.github/workflows
目录中)。 默认情况下,部署中心会为工作流创建用户分配的标识,以便使用 Microsoft Entra(OIDC 身份验证)进行身份验证。 有关身份验证选项的详细信息,请参阅使用 GitHub Actions 部署到应用服务。
步骤 3:返回示例分支的 GitHub codespace,运行 git pull origin starter-no-infra
。
这会将新提交的工作流文件拉取到 codespace。 可以在 .github/workflows/starter-no-infra_msdocs-jboss-mysql.yml 处根据自己的需求进行修改。
步骤 4(选项 1:使用 GitHub Copilot):
- 单击“聊天”视图,然后单击“+”,即可开始新的聊天会话。
- 问:“@workspace 应用如何连接到数据库?”Copilot 可能会提供有关
java:jboss/MySQLDS
数据源以及如何配置它的一些说明。 - 例如:“Azure 中的 JBoss 中的数据源使用 JNDI 名称 java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS。”Copilot 可能会提供类似于下面“选项 2:不使用 GitHub Copilot”步骤中的代码建议,甚至会让你在类中进行更改。 GitHub Copilot 不会每次都给你相同的回复,你可能需要提出更多问题来优调其回复。 有关提示,请参阅我可以在 codespace 中使用 GitHub Copilot 做什么?。
步骤 4(选项 2:不使用 GitHub Copilot):
- 在资源管理器中打开 src/main/resources/META-INF/persistence.xml。 应用程序启动时,它会在此文件中加载数据库设置。
- 将
<jta-data-source>
的值从java:jboss/MySQLDS
更改为java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
,这是你之前在 SSH shell 中使用 JBoss CLI 找到的数据源。
步骤 5:
- 选择“源代码管理”扩展。
- 在文本框中,键入类似
Configure Azure JNDI name
的提交消息。 - 选择“提交”,然后使用“是”进行确认。
- 选择“同步更改 1”,然后使用“确定”进行确认。
步骤 6:返回到 Azure 门户中的“部署中心”页:
- 选择“日志”。 已从提交的更改开始新的部署运行。
- 在部署运行的日志项中,选择具有最新时间戳的“生成/部署日志”条目。
步骤 7:你已转到 GitHub 存储库,并看到 GitHub Action 正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。 等待 GitHub 运行以显示“完成”状态。 此过程大约需要 5 分钟。
遇到问题? 检查故障排除部分。
6.浏览到应用
步骤 1:在“应用服务”页中:
- 从左侧菜单中选择“概述”。
- 在“默认域”中,选择应用的 URL。
步骤 2:将一些任务添加到列表。 恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for MySQL。
遇到问题? 检查故障排除部分。
7.流式传输诊断日志
Azure 应用服务会捕获输出到控制台的所有消息,以帮助你诊断应用程序的问题。 示例应用程序包括标准 Log4j 日志记录语句,用于演示此功能,如以下代码片段所示:
private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());
@PersistenceContext
private EntityManager entityManager;
public List<Task> getAllTasks() {
logger.log(Level.INFO, "Finding all tasks. ");
return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}
在“应用服务”页的左侧菜单中,选择“日志流”。 将显示应用的日志,包括平台日志和容器内部的日志。
在为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry 系列教程中详细了解 Java 应用中的日志记录。
遇到问题? 检查故障排除部分。
8.清理资源
完成后,可以通过删除资源组从 Azure 订阅中删除所有资源。
步骤 1:在 Azure 门户顶部的搜索栏中:
- 输入资源组名称“msdocs-jboss-mysql_group”。
- 选择前面创建的资源组。
步骤 2:在资源组页上,选择“删除资源组”。
步骤 3:
- 键入资源组名称以确认删除。
- 选择“删除”。
- 再次使用“删除”进行确认。
2.创建 Azure 资源并部署示例应用
在此步骤中,将创建 Azure 资源并将示例应用部署到 Linux 上的应用服务。 本教程中使用的步骤创建一组默认安全的资源,其中包括应用服务和 Azure Database for MySQL。
开发容器已具有 Azure Developer CLI (AZD)。
从存储库根路径,运行
azd init
。azd init --template jboss-app-service-mysql-infra
出现提示时,请提供以下答案:
问题 Answer 继续在“ <your-directory>
”中初始化应用?Y 你希望对这些文件执行哪些操作? 使现有文件保持不变 输入新环境名称 键入唯一名称。 AZD 模板将此名称用作 Azure 中 Web 应用的 DNS 名称的一部分 ( <app-name>-<hash>.azurewebsites.net
)。 允许使用字母数字字符和下划线。通过运行
azd auth login
命令并按照提示登录到 Azure:azd auth login
使用
azd up
命令创建必要的 Azure 资源并部署应用代码。 按照提示为 Azure 资源选择所需的订阅和位置。azd up
azd up
命令需要大约 15 分钟来完成(Redis 缓存需要的时间最长)。 它还会编译和部署应用程序代码,但你稍后将修改代码以使用应用服务。 在运行时,该命令会提供有关预配和部署过程的消息,包括指向 Azure 中部署的链接。 完成后,命令还会显示指向部署应用程序的链接。此 AZD 模板包含使用以下 Azure 资源生成安全默认体系结构的文件(azure.yaml 和 infra 目录):
- 资源组:所有已创建资源的容器。
- 应用服务计划:为应用服务定义计算资源。 将创建 B1 层中的 Linux 计划。
- 应用服务:表示应用并在应用服务计划中运行。
- 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
- Azure Database for MySQL 灵活服务器:只能从虚拟网络访问。 将在服务器上为你创建数据库。
- Azure Cache for Redis:只能从虚拟网络中访问。
- 专用终结点:虚拟网络中密钥保管库和 Redis 缓存的访问终结点。
- 专用 DNS 区域:启用虚拟网络中的密钥保管库、数据库服务器和 Redis 缓存的 DNS 解析。
- Log Analytics 工作区:充当应用日志传送的目标容器,还可以在其中查询日志。
- 密钥保管库:使用 AZD 重新部署时,用于保留数据库密码。
一旦命令完成创建资源和首次部署应用程序代码的操作,已部署的示例应用就无法运行,因为你必须进行微小的更改才能使其连接到 Azure 中的数据库。
遇到问题? 检查故障排除部分。
3.验证连接字符串
你使用的 AZD 模板已为你生成了连接变量作为应用设置,并将它们输出到终端,以方便你使用。 使用应用设置可以将连接机密保留在代码存储库之外。
在 AZD 输出中,找到应用设置
AZURE_MYSQL_CONNECTIONSTRING
。 只显示设置名称。 它们在 AZD 输出中如下所示:App Service app has the following app settings: - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE - AZURE_MYSQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING
AZURE_MYSQL_CONNECTIONSTRING
包含 Azure 中 MySQL 数据库的连接字符串。 稍后需要在代码中使用它。为方便起见,AZD 模板会显示应用的应用设置页的直接链接。 找到该链接并在新的浏览器选项卡中打开它。
如果添加包含有效 Oracle、SQL Server、PostgreSQL 或 MySQL 连接字符串的应用设置,则应用服务会在JBoss 服务器的 context.xml 文件中将其添加为 Java 命名和目录接口 (JNDI) 数据源。
遇到问题? 检查故障排除部分。
4.确认 JNDI 数据源
在此步骤中,你将使用与应用容器的 SSH 连接来验证 JBoss 服务器中的 JNDI 数据源。 在此过程中,你将了解如何访问 JBoss 容器的 SSH shell。
在 AZD 输出中,找到 SSH 会话的 URL,并在浏览器中导航到该 URL。 它在输出中如下所示:
Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
在 SSH 终端中运行
$JBOSS_HOME/bin/jboss-cli.sh --connect
。在 JBoss CLI 连接中,运行
ls subsystem=datasources/data-source
。 应该会看到自动生成的名为AZURE_MYSQL_CONNECTIONSTRING_DS
的数据源。使用
/subsystem=datasources/data-source=AZURE_MYSQL_CONNECTIONSTRING_DS:read-attribute(name=jndi-name)
获取数据源的 JNDI 名称。 现在,你已获得一个 JNDI 名称java:jboss/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
,稍后可以在应用程序代码中使用。
注意
只有对 /home
中文件的更改才能在应用重启之后持久保存。 例如,如果在 JBoss CLI 中编辑 /opt/eap/standalone/configuration/standalone.xml
或更改服务器配置,则更改不会在应用重启之后保留。 若要保留更改,请使用启动脚本,如“在 Azure 应用服务中为 Tomcat、JBoss 或 Java SE 应用配置数据源”中所示
遇到问题? 检查故障排除部分。
5.修改示例代码并重新部署
在 GitHub codespace 中,单击“聊天”视图,然后单击 +,即可开始新的聊天会话。
问:“@workspace 应用如何连接到数据库?”Copilot 可能会提供有关
java:jboss/MySQLDS
数据源以及如何配置它的一些说明。问:“@workspace 我想将 persistence.xml 中定义的数据源替换为 JBoss 中的现有 JNDI 数据源。”Copilot 可能会为你提供类似于下面“选项 2:不使用 GitHub Copilot”步骤中的内容的代码建议,甚至会告诉你在 persistence.xml 文件中进行更改。
在资源管理器中打开 src/main/resources/META-INF/persistence.xml,然后进行建议的 JNDI 更改。
GitHub Copilot 不会每次都给你相同的回复,你可能需要提出其他问题来优调其回复。 有关提示,请参阅我可以在 codespace 中使用 GitHub Copilot 做什么?。
在 codespace 终端,运行
azd deploy
。azd deploy
提示
也可以始终只使用 azd up
,它会同时执行 azd package
、azd provision
和 azd deploy
。
要了解如何打包 War 文件,可以单独运行 azd package --debug
。
遇到问题? 检查故障排除部分。
6.浏览到应用
在 AZD 输出中,找到应用的 URL 并在浏览器中导航到该 URL。 该 URL 在 AZD 输出中如下所示:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
将一些任务添加到列表。
恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for MySQL。
遇到问题? 检查故障排除部分。
7.流式传输诊断日志
Azure 应用服务可以捕获控制台日志,以帮助你诊断应用程序的问题。 为方便起见,AZD 模板已启用对本地文件系统的日志记录以及将日志传送到 Log Analytics 工作区。
示例应用程序包括标准 Log4j 日志记录语句,用于演示此功能,如以下代码片段所示:
private static final Logger logger = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());
@PersistenceContext
private EntityManager entityManager;
public List<Task> getAllTasks() {
logger.log(Level.INFO, "Finding all tasks. ");
return this.entityManager.createNamedQuery("findAllTasks", Task.class).getResultList();
}
在 AZD 输出中,找到流式传输应用服务日志的链接,并在浏览器中导航到该链接。 该链接在 AZD 输出中如下所示:
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
在为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry 系列教程中详细了解 Java 应用中的日志记录。
遇到问题? 检查故障排除部分。
8.清理资源
若要删除当前部署环境中的所有 Azure 资源,请运行 azd down
并按照提示进行操作。
azd down
故障排除
- 我在创建向导中看到错误“无权使用自带许可功能”。
- Azure Database for MySQL 灵活服务器的门户部署视图显示冲突状态。
- “创建连接”对话框显示“在 Cloud Shell 上创建”按钮,但未启用。
- 我的应用无法启动,并且我在日志中看到“拒绝用户访问...(使用密码:否)”。
- 已部署的示例应用未显示任务列表应用。
- 诊断日志中出现错误:“表‘任务’已存在”。
创建向导中出现错误“无权使用自带许可功能”。
如果看到错误 The subscription '701ea799-fb46-4407-bb67-9cbcf289f1c7' is not entitled to use the Bring Your Own License feature when creating the application
,则表示你在 Java Web 服务器堆栈中选择了 Red Hat JBoss EAP 7/8 BYO 许可证,但尚未在 Red Hat Cloud Access 中设置 Azure 帐户,或者在 Red Hat Cloud Access 中没有有效的 JBoss EAP 许可证。
Azure Database for MySQL 灵活服务器的门户部署视图显示冲突状态。
根据订阅和所选区域,你可能会看到 Azure Database for MySQL 灵活服务器的部署状态为 Conflict
,并且操作详细信息中显示以下消息:
InternalServerError: An unexpected error occured while processing the request.
此错误很可能是由所选区域的订阅限制引起的。 请尝试为部署选择其他区域。
“创建连接”对话框显示“在 Cloud Shell 上创建”按钮,但未启用。
可能还会在对话框中看到错误消息:The database server is in Virtual Network and Cloud Shell can't connect to it. Please copy the commands and execute on an environment which can connect to the database server in Virtual Network.
服务连接器自动化需要通过网络访问 MySQL 服务器。 查看 MySQL 服务器资源的网络设置,并确保至少选择“允许公众使用公共 IP 地址通过互联网访问此资源”。 对于服务连接器而言,此为必要操作。
如果未看到此复选框,则可能已使用“Web 应用 + 数据库向导”创建了部署,并且该部署锁定了对 MySQL 服务器的所有公共网络访问。 无法修改配置。 由于应用的 Linux 容器可以通过虚拟网络集成访问 MySQL,因此可以在应用程序的 SSH 会话中安装 Azure CLI 并在那里运行给定的 Cloud Shell 命令。
已部署的示例应用未显示任务列表应用。
如果你看到的是 JBoss 启动页面而不是任务列表应用,则应用服务很可能仍会从最近的代码部署加载更新的容器。 等待几分钟,然后刷新页面。
我的应用无法启动,并且我在日志中看到“拒绝用户访问...(使用密码:否)”。
出现此错误很可能是因为你没有将无密码身份验证插件添加到连接字符串(请参阅将 Azure Database for MySQL 与服务连接器集成的 Java 示例代码)。 按照“3.创建无密码连接”中的说明更改 MySQL 连接字符串。
诊断日志中出现错误:“表‘任务’已存在”。
你可以忽略此休眠错误,因为此错误表明应用程序代码已连接到 MySQL 数据库。 已将该应用程序配置为在启动时创建必要的表(参见 src/main/resources/META-INF/persistence.xml)。 应用程序首次启动时,应该已成功创建表,但是在后续重新启动时,你会看到此错误,因为表已经存在。
常见问题解答
- 此设置花费有多大?
- 如何使用其他工具连接到虚拟网络后面的 MySQL 服务器?
- 如何使用 Microsoft Entra 身份验证获取 MySQL 连接的有效访问令牌?
- 本地应用开发如何处理 GitHub Actions?
- 我无权创建用户分配的标识
- 我可以在 codespace 中使用 GitHub Copilot 做什么?
此设置花费有多大?
所创建资源的定价如下所示:
- 应用服务计划在 P0v3 层中创建,可以纵向扩展或缩减。 请参阅应用服务定价。
- MySQL 灵活服务器在 D2ds 层中创建,可以纵向扩展或缩减。 参阅 Azure Database for MySQL 定价。
- Azure Cache for Redis 是在缓存大小最小的基本层中创建的。 此层的相关成本很低。 你可将其纵向扩展到更高的性能层,以实现更高的可用性、聚类分析和其他功能。 请查阅 Azure Cache for Redis 定价。
- 除非配置额外的功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价。
- 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价。
如何使用其他工具连接到虚拟网络后面的 MySQL 服务器?
在本教程中,应用服务应用已与 MySQL 服务器建立网络连接,并且可以使用其系统分配的托管标识通过 Microsoft Entra 进行身份验证。 可以通过在 SSH 会话中运行以下命令,直接从应用容器内连接到 MySQL(从 AZURE_MYSQL_CONNECTIONSTRING
应用设置中获取 <server>
、<user>
和 <database>
值):
apt-get update
apt-get install curl less mysql-client jq -y
mysql -h <server> --user <user> --database <database> --enable-cleartext-plugin --password=`curl "${IDENTITY_ENDPOINT}?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01" -H "X-IDENTITY-HEADER: $IDENTITY_HEADER" -s | jq -r '.access_token'`
几个注意事项:
- 在 SSH 会话中安装的工具不会在应用重启时保留。
- 如果按照门户步骤进行操作,并使用 Microsoft Entra 用户作为管理员配置了 MySQL,则可以使用 Microsoft Entra 用户连接到 MySQL。
- 若要从 MySQL Workbench 等桌面工具进行连接,计算机必须位于虚拟网络中,例如部署到同一虚拟网络中的 Azure VM。 还必须使用托管标识或 Microsoft Entra 用户单独配置身份验证。
- 若要从与 Azure 虚拟网络具有站点到站点 VPN 连接的本地网络中的计算机进行连接,不能使用托管标识配置身份验证,但可以使用 Microsoft Entra 用户配置身份验证。
- 还可以集成 Azure Cloud Shell 并使用 Azure CLI 或 MySQL CLI 进行连接。 若要进行身份验证,可以配置 Microsoft Entra 用户。
如何使用 Microsoft Entra 身份验证获取 MySQL 连接的有效访问令牌?
对于 Microsoft Entra 用户、系统分配的托管标识或有权访问 MySQL 数据库的用户签名的托管标识,Azure CLI 可帮助你生成访问令牌。 对于托管标识,必须在运行 Azure CLI 的应用服务应用或 VM 上配置标识。
# Sign in as a Microsoft Entra user
az login
# Sign in as the system-assigned managed identity
az login --identity
# Sign in as a user-assigned managed identity
az login --identity --username <client-id-of-user-assigned-identity>
# Get an access token
az account get-access-token --resource-type oss-rdbms
如果需要,还可以使用 az mysql flexible-server connect Azure CLI 命令连接到 MySQL。 出现提示时,请使用访问令牌作为密码。
az mysql flexible-server connect -n <server-name-only> -u <user> -d <database> --interactive
有关详细信息,请参阅:
- 如何使用应用服务和 Azure Functions 的托管标识
- 使用 Azure CLI 向 Azure 进行身份验证
- 使用 Microsoft Entra ID 连接到 Azure Database for MySQL 灵活服务器
本地应用开发如何与 GitHub Actions 配合使用?
以应用服务中自动生成的工作流文件为例,每个 git push
都会启动新的生成和部署运行。 从 GitHub 存储库的本地克隆中,进行所需更新并推送到 GitHub。 例如:
git add .
git commit -m "<some-message>"
git push origin starter-no-infra
我无权创建用户分配的标识
我可以在 codespace 中使用 GitHub Copilot 做什么?
你可能注意到,创建 codespace 时,GitHub Copilot 聊天视图已经存在。 为了你的方便,我们在容器定义中包含了 GitHub Copilot 聊天扩展(参见 .devcontainer/devcontainer.json)。 不过,你需要一个 GitHub Copilot 帐户(可免费试用 30 天)。
下面是与 GitHub Copilot 交谈时的一些提示:
- 在单次聊天会话中,问题和答案相互关联,你可以调整问题来微调所获得的答案。
- 默认情况下,GitHub Copilot 无法访问你存储库中的任何文件。 若要询问有关文件的问题,请首先在编辑器中打开该文件。
- 为了让 GitHub Copilot 在准备答案时有权访问存储库中的所有文件,请在问题开头加上
@workspace
。 有关详细信息,请参阅 Use the @workspace agent。 - 在聊天会话中,GitHub Copilot 可以建议更改,甚至可以(在使用
@workspace
时)建议在何处进行更改,但系统不允许它为你进行更改。 你可以自行添加建议的更改并对其进行测试。
你还可以说下面的一些话来微调得到的答案:
- 更改此代码以使用数据源 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS。
- 你的代码中的某些导入使用了 javax,但我使用的是 Jakarta 应用。
- 我希望只有在设置了环境变量 AZURE_MYSQL_CONNECTIONSTRING 的情况下才运行此代码。
- 我希望此代码仅在 Azure 应用服务中运行,而不在本地运行。
后续步骤
在开发人员指南中详细了解在应用服务上运行 Java 应用。
了解如何使用自定义域和证书保护应用。