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

教程:使用 Linux 上的 Azure 应用服务和 MySQL 生成 Tomcat Web 应用

本教程介绍如何在连接到 MySQL 数据库的 Azure 应用服务中生成、配置和部署安全 Tomcat 应用程序(使用 Azure Database for MySQL)。 Azure 应用服务是一种可缩放程度高、支持自修补的 Web 托管服务,可轻松地在 Windows 或 Linux 上部署应用。 完成本教程后,Linux 上的 Azure 应用服务中将会运行一个 Tomcat 应用。

将数据存储到 MySQL 的 Tomcat 应用程序的屏幕截图。

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

  • 为 Azure 应用服务和 Azure Database for MySQL 创建默认安全的体系结构。
  • 使用托管标识和 Key Vault 引用来保护连接机密。
  • 从 GitHub 存储库将 Tomcat 示例应用部署到应用服务。
  • 在应用程序代码中访问应用服务应用设置。
  • 进行更新并重新部署应用程序代码。
  • 从应用服务流式传输诊断日志。
  • 在 Azure 门户中管理应用。
  • 使用 Azure Developer CLI 预配同一体系结构并进行部署。
  • 使用 GitHub Codespaces 和 GitHub Copilot 优化开发工作流。

先决条件

  • 具有活动订阅的 Azure 帐户。 如果没有 Azure 帐户,可以免费创建一个
  • 一个 GitHub 帐户。 你也可以免费获得一个
  • 具备 Tomcat 开发的 Java 知识。
  • (可选)若要试用 GitHub Copilot,请创建一个 GitHub Copilot 帐户。 有 30 天免费试用版可用。

跳到末尾

可以快速部署本教程中的示例应用,并查看它是否在 Azure 中运行。 只需在 Azure Cloud Shell 中运行以下命令,然后按照提示操作:

mkdir msdocs-tomcat-mysql-sample-app
cd msdocs-tomcat-mysql-sample-app
azd init --template msdocs-tomcat-mysql-sample-app
azd up

1.运行示例

首先,将示例数据驱动的应用设置为起点。 为方便起见,示例存储库包含一个开发容器配置。 开发容器包含开发应用程序所需的所有内容,包括示例应用程序所需的数据库、缓存和所有环境变量。 开发容器可以在 GitHub codespace 中运行,这意味着可使用 Web 浏览器在任何计算机上运行示例。

步骤 1:在新浏览器窗口中:

  1. 登录到 GitHub 帐户。
  2. 导航到 https://github.com/Azure-Samples/msdocs-tomcat-mysql-sample-app/fork
  3. 取消选择“仅复制主分支”。 需要所有分支。
  4. 选择“创建分支”。

显示如何创建示例 GitHub 存储库分支的屏幕截图。

步骤 2:在 GitHub 分支中:

  1. 为起始分支选择“”>“starter-no-infra”。 此分支仅包含示例项目,不包含与 Azure 相关的文件或配置。
  2. 选择“代码”>“在 starter-no-infra 上创建 codespace”。 设置 codespace 需要几分钟时间。

显示如何在 GitHub 中创建 codespace 的屏幕截图。

步骤 3:在 codespace 终端中

  1. 运行 mvn jetty:run
  2. 看到通知 Your application running on port 80 is available. 时,选择“在浏览器中打开”。 应在新的浏览器选项卡中看到该示例应用程序。若要停止 Jetty 服务器,请键入 Ctrl+C

显示如何在 GitHub codespace 中运行示例应用程序的屏幕截图。

提示

可以向 GitHub Copilot 询问有关此存储库的信息。 例如:

  • @workspace 这个项目有什么用?
  • @workspace .devcontainer 文件夹有什么用?

遇到问题? 检查故障排除部分

2.创建应用服务和 MySQL

首先,创建 Azure 资源。 本教程中使用的步骤创建一组默认安全的资源,其中包括应用服务和 Azure Database for MySQL。 对于创建过程,需要指定:

  • Web 应用的名称。 它以 https://<app-name>-<hash>.<region>.azurewebsites.net 的形式用作应用的 DNS 名称的一部分。
  • “区域”,在世界上以物理方式运行应用。 它还用作应用的 DNS 名称的一部分。
  • 应用的运行时堆栈。 在此处选择要用于应用的 PHP 版本。
  • 应用的托管计划。 它是定价层,包括应用的一组功能和缩放容量。
  • 应用的资源组。 使用资源组可将应用程序所需的所有 Azure 资源分组到一个逻辑容器中。

登录到 Azure 门户并按照以下步骤创建 Azure 应用服务资源。

步骤 1:在 Azure 门户中:

  1. 在 Azure 门户顶部的搜索栏中,输入“Web 应用数据库”。
  2. 选择“市场”标题下标记为“Web 应用 + 数据库”的项目。 还可以直接导航到创建向导

显示如何使用顶部工具栏中的搜索框查找“Web 应用 + 数据库”创建向导的屏幕截图。

步骤 2:在“创建 Web 应用 + 数据库”页上,按下面所述填写表单。

  1. 资源组:选择“新建”,并使用名称 msdocs-tomcat-mysql-tutorial
  2. 区域:你附近的任何 Azure 区域。
  3. 名称:msdocs-tomcat-mysql-XYZ,其中 XYZ 是任意三个随机字符
  4. 运行时堆栈Java 17
  5. Java Web 服务器堆栈Apache Tomcat 10.1
  6. 引擎:默认情况下,系统会为你选择“MySQL - 灵活服务器”作为数据库引擎。 如果没有,请选择它。 Azure Database for MySQL - 灵活服务器是 Azure 上完全托管的 MySQL 数据库即服务,与最新社区版兼容。
  7. 托管计划基本。 准备就绪后,可以纵向扩展到生产定价层。
  8. 选择“查看 + 创建”。
  9. 验证完成后,选择“创建”。

显示如何在“Web 应用 + 数据库”向导中配置新应用程序和数据库的屏幕截图。

步骤 3:该部署需要数分钟才能完成。 部署完成后,选择“转到资源”按钮。 这将直接转到应用服务应用,但会创建以下资源:

  • 资源组:所有已创建资源的容器。
  • 应用服务计划:为应用服务定义计算资源。 将创建基本层中的 Linux 计划。
  • 应用服务:表示应用并在应用服务计划中运行。
  • 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
  • Azure Database for MySQL 灵活服务器:只能从虚拟网络访问。 你的数据库和用户创建于此服务器上。
  • 专用 DNS 区域:在虚拟网络中启用数据库服务器的 DNS 解析。

屏幕截图显示已完成的部署过程。

遇到问题? 检查故障排除部分

3.安全连接机密

创建向导已经为你生成了数据库连接字符串作为应用设置。 但是,安全最佳做法是将机密完全保留在应用服务之外。 你需要借助服务连接器将机密移到密钥保管库,并将应用设置更改为密钥保管库引用

步骤 1:检索现有的连接字符串

  1. 在应用服务页面的左侧菜单中,选择“设置”>“环境变量”
  2. 选择“AZURE_MYSQL_CONNECTIONSTRING”。 它包含一个 JDBC 连接字符串。 如果添加包含有效 Oracle、SQL Server、PostgreSQL 或 MySQL 连接字符串的应用设置,则应用服务会在 Tomcat 服务器的 context.xml 文件中将其注入为一个 Java 命名和目录接口 (JNDI) 数据源。
  3. 在“添加/编辑应用程序设置”的“值”字段中,找到字符串末尾的“Password=”部分。
  4. 复制“Password=”后的密码字符串供以后使用。 此应用设置允许连接到受专用终结点保护的 MySQL 数据库。 但是,机密直接保存在应用服务应用中,这不是最好的做法。 你将对此进行更改。

显示如何查看应用设置值的屏幕截图。

步骤 2:创建密钥保管库以安全管理机密

  1. 在顶部搜索栏中,键入“密钥保管库”,然后选择“市场”>“密钥保管库”。
  2. 在“资源组”中,选择“msdocs-tomcat-mysql-tutorial”。
  3. 在“密钥保管库名称”中,键入仅包含字母和数字的名称。
  4. 在“区域”中,将其设置为资源组所在的同一位置。

显示如何创建密钥保管库的屏幕截图。

步骤 3:使用专用终结点保护密钥保管库

  1. 选择“网络”选项卡。
  2. 取消选择“启用公共访问”
  3. 选择“创建专用终结点”。
  4. 在“资源组”中,选择“msdocs-tomcat-mysql-tutorial”。
  5. 在“名称”中,键入仅包含字母和数字的专用终结点名称
  6. 在“区域”中,将其设置为资源组所在的同一位置。
  7. 在对话框中,在“位置”中,选择与应用服务应用相同的位置。
  8. 在“资源组”中,选择“msdocs-tomcat-mysql-tutorial”。
  9. 在“名称”中,键入“msdocs-tomcat-mysql-XYZVaultEndpoint”
  10. 在“虚拟网络”中,选择“msdocs-tomcat-mysql-XYZVnet”
  11. 在“子网”中,选择“msdocs-tomcat-mysql-XYZSubnet”
  12. 选择“确定”
  13. 依次选择“查看 + 创建”、“创建”。 等待密钥保管库部署完成。 应会看到“部署已完成”。

屏幕截图显示了如何使用专用终结点保护密钥保管库。

步骤 4:配置服务连接器

  1. 在顶部搜索栏中,键入“msdocs-tomcat-mysql”,然后键入名为“msdocs-tomcat-mysql-XYZ”的应用服务资源。
  2. 在应用服务页面的左侧菜单中,选择“设置”>“服务连接器”。 已经有一个连接器,该连接器是为你创建的应用创建向导。
  3. 选中连接器旁边的复选框,然后选择“编辑”
  4. 在“基本信息”选项卡中,将“客户端类型”设置为“Java”
  5. 选择“身份验证”选项卡。
  6. 在“密码”中,粘贴你之前复制的密码。
  7. 选择“在密钥保管库中存储机密”。
  8. 在“密钥保管库连接”下,选择“创建新连接”。 在编辑对话框顶部打开“创建连接”对话框。

显示如何使用密钥保管库连接编辑服务连接器的屏幕截图。

步骤 5:建立密钥保管库连接

  1. 在密钥保管库连接的“创建连接”对话框中,在“密钥保管库”中选择之前创建的密钥保管库
  2. 选择“查看 + 创建” 。 应该会看到“系统分配的托管标识”设置为“已选中”。
  3. 验证完成后,选择“创建”。

显示如何配置密钥保管库服务连接器的屏幕截图。

步骤 6:完成服务连接器配置

  1. 你将返回到“defaultConnector”的编辑对话框中。 在“身份验证”选项卡中,等待创建密钥保管库连接器。 完成后,“密钥保管库连接”下拉列表会自动选择相应选项。
  2. 选择“下一页:网络”。
  3. 选择“保存”。 等待“更新成功”通知出现

显示 defaultConnector 中选择的密钥保管库连接的屏幕截图。

步骤 7:验证密钥保管库集成

  1. 在左侧菜单中,再次选择“设置”>“环境变量”。
  2. 在“AZURE_MYSQL_CONNECTIONSTRING”旁边,选择“显示值”。 该值应为 @Microsoft.KeyVault(...),这意味着它是 密钥保管库引用,因为密钥保管库中现在管理机密。

屏幕截图显示了如何在 Azure 中查看 MySQL 环境变量的值。

概括而言,该过程涉及到从应用服务的环境变量中检索 MySQL 连接字符串,创建 Azure 密钥保管库以通过专用访问进行安全机密管理,并更新服务连接器以将密码存储在密钥保管库中。 使用系统分配的托管标识在应用服务应用与密钥保管库之间建立了安全连接,并验证了设置(验证方式是确认连接字符串使用密钥保管库引用)。

遇到问题? 检查故障排除部分

4.确认 JNDI 数据源

如果你添加包含适用于 Oracle、SQL Server、PostgreSQL 或 MySQL 的有效 JDBC 连接字符串的应用设置,则应用服务会在 Tomcat 服务器的 context.xml 文件中为其添加一个 Java 命名和目录接口 (JNDI) 数据源。 在此步骤中,你使用与应用容器的 SSH 连接来验证 JNDI 数据源。 在此过程中,你将了解如何访问 Tomcat 容器的 SSH shell。

步骤 1:返回“应用服务”页:

  1. 从左侧菜单中选择“SSH”。
  2. 选择“转到”。

显示如何从 Azure 门户打开应用的 SSH shell 的屏幕截图。

步骤 2:在 SSH 终端中运行 cat /usr/local/tomcat/conf/context.xml。 你应会看到已添加名为 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 的 JNDI 资源。 稍后你将使用该数据源。

显示在 SSH shell 中运行的命令及其输出的屏幕截图。

注意

只有对 /home 中文件的更改才能在应用重启之后持久保存。 例如,如果编辑 /usr/local/tomcat/conf/server.xml,则在应用重启之后不会保留更改。

遇到问题? 检查故障排除部分

5.部署示例代码

在此步骤中,使用 GitHub Actions 配置 GitHub 部署。 这只是部署到应用服务的许多方法之一,也是一种在部署过程中持续集成的好方法。 默认情况下,进入 GitHub 存储库的每个 git push 都会启动生成和部署操作。

与 Tomcat 约定一样,如果要部署到 Tomcat 的根上下文,请将生成的项目命名为 ROOT.war

步骤 1:返回“应用服务”页,在左侧菜单中,选择“部署中心”

显示如何在“应用服务”中打开部署中心的屏幕截图。

步骤 2:在“部署中心”页中:

  1. 在“源”中,选择“GitHub”。 默认情况下,选择 GitHub Actions 作为生成提供程序。
  2. 登录到 GitHub 帐户,并按照提示授权 Azure。
  3. 在“组织”中,选择你的帐户。
  4. 在“存储库”中,选择“msdocs-tomcat-mysql-sample-app”。
  5. 在“分支”中,选择“starter-no-infra”。 这是与示例应用一起使用的同一分支,不包含任何与 Azure 相关的文件或配置。
  6. 对于“身份验证类型”,请选择“用户分配的标识”。
  7. 在顶部菜单中,选择“保存”。 应用服务会将工作流文件提交到所选 GitHub 存储库中(在 .github/workflows 目录中)。 默认情况下,部署中心会为工作流创建用户分配的标识,以便使用 Microsoft Entra(OIDC 身份验证)进行身份验证。 有关身份验证选项的详细信息,请参阅使用 GitHub Actions 部署到应用服务

显示如何使用 GitHub Actions 配置 CI/CD 的屏幕截图。

步骤 3:返回示例分支的 GitHub codespace,运行 git pull origin starter-no-infra。 这会将新提交的工作流文件拉取到 codespace。

显示 GitHub codespace 内的 git 拉取的屏幕截图。

步骤 4(选项 1:使用 GitHub Copilot):

  1. 单击“聊天”视图,然后单击“+”,即可开始新的聊天会话。
  2. 问:“@workspace 应用如何连接到数据库?”Copilot 可能会提供有关 jdbc/MYSQLDS 数据源以及如何配置它的一些说明。
  3. 询问:“@workspace 我想用 Tomcat 中现有的 JNDI 数据源替换 persistence.xml 中定义的数据源,但我想动态地执行此操作。”。 Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告诉你在 ContextListener 类中进行更改。
  4. 在资源管理器中打开 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java,并在 contextInitialized 方法中添加代码建议。 GitHub Copilot 不会每次都给你相同的回复,你可能需要提出更多问题来优调其回复。 有关提示,请参阅我可以在 codespace 中使用 GitHub Copilot 做什么?

屏幕截图显示如何在新的 GitHub Copilot 聊天会话中提问。

步骤 4(选项 2:不使用 GitHub Copilot):

  1. 在资源管理器中打开 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java。 当应用程序启动时,此类会加载 src/main/resources/META-INF/persistence.xml 中的数据库设置。
  2. contextIntialized() 方法中,找到注释的代码(第 29-33 行),并取消注释。 此代码检查 AZURE_MYSQL_CONNECTIONSTRING 应用设置是否存在,并将数据源更改为 java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS,即你之前在 SSH shell 的 context.xml 中找到的数据源。

显示 GitHub codespace 和已打开的 ContextListener.java 文件的屏幕截图。

步骤 5:

  1. 选择“源代码管理”扩展。
  2. 在文本框中,键入类似 Configure Azure data source 的提交消息。
  3. 选择“提交”,然后使用“是”进行确认
  4. 选择“同步更改 1”,然后使用“确定”进行确认。

显示正在提交并推送到 GitHub 的更改的屏幕截图。

步骤 6:返回到 Azure 门户中的“部署中心”页

  1. 选择“日志”。 已从提交的更改开始新的部署运行。
  2. 在部署运行的日志项中,选择具有最新时间戳的“生成/部署日志”条目。

显示如何在部署中心打开部署日志的屏幕截图。

步骤 7:你已转到 GitHub 存储库,并看到 GitHub Action 正在运行。 工作流文件定义两个单独的阶段,即生成和部署阶段。 等待 GitHub 运行以显示“完成”状态。 此过程大约需要 5 分钟。

屏幕截图显示 GitHub 正在运行。

遇到问题? 检查故障排除部分

6.浏览到应用

步骤 1:在“应用服务”页中:

  1. 从左侧菜单中选择“概述”。
  2. 选择应用的 URL。

显示如何从 Azure 门户中启动应用服务的屏幕截图。

步骤 2:将一些任务添加到列表。 恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for MySQL。

使用在 Azure 中运行的 MySQL 的 Tomcat Web 应用的屏幕截图。

遇到问题? 检查故障排除部分

7.流式传输诊断日志

Azure 应用服务会捕获输出到控制台的所有消息,以帮助你诊断应用程序的问题。 示例应用程序包括标准 Log4j 日志记录语句,用于演示此功能,如以下代码片段所示:

@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
    private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        logger.info("GET /");

        EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");

步骤 1:在“应用服务”页中:

  1. 从左菜单中选择“应用服务日志”。
  2. 在“应用程序日志记录”下,选择“文件系统”。
  3. 在顶部菜单中,选择“保存”。

显示如何在 Azure 门户的应用服务中启用本机日志的屏幕截图。

步骤 2:在左侧菜单中,选择“日志流”。 将显示应用的日志,包括平台日志和容器内部的日志。

显示如何在 Azure 门户中查看日志流的屏幕截图。

为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry 系列教程中详细了解 Java 应用中的日志记录。

遇到问题? 检查故障排除部分

8.清理资源

完成后,可以通过删除资源组从 Azure 订阅中删除所有资源。

步骤 1:在 Azure 门户顶部的搜索栏中:

  1. 输入资源组名称。
  2. 选择前面创建的资源组。

显示如何在 Azure 门户中搜索和导航到资源组的屏幕截图。

步骤 2:在资源组页上,选择“删除资源组”。

显示 Microsoft Azure 门户中“删除资源组”按钮位置的屏幕截图。

步骤 3:

  1. 键入资源组名称以确认删除。
  2. 选择“删除”。
  3. 再次使用“删除”进行确认

Azure 门户中删除资源组确认对话框的屏幕截图。

2.创建 Azure 资源并部署示例应用

在此步骤中,将创建 Azure 资源并将示例应用部署到 Linux 上的应用服务。 本教程中使用的步骤创建一组默认安全的资源,其中包括应用服务和 Azure Database for MySQL。

开发容器已具有 Azure Developer CLI (AZD)。

  1. 从存储库根路径,运行 azd init

    azd init --template tomcat-app-service-mysql-infra
    
  2. 出现提示时,请提供以下答案:

    问题 Answer
    当前目录不为空。 是否要在此处初始化“<your-directory>”中的项目? Y
    你希望对这些文件执行哪些操作? 使现有文件保持不变
    输入新环境名称 键入唯一名称。 AZD 模板将此名称用作 Azure 中 Web 应用的 DNS 名称的一部分 (<app-name>-<hash>.azurewebsites.net)。 允许使用字母数字字符和下划线。
  3. 通过运行 azd auth login 命令并按照提示登录到 Azure:

    azd auth login
    
  4. 使用 azd up 命令创建必要的 Azure 资源并部署应用代码。 按照提示为 Azure 资源选择所需的订阅和位置。

    azd up
    

    azd up 命令需要大约 15 分钟来完成(Redis 缓存需要的时间最长)。 它还会编译和部署应用程序代码,但你稍后将修改代码以使用应用服务。 在运行时,该命令会提供有关预配和部署过程的消息,包括指向 Azure 中部署的链接。 完成后,命令还会显示指向部署应用程序的链接。

    此 AZD 模板包含使用以下 Azure 资源生成安全默认体系结构的文件(azure.yamlinfra 目录):

    • 资源组:所有已创建资源的容器。
    • 应用服务计划:为应用服务定义计算资源。 将创建 B1 层中的 Linux 计划。
    • 应用服务:表示应用并在应用服务计划中运行。
    • 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
    • Azure Database for MySQL 灵活服务器:只能通过 DNS 区域集成从虚拟网络访问。 将在服务器上为你创建数据库。
    • Azure Cache for Redis:只能从虚拟网络中访问。
    • 专用终结点:虚拟网络中密钥保管库和 Redis 缓存的访问终结点。
    • 专用 DNS 区域:启用虚拟网络中的密钥保管库、数据库服务器和 Redis 缓存的 DNS 解析。
    • Log Analytics 工作区:充当应用日志传送的目标容器,还可以在其中查询日志。
    • 密钥保管库:使用 AZD 重新部署时,用于保留数据库密码。

    一旦命令完成创建资源和首次部署应用程序代码的操作,已部署的示例应用就无法运行,因为你必须进行微小的更改才能使其连接到 Azure 中的数据库。

遇到问题? 检查故障排除部分

3.验证连接字符串

你使用的 AZD 模板已为你生成了连接变量作为应用设置,并将它们输出到终端,以方便你使用。 使用应用设置可以将连接机密保留在代码存储库之外。

  1. 在 AZD 输出中,找到应用设置 AZURE_MYSQL_CONNECTIONSTRING。 只显示设置名称。 它们在 AZD 输出中如下所示:

     App Service app has the following connection strings:
             - AZURE_MYSQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
     

    AZURE_MYSQL_CONNECTIONSTRING 包含 Azure 中 MySQL 数据库的连接字符串。 稍后需要在代码中使用它。

  2. 为方便起见,AZD 模板会显示应用的应用设置页的直接链接。 找到该链接并在新的浏览器选项卡中打开它。

    如果添加包含有效 Oracle、SQL Server、PostgreSQL 或 MySQL 连接字符串的应用设置,则应用服务会在 Tomcat 服务器的 context.xml 文件中将其添加为 Java 命名和目录接口 (JNDI) 数据源。

遇到问题? 检查故障排除部分

4.确认 JNDI 数据源

在此步骤中,使用与应用容器的 SSH 连接来验证 Tomcat 服务器中的 JNDI 数据源。 在此过程中,你将了解如何访问 Tomcat 容器的 SSH shell。

  1. 在 AZD 输出中,找到 SSH 会话的 URL,并在浏览器中导航到该 URL。 它在输出中如下所示:

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. 在 SSH 终端中运行 cat /usr/local/tomcat/conf/context.xml。 你应会看到已添加名为 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 的 JNDI 资源。 稍后你将使用该数据源。

    显示在 SSH shell 中运行的命令及其输出的屏幕截图。

注意

只有对 /home 中文件的更改才能在应用重启之后持久保存。 例如,如果编辑 /usr/local/tomcat/conf/server.xml,则在应用重启之后不会保留更改。

遇到问题? 检查故障排除部分

5.修改示例代码并重新部署

  1. 在 GitHub codespace 中,单击“聊天”视图,然后单击 +,即可开始新的聊天会话

  2. 问:“@workspace 应用如何连接到数据库?”Copilot 可能会提供有关 jdbc/MYSQLDS 数据源以及如何配置它的一些说明。

  3. 问:“@workspace 我想用 Tomcat 中现有的 JNDI 数据源替换 persistence.xml 中定义的数据源,但我想动态地执行此操作。”Copilot 可能会给你一个类似于下方的“选项 2:没有 GitHub Copilot”步骤中的建议的代码建议,甚至会告诉你在 ContextListener 类中进行更改。

  4. 在资源管理器中打开 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java,并在 contextInitialized 方法中添加代码建议。

    GitHub Copilot 不会每次都给你相同的回复,你可能需要提出其他问题来优调其回复。 有关提示,请参阅我可以在 codespace 中使用 GitHub Copilot 做什么?

  5. 在 codespace 终端,运行 azd deploy

    azd deploy
    

提示

也可以始终只使用 azd up,它会同时执行 azd packageazd provisionazd deploy

要了解如何打包 War 文件,可以单独运行 azd package --debug

遇到问题? 检查故障排除部分

6.浏览到应用

  1. 在 AZD 输出中,找到应用的 URL 并在浏览器中导航到该 URL。 该 URL 在 AZD 输出中如下所示:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. 将一些任务添加到列表。

    使用在 Azure 中运行的 MySQL 的 Tomcat Web 应用的屏幕截图,其中显示了任务。

    恭喜,你已在 Azure 应用服务中运行了一个 Web 应用,并安全连接到了 Azure Database for MySQL。

遇到问题? 检查故障排除部分

7.流式传输诊断日志

Azure 应用服务可以捕获控制台日志,以帮助你诊断应用程序的问题。 为方便起见,AZD 模板已启用对本地文件系统的日志记录以及将日志传送到 Log Analytics 工作区

示例应用程序包括标准 Log4j 日志记录语句,用于演示此功能,如以下代码片段所示:

@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
    private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        logger.info("GET /");

        EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");

在 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

故障排除

我看到从多个位置扫描的许多<类>警告与 mvn jetty:run

你可以忽略这些警告。 Maven Jetty 插件显示警告,因为应用的 pom.xml 包含 jakarta.servlet.jsp.jstl 的依赖项,Jetty 已提供现成的依赖项。 需要 Tomcat 的依赖项。

Azure Database for MySQL 灵活服务器的门户部署视图显示冲突状态

根据订阅和所选区域,你可能会看到 Azure Database for MySQL 灵活服务器的部署状态为 Conflict,并且操作详细信息中显示以下消息:

InternalServerError: An unexpected error occured while processing the request.

此错误很可能是由所选区域的订阅限制引起的。 请尝试为部署选择其他区域。

已部署的示例应用未显示任务列表应用

如果你看到 Hey, Java developers! 页,而不是任务列表应用,则应用服务很可能仍会从最近的代码部署加载更新的容器。 等待几分钟,然后刷新页面。

我在部署的示例应用中看到“404 找不到页面”错误

请确保已对代码进行更改,以使用 java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 数据源。 如果已进行更改并重新部署了代码,应用服务很可能仍会加载更新的容器。 等待几分钟,然后刷新页面。

常见问题解答

此设置花费有多大?

所创建资源的定价如下所示:

  • 应用服务计划在基本层中创建,可以进行纵向扩展或缩减。 请参阅应用服务定价
  • MySQL 灵活服务器在 B1ms 层中创建,可以纵向扩展或缩减。 使用 Azure 免费帐户时,B1ms 层在 12 个月内免费,不能超过每月限制。 参阅 Azure Database for MySQL 定价
  • Azure Cache for Redis 是在缓存大小最小的基本层中创建的。 此层的相关成本很低。 你可将其纵向扩展到更高的性能层,以实现更高的可用性、聚类分析和其他功能。 请查阅 Azure Cache for Redis 定价
  • 除非配置额外的功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价
  • 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价

如何使用其他工具连接到虚拟网络后面的 MySQL 服务器?

  • Tomcat 容器当前也没有 mysql-client 终端。 如果需要,则必须手动安装它。 请记住,你安装的任何内容都不会在应用重启时保留。
  • 若要从 MySQL Workbench 等桌面工具进行连接,计算机必须位于虚拟网络中。 例如,它可以是其中某个子网中的 Azure VM,也可以是与 Azure 虚拟网络建立站点到站点 VPN 连接的本地网络中的计算机。
  • 还可以将 Azure Cloud Shell 与虚拟网络集成。

本地应用开发如何与 GitHub Actions 配合使用?

以应用服务中自动生成的工作流文件为例,每个 git push 都会启动新的生成和部署运行。 从 GitHub 存储库的本地克隆中,进行所需更新并推送到 GitHub。 例如:

git add .
git commit -m "<some-message>"
git push origin main

我无权创建用户分配的标识

请参阅从部署中心设置 GitHub Actions 部署

我可以在 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 应用。

了解如何使用自定义域和证书保护应用。