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

教程:将 Quarkus Web 应用部署到 Azure 应用服务和 PostgreSQL

在本教程中,将使用 Azure Database for PostgreSQL 关系数据库服务将数据驱动的 Quarkus Web 应用程序部署到 Azure 应用服务。 Azure 应用服务支持 Windows 或 Linux 服务器环境中的 Java Standard Edition (Java SE)。

将数据存储在 PostgreSQL 中的 Quarkus 应用屏幕截图。

本教程中,您将学习如何:

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

先决条件

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

跳到末尾

如果只想查看在 Azure 中运行的本教程中的示例应用,只需在 Azure Cloud Shell 中运行以下命令,并按照提示操作:

mkdir msdocs-quarkus-postgresql-sample-app
cd msdocs-quarkus-postgresql-sample-app
azd init --template msdocs-quarkus-postgresql-sample-app
azd up

1.运行示例

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

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

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

步骤 2:在 GitHub 分支中:

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

步骤 3:在 codespace 终端中

  1. 运行 mvn quarkus:dev
  2. 忽略通知 Your application running on port 5005 is available.
  3. 看到通知 Your application running on port 8080 is available. 时,选择“在浏览器中打开”。 应在新的浏览器选项卡中看到该示例应用程序。要停止 Quarkus 开发服务器,键入 Ctrl+C

有关如何创建 Quarkus 示例应用程序的详细信息,请参阅 Quarkus 文档“使用 Panache 的简化 Hibernate ORM”“在 Quarkus 中配置数据源”

提示

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

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

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

2.创建应用服务和 PostgreSQL

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

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

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

步骤 1:在 Azure 门户中:

  1. 在顶部搜索栏中,键入“应用服务”
  2. 在“服务”标题下选择标有“应用服务”的项
  3. 选择“创建”“Web 应用”>。 还可以直接导航到创建向导

步骤 2:配置新应用 按如下所示填写表单。

  1. 名称msdocs-quarkus-postgres。 将为您生成一个名为 msdocs-quarkus-postgres_group 的资源组。
  2. 运行时堆栈:Java 21。
  3. Java Web 服务器堆栈:Java SE(嵌入式 Web 服务器)
  4. 作系统Linux
  5. 区域:你附近的任何 Azure 区域。
  6. Linux 计划新建 并使用名称 msdocs-quarkus-postgres
  7. 定价计划基本 B1。 准备就绪后,可以纵向扩展到不同的定价层。

步骤 3:添加数据库

  1. 选择“ 数据库 ”选项卡。
  2. 选择“ 创建数据库”。
  3. 引擎中,选择 PostgreSQL 灵活服务器。 默认情况下,服务器名称和数据库名称设置为适当的值。

步骤 4:配置 GitHub 部署

  1. 选择“ 部署 ”选项卡。
  2. 选择 “持续部署”。
  3. 如果是首次在应用服务中配置 GitHub 部署,请选择“ 授权 ”并使用 GitHub 帐户进行身份验证。
  4. 组织中,选择 GitHub 别名。
  5. 在“存储库”中,选择“msdocs-quarkus-postgresql-sample-app”
  6. 在“分支”中,选择“starter-no-infra”。
  7. 选择“查看 + 创建”。
  8. 验证完成后,选择“创建”。 默认情况下,创建向导会 为工作流创建用户分配的标识 ,以便使用 Microsoft Entra (OIDC 身份验证)进行身份验证。 要了解其他身份验证选项,请参阅使用 GitHub Actions 部署到应用服务

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

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

3.安全连接机密

创建向导已经为你生成了连接变量作为应用设置。 但是,安全最佳做法是将机密完全排除在应用服务之外。 你将把机密移动到密钥保管库,并借助服务连接器将应用程序设置更改为密钥保管库引用

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

  1. 在应用服务页面的左侧菜单中,选择“设置”>“环境变量”
  2. 选择“连接字符串”
  3. 选择“AZURE_POSTGRESQL_CONNECTIONSTRING”。
  4. “值”字段中的“添加/编辑应用程序”设置中,找到字符串末尾的用户 ID=Password= 部分。
  5. 复制 用户 ID=Password= 之后的用户名和密码字符串,供以后使用。 此应用设置允许连接到受专用终结点保护的 Postgres 数据库。 但是,机密直接保存在应用服务应用中,这不是最好的做法。 你将对此进行更改。

步骤 2:创建用于保护 Key Vault 的子网 虚拟网络已有两个现有子网,但其中一个已委托给应用服务,另一个已委托给 Azure Database for PostgreSQL。 您可以创建另一个终结点以通过专用终结点安全访问 Key Vault(有关详细信息,请参阅 Azure Key Vault 的网络安全)。

  1. 在“应用服务”页的左侧菜单中,选择“ 概述 ”选项卡。
  2. 选择应用的资源组。
  3. 选择资源组中的虚拟网络。
  4. 在虚拟网络的左侧菜单中,选择 “设置 > 子网”。
  5. 选择“+ 子网”。
  6. “名称”中,键入 subnet-keyvault。 接受默认值。
  7. 选择 并添加

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

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

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

  1. 选择“网络”选项卡。
  2. 取消选择“启用公共访问”
  3. 选择“创建专用终结点”。
  4. 资源组中,选择 msdocs-quarkus-postgres_group
  5. 在对话框中,在“位置”中,选择与应用服务应用相同的位置。
  6. “名称”中,键入 msdocs-quarkus-postgresVaultEndpoint
  7. 虚拟网络中,选择 vnet-xxxxxxx
  8. 子网中, 子网密钥保管库
  9. 选择“确定”
  10. 选择查看 + 创建,然后选择创建。 等待密钥保管库部署完成。 应会看到“部署已完成”。

步骤 5:创建 PostgreSQL 连接器

  1. 在顶部搜索栏中,键入 msdocs-quarkus-postgres,然后选择名为 msdocs-quarkus-postgres 的应用服务资源。
  2. 在“应用服务”页的左侧菜单中,选择 “设置 > 服务连接器 > 创建”。
  3. “服务类型”中,选择 “DB for PostgreSQL 灵活服务器”。
  4. PostgreSQL 灵活服务器中,应已选择 msdocs-quarkus-postgres-server
  5. PostgreSQL 数据库中,选择 msdocs-quarkus-postgres-database
  6. “客户端类型”中,选择 “Java”。

步骤 6:在密钥保管库中保存机密

  1. 选择“身份验证”选项卡。
  2. 选择“连接字符串”。
  3. “用户名和密码”中,粘贴之前复制的密码。
  4. 选择“在密钥保管库中存储机密”。
  5. 在“密钥保管库连接”下,选择“创建新连接”。 在编辑对话框顶部打开“创建连接”对话框。

步骤 7:建立 Key Vault 连接

  1. 在密钥保管库连接的“创建连接”对话框中,在“密钥保管库”中选择之前创建的密钥保管库
  2. 客户端类型中,选择 Java 以保持一致性。 应用程序代码实际上不会直接使用密钥保管库。
  3. 选择 审阅 + 创建
  4. 验证完成后,选择“创建”。

步骤 8:完成 PostgreSQL 连接器设置

  1. 返回到 PostgreSQL 连接器的编辑对话框。 在“身份验证”选项卡中,等待创建密钥保管库连接器。 完成后,“密钥保管库连接”下拉列表会自动选择相应选项。
  2. 选择 审阅 + 创建
  3. 验证完成后,选择“创建”。 等待 创建成功 通知出现。

步骤 9:验证 Key Vault 集成

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

步骤 10:从应用服务中删除数据库凭据

  1. 选择 “连接字符串 ”选项卡。
  2. AZURE_POSTGRESQL_CONNECTIONSTRING右侧,选择“ 删除”。 请记住,创建向导在开始时为你创建了此连接字符串。

总之,保护连接机密的过程包括:

  • 从应用服务应用的环境变量中检索连接机密。
  • 使用专用终结点创建密钥保管库。
  • 使用系统分配的托管标识创建 Key Vault 连接。
  • 创建服务连接器以将连接机密存储在密钥保管库中。
  • 从应用服务应用中删除旧的连接机密。

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

4.部署示例代码

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

注意以下事项:

  • 默认情况下,Quarkus 侦听端口 8080。 在生产环境中,需要将其配置为侦听应用服务中环境变量指定的 PORT 端口。
  • 部署的 Java 包必须是 Uber-Jar
  • 为简化教程,在部署过程中禁用测试。 GitHub Actions 运行程序无权访问 Azure 中的 PostgreSQL 数据库,因此需要数据库访问权限的任何集成测试都将失败(Quarkus 示例应用程序就是这种情况)。

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

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

  1. 选择“聊天”视图,然后选择 +,即可开始新的聊天会话。
  2. 问:“@workspace应用如何连接到数据库?Copilot 可能会提供有关 Quarkus 数据源设置在 src/main/resources/application.properties 中的配置方式的一些说明。
  3. 例如,“@workspace我使用 Java 客户端类型在 Azure 应用服务中创建 PostgreSQL 服务连接器,并且应用设置名称AZURE_POSTGRESQL_CONNECTIONSTRING。我想在生产环境中运行应用时使用此连接字符串。Copilot 可能会为你提供类似于选项 2 中的代码建议 :没有 GitHub Copilot 步骤,甚至告诉你在 src/main/resources/application.properties 文件中进行更改。
  4. 在资源管理器中打开 src/main/resources/application.properties 并添加代码建议。
  5. 请说,“@workspace 我该如何配置这个项目来创建 Uber Jar?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告知在 src/main/resources/application.properties 文件中进行更改。
  6. 在资源管理器中打开 src/main/resources/application.properties 并添加代码建议。
  7. 请说,“@workspace 如何使用应用服务端口?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告知在 src/main/resources/application.properties 文件中进行更改。
  8. 在资源管理器中打开 src/main/resources/application.properties 并添加代码建议。 GitHub Copilot 不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅如何在我的代码空间中使用 GitHub Copilot?

步骤 2 (选项 2:没有 GitHub Copilot):

  1. 在资源管理器中打开 src/main/resources/application.properties。 Quarkus 使用此文件加载 Java 属性。
  2. 取消评论第 10-12 行。 这些设置使用使用 PostgreSQL 连接器创建的应用设置,创建 Uber Jar,并将端口设置为应用服务使用的端口。

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

  1. 问:“@workspace对于 GitHub Actions 部署,我想跳过测试以避免与数据库相关的错误。Copilot 可能会为你提供类似于选项 2 中的代码建议 :没有 GitHub Copilot 步骤,甚至告诉你在 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml 文件中进行更改。
  2. 在资源管理器中打开 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml,并添加代码建议。 有关提示,请参阅如何在我的代码空间中使用 GitHub Copilot?

步骤 3 (选项 2:没有 GitHub Copilot):

  1. 在资源管理器中打开 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml。 这是创建向导为你创建的 GitHub Actions 工作流。
  2. 找到该 Build with Maven 步骤,并将命令修改 runmvn clean install -DskipTests-DskipTests 告知 Maven 跳过测试,以便部署不会在数据库错误时失败。 GitHub Actions 容器无法连接到 PostgreSQL 服务器。

步骤 4:

  1. 选择“源代码管理”扩展。
  2. 在文本框中,键入类似 Configure DB and deployment 的提交消息。 或者,选择 ,让 GitHub Copilot 为你生成提交消息。
  3. 选择“提交”,然后使用“是”进行确认
  4. 选择“同步更改 1”,然后使用“确定”进行确认。

步骤 5:

  1. 在左侧菜单中,选择 “部署>中心>日志”。
  2. 在部署运行的日志项中,选择具有最新时间戳的“生成/部署日志”条目。

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

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

5.浏览到应用

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

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

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

6.流式传输诊断日志

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

private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());

@GET
public List<FruitEntity> get() {
    LOGGER.info("In FruitEntityResource.get()");
    return FruitEntity.listAll(Sort.by("name"));
}

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

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

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

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

7.清理资源

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

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

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

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

步骤 3:

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

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

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

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

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

  1. 从 GitHub codespace 的存储库根目录运行 azd init

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

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

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

    azd provision
    

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

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

    • 资源组:所有已创建资源的容器。
    • 应用服务计划:为应用服务定义计算资源。 将创建基本层中的 Linux 计划。
    • 应用服务:表示应用并在应用服务计划中运行。
    • 虚拟网络:与应用服务应用集成,并隔离后端网络流量。
    • 专用终结点:虚拟网络中密钥保管库和 Redis 缓存的访问终结点。
    • 网络接口:表示专用 IP 地址,每个专用终结点各一个。
    • Azure Database for PostgreSQL 灵活服务器:只能从虚拟网络内部访问。 你的数据库和用户创建于此服务器上。
    • 专用 DNS 区域:在虚拟网络中启用 PostgreSQL 服务器的 DNS 解析。
    • Log Analytics 工作区:充当应用日志传送的目标容器,还可以在其中查询日志。
    • Azure Redis 缓存:只能从其专用终结点后面访问。
    • 密钥保管库:只能通过其专用私有端点进行访问。 用于管理应用服务应用的机密。
  5. 预配完成后,在 AZD 输出中找到设置 AZURE_POSTGRESQL_CONNECTIONSTRING 。 为保护机密安全,只会显示设置名称。 它们在 AZD 输出中如下所示:

     App Service app has the following connection settings:
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
     

    你使用的 AZD 模板已为你生成了连接变量作为应用设置,并将它们输出到终端,以方便你使用。 使用应用设置可以将连接机密保留在代码存储库之外。 还可以找到指向所创建应用服务应用的应用设置页面的直接链接。

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

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

必须对应用程序代码进行一些更改才能使其适用于应用服务:

  • 默认情况下,Quarkus 侦听端口 8080。 在生产环境中,需要将其配置为侦听应用服务中环境变量指定的 PORT 端口。
  • 部署的 Java 包必须是 Uber-Jar
  • 为简化教程,在部署过程中禁用测试。 GitHub Actions 运行程序无权访问 Azure 中的 PostgreSQL 数据库,因此需要数据库访问权限的任何集成测试都将失败(Quarkus 示例应用程序就是这种情况)。
  1. 在 GitHub codespace 中,选择“聊天”视图,然后选择 +,即可开始新的聊天会话。

  2. 问:“@workspace应用如何连接到数据库?Copilot 可能会提供一些说明,说明 如何在 src/main/resources/application.properties 中配置 quarkus 数据源设置。

  3. 例如,“@workspace我在 Azure 应用服务中使用 Java 客户端类型创建了 PostgreSQL 服务连接器,并且应用设置名称AZURE_POSTGRESQL_CONNECTIONSTRING。我想在生产环境中运行应用时使用此连接字符串。Copilot 可能会为你提供类似于选项 2 中的代码建议 :没有 GitHub Copilot 步骤,甚至告诉你在 src/main/resources/application.properties 文件中进行更改。

  4. src/main/resources/application.properties 中添加代码建议。

  5. 请说,“@workspace 我该如何配置这个项目来创建 Uber Jar?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告知在 src/main/resources/application.properties 文件中进行更改。

  6. src/main/resources/application.properties 中添加代码建议。

  7. 请说,“@workspace 如何使用应用服务端口?”Copilot 可能会向你提供与下面的“选项 2:不使用 GitHub Copilot”步骤中的代码建议类似的代码建议,甚至会告知在 src/main/resources/application.properties 文件中进行更改。

  8. src/main/resources/application.properties 中添加代码建议。

    GitHub Copilot 不会每次都提供相同的响应,而且并不总是正确的。 可能需要提出更多问题来微调其响应。 有关提示,请参阅如何在我的代码空间中使用 GitHub Copilot?

  9. 在终端中运行 azd deploy

    azd deploy
    

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

5.浏览到应用

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

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. 向列表中添加一些水果。

    在 Azure 中运行 PostgreSQL 的 Quarkus Web 应用的屏幕截图,其中显示了水果列表。

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

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

6.流式传输诊断日志

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

示例应用程序包括标准 JBoss 日志记录语句,用于演示此功能,如下所示。

private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());

@GET
public List<FruitEntity> get() {
    LOGGER.info("In FruitEntityResource.get()");
    return FruitEntity.listAll(Sort.by("name"));
}

在 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 应用中的日志记录。

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

7.清理资源

若要删除当前部署环境中的所有 Azure 资源,请运行 azd down 并按照提示进行操作。

azd down

故障排除

GitHub Actions 在生成阶段运行失败

选择失败的生成阶段以查看哪个步骤失败。 如果是使用 Maven 构建步骤,请展开该步骤以验证是否使用了-DskipTests选项。 如果没有,请返回 4。根据说明部署示例代码 并修改 GitHub 工作流文件。

应用无法启动并显示日志流中的以下错误:“模型类是为默认持久性单元 <默认值> 定义的,但未找到配置的数据源 <默认值> :不会创建默认 EntityManagerFactory。

此 Quarkus 错误很可能是因为应用无法连接到 Azure 数据库所致。 确保应用设置 AZURE_POSTGRESQL_CONNECTIONSTRING 尚未更改,并且 application.properties 正确使用应用设置

应用无法启动,日志流显示“正在等待对容器的预热请求的响应”

应用程序可能未配置为侦听应用服务 PORT 环境变量指定的端口,因此它无法响应任何请求。 如果应用服务未从应用程序获取响应,则假定应用程序无法启动。 返回到 4。部署示例代码 并验证 application.properties 是否已正确配置。

应用程序正常运行,但我在错误日志中看到“ERROR [org.acm.hib.orm.pan.ent.FruitEntityResource](vert.x-eventloop-thread-0)处理请求失败:jakarta.ws.rs.NotFoundException:HTTP 404 未找到”。

这是一个 Vert.x 错误(请参阅 Quarkus 反应体系结构),指示客户端请求了未知路径。 当客户端在 Hibernate 数据库迁移发生之前请求 REST API 时,首次启动应用时,可能会发生这种情况。

在应用服务中,每个应用启动时也会发生此错误,因为应用服务通过向该应用发送 GET 请求 /robots933456.txt来验证应用是否启动。

常见问题

此设置花费有多大?

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

  • 应用服务计划在基本层中创建,可以进行纵向扩展或缩减。 请参阅应用服务定价
  • PostgreSQL 灵活服务器是在最低可突发层 Standard_B1ms 中创建的,该层提供最小的存储大小,但可以纵向扩展或缩减。 请参阅 Azure Database for PostgreSQL 定价
  • 除非配置额外的功能(例如对等互连),否则虚拟网络不会产生费用。 请参阅 Azure 虚拟网络定价
  • 专用 DNS 区域会产生少量费用。 请参阅 Azure DNS 定价

如何使用其他工具连接到在虚拟网络后面受保护的 PostgreSQL 服务器?

  • 要从命令行工具进行基本访问,可以从应用的 SSH 终端运行 psql
  • 若要从桌面工具进行连接,计算机必须位于虚拟网络中。 例如,这可以是连接到某个子网的 Azure 虚拟机,也可以是与 Azure 虚拟网络建立站点到站点 VPN 连接的本地网络中的计算机。
  • 还可以将 Azure Cloud Shell 与虚拟网络集成。

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

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

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

如果想要在 GitHub 工作流中使用 PostgreSQL 运行测试,该怎么办?

默认 Quarkus 示例应用程序包括数据库连接性测试。 为避免连接错误,添加了 -skipTests 属性。 如果需要,可针对 PostgreSQL 服务容器运行测试。 例如,在 GitHub 分支中自动生成的工作流文件 (.github/workflows/main_cephalin-quarkus.yml) 中,进行以下更改:

  1. 将 PostgreSQL 容器的 YAML 代码添加到 build 作业,如以下代码片段所示。

    ...
    jobs:
      build:
        runs-on: ubuntu-latest
    
        # BEGIN CODE ADDITION
        container: ubuntu
        services:
          # Hostname for the PostgreSQL container
          postgresdb:
            image: postgres
            env:
              POSTGRES_PASSWORD: postgres
              POSTGRES_USER: postgres
              POSTGRES_DB: postgres
            # Set health checks to wait until postgres has started
            options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
    
        # END CODE ADDITION
    
        steps:
          - uses: actions/checkout@v4
          ...
    

    container: ubuntu 告知 GitHub 在容器中运行 build 作业。 这样,开发环境 jdbc:postgresql://postgresdb:5432/postgres 中的连接字符串在工作流运行时可按原样工作。 有关 GitHub Actions 中的 PostgreSQL 连接的详细信息,请参阅创建 PostgreSQL 服务容器

  2. Build with Maven 步骤中,删除 -DskipTests。 例如:

          - name: Build with Maven
            run: mvn clean install -Dquarkus.package.type=uber-jar
    

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

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

我可以在我的代码空间中使用 GitHub Copilot 做些什么?

你可能已经注意到,创建 codespace 时,GitHub Copilot 聊天视图已经存在。 不过,你需要一个 GitHub Copilot 帐户(可免费试用 30 天)。

下面是与 GitHub Copilot 交谈时的一些提示:

  • 在单次聊天会话中,问题和答案相互关联,你可以调整问题来微调所获得的答案。
  • 默认情况下,GitHub Copilot 无法访问你存储库中的任何文件。 若要询问有关文件的问题,请首先在编辑器中打开该文件。
  • 为了让 GitHub Copilot 在准备答案时有权访问存储库中的所有文件,请在问题开头加上 @workspace。 有关详细信息,请参阅 Use the @workspace agent
  • 在聊天会话中,GitHub Copilot 可以建议更改,甚至可以(在使用 @workspace 时)建议在何处进行更改,但系统不允许它为你进行更改。 你可以自行添加建议的更改并对其进行测试。

后续步骤

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

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