使用 Azure 门户和 Azure 事件网格将自定义事件路由到 Web 终结点

事件网格是一项全面托管的服务,可用于在许多不同的 Azure 服务和应用程序中轻松管理事件。 它简化了生成事件驱动的应用程序和无服务器应用程序的过程。 有关服务的概述,请参阅事件网格概述

在本文中,你将使用 Azure 门户执行以下任务:

  1. 创建自定义主题。
  2. 订阅自定义主题。
  3. 触发事件。
  4. 查看结果。 通常,你会将事件发送到处理事件数据并执行操作的终结点。 但是,为了简化本文,你将事件发送到收集并显示消息的 Web 应用。

先决条件

如果没有 Azure 订阅,可在开始前创建一个试用帐户

注册事件网格资源提供程序

除非你以前用过事件网格,否则你需要注册事件网格资源提供程序。 如果你以前用过事件网格,请转到下一部分。

在 Azure 门户中,执行以下步骤:

  1. 在左侧菜单中选择“订阅”。

  2. 从订阅列表中选择要用于事件网格的订阅。

  3. 在“订阅”页左侧菜单的“设置”下,选择“资源提供程序”。

  4. 搜索 Microsoft.EventGrid,并确认“状态”为“未注册”。

  5. 在提供程序列表中选择“Microsoft.EventGrid”。

  6. 在命令栏上选择“注册”。

    Image showing the registration of Microsoft.EventGrid provider with the Azure subscription.

  7. 刷新以确保 Microsoft.EventGrid 的状态更改为“已注册”。

    Image showing the successful registration of Microsoft.EventGrid provider with the Azure subscription.

创建自定义主题

事件网格主题提供用户定义的终结点,可向其发布事件。

  1. 登录到 Azure 门户

  2. 在主题的搜索栏中,键入“事件网格主题”,然后从下拉列表中选择“事件网格主题” 。

    Screenshot showing the Azure port search bar to search for Event Grid topics.

  3. 在“事件网格主题”页上的工具栏中选择“+ 创建”。

    Screenshot showing the Create Topic button on Event Grid topics page.

  4. 在“创建主题”页上执行以下步骤:

    1. 选择 Azure 订阅

    2. 选择现有的资源组,或者选择“新建”并输入资源组名称

    3. 为自定义主题提供唯一的名称。 主题名称必须唯一,因为它由 DNS 条目表示。 请不要使用图中所示的名称。 而是创建自己的名称 - 它必须介于 3 到 50 个字符之间,并且只包含值 a-z、A-Z、0-9 和“-”。

    4. 选择事件网格主题的位置。

    5. 在页面底部选择“查看 + 创建”。

      Create Topic page

    6. 在“创建主题”页的“查看 + 创建”选项卡上,选择“创建” 。

      Review settings and create

  5. 部署成功后,选择“转到资源”以导航到主题的“事件网格主题”页。 请将此页保持打开状态, 稍后在本快速入门中需要使用此页。

    Screenshot showing the Event Grid topic home page.

    注意

    为了简化快速入门,将仅使用“基本信息”页来创建主题。 有关在向导的其他页面上配置网络、安全性和数据驻留设置的详细步骤,请参阅创建自定义主题

创建消息终结点

在为自定义主题创建订阅之前,请先创建事件消息的终结点。 通常情况下,终结点基于事件数据执行操作。 为了简化此快速入门,将部署用于显示事件消息的预生成 Web 应用。 所部署的解决方案包括应用服务计划、应用服务 Web 应用和 GitHub 中的源代码。

  1. 在项目页中,选择“部署到 Azure”以将解决方案部署到订阅。 在 Azure 门户中,为参数提供值。

    Button to deploy to Azure.

  2. 在“自定义部署”页上执行以下步骤:

    1. 对于“资源组”,请选择你在创建存储帐户时创建的资源组。 这样就可以在完成本教程后,通过删除资源组来更轻松地进行清理。

    2. 对于“站点名称”,请输入 Web 应用的名称。

    3. 对于“托管计划名称”,请输入用于托管 Web 应用的应用服务计划的名称。

    4. 选择“查看 + 创建”。

      Screenshot showing the Custom deployment page.

  3. 在“查看 + 创建”页面上,选择“创建”。

  4. 部署可能需要几分钟才能完成。 在门户中选择“警报”(钟形图标),然后选择“转到资源组”。

    Screenshot showing the successful deployment message with a link to navigate to the resource group.

  5. 在“资源组”页上,在资源列表中,选择你创建的 Web 应用。 在此列表中还可以看到应用服务计划和存储帐户。

    Screenshot that shows the Resource Group page with the deployed resources.

  6. 在 Web 应用的“应用服务”页上,选择相应的 URL 以导航到该网站。 URL 应采用以下格式:https://<your-site-name>.chinacloudsites.cn

    Screenshot that shows the App Service page with the link to the site highlighted.

  7. 确认你可以看到站点,但尚未有任何事件发布到站点。

    Screenshot that shows the Event Grid Viewer sample app.

订阅自定义主题

订阅事件网格主题,以告知事件网格你要跟踪哪些事件,以及要将事件发送到何处。

  1. 现在,请在自定义主题的“事件网格主题”页上的工具栏中,选择“+ 事件订阅”。

    Add event subscription button

  2. 在“创建事件订阅”页上执行以下步骤:

    1. 输入事件订阅的“名称” 。

    2. 对于“终结点类型”,请选择“Web Hook”。

    3. 选择“选择终结点”。

      Provide event subscription values

    4. 对于 Webhook 终结点,请提供你的 Web 应用的 URL,并将 api/updates 添加到主页 URL。 选择“确认所选内容” 。

      Provide endpoint URL

    5. 返回“创建事件订阅”页,选择“创建”。

  3. 再次查看 Web 应用,并注意现已向该应用发送了订阅验证事件。 选择眼睛图标以展开事件数据。 事件网格发送验证事件,以便终结点可以验证它是否想要接收事件数据。 Web 应用包含用于验证订阅的代码。

    Screenshot of the Event Grid Viewer app with the Subscription Validated event.

向主题发送事件

现在,让我们触发一个事件,看事件网格如何将消息分发到终结点。 使用 Azure CLI 或 PowerShell 向自定义主题发送测试性事件。 通常情况下,应用程序或 Azure 服务会发送事件数据。

第一个示例使用 Azure CLI。 它获取自定义主题的 URL 和密钥,以及示例事件数据。 将自定义主题名称用于 <topic name>。 它将创建示例事件数据。 JSON 的 data 元素是事件的有效负载。 可以将任何格式正确的 JSON 置于此字段中。 也可将主题字段用于高级路由和筛选。 CURL 是发送 HTTP 请求的实用工具。

Azure CLI

  1. 运行以下命令以获取主题的终结点:复制并粘贴该命令后,更新主题名称资源组名称,然后运行该命令。 你会将示例事件发布到此主题终结点。

    endpoint=$(az eventgrid topic show --name <topic name> -g <resource group name> --query "endpoint" --output tsv)
    
  2. 运行以下命令以获取自定义主题的密钥:复制并粘贴该命令后,更新主题名称资源组名称,然后运行该命令。 它是事件网格主题的主密钥。 要从 Azure 门户获取此密钥,请切换到“事件网格主题”页的“访问密钥”选项卡 。 要将事件发布到自定义主题,需要访问密钥。

    key=$(az eventgrid topic key list --name <topic name> -g <resource group name> --query "key1" --output tsv)
    
  3. 复制以下包含事件定义的语句,然后按 ENTER

    event='[ {"id": "'"$RANDOM"'", "eventType": "recordInserted", "subject": "myapp/vehicles/motorcycles", "eventTime": "'`date +%Y-%m-%dT%H:%M:%S%z`'", "data":{ "make": "Ducati", "model": "Monster"},"dataVersion": "1.0"} ]'
    
  4. 运行以下 Curl 命令以发布事件:在命令中,aeg-sas-key 标头设置为之前获得的访问密钥。

    curl -X POST -H "aeg-sas-key: $key" -d "$event" $endpoint
    

Azure PowerShell

第二个示例使用 PowerShell,执行的步骤类似。

  1. 设置以下变量。 复制并粘贴每个命令后,更新主题名称资源组名称,然后运行该命令:

    资源组:

    $resourceGroupName = "<resource group name>"
    

    事件网格主题名称:

    $topicName = "<topic name>"
    
  2. 运行以下命令以获取主题的终结点密钥

    $endpoint = (Get-AzEventGridTopic -ResourceGroupName $resourceGroupName -Name $topicName).Endpoint
    $keys = Get-AzEventGridTopicKey -ResourceGroupName $resourceGroupName -Name $topicName
    
  3. 准备事件。 在 PowerShell 窗口中复制并运行这些语句。

    $eventID = Get-Random 99999
    
    #Date format should be SortableDateTimePattern (ISO 8601)
    $eventDate = Get-Date -Format s
    
    #Construct body using Hashtable
    $htbody = @{
        id= $eventID
        eventType="recordInserted"
        subject="myapp/vehicles/motorcycles"
        eventTime= $eventDate   
        data= @{
            make="Ducati"
            model="Monster"
        }
        dataVersion="1.0"
    }
    
    #Use ConvertTo-Json to convert event body from Hashtable to JSON Object
    #Append square brackets to the converted JSON payload since they are expected in the event's JSON payload syntax
    $body = "["+(ConvertTo-Json $htbody)+"]"
    
  4. 使用 Invoke-WebRequest cmdlet 发送事件。

    Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -Headers @{"aeg-sas-key" = $keys.Key1}
    

在事件网格查看器中验证

现已触发事件,并且事件网格已将消息发送到订阅时配置的终结点。 查看 Web 应用以查看刚刚发送的事件。

Event Grid Viewer

清理资源

如果打算继续处理此事件,请不要清除本文中创建的资源。 否则,请删除本文中创建的资源。

  1. 在左侧菜单中选择“资源组”。 如果左侧菜单中未显示此选项,请在左侧菜单中选择“所有服务”,然后选择“资源组”。

    Screenshot that shows the Resource Groups page.

  2. 选择资源组以启动“资源组”页。

  3. 在工具栏中选择“删除资源组”。

  4. 输入资源组的名称以确认删除,然后选择“删除”。

后续步骤

了解如何创建自定义主题和事件订阅后,请详细了解事件网格的功能:

请查看以下示例,了解如何使用不同的编程语言将事件发布到事件网格以及如何从事件网格使用事件。