你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
发布到命名空间主题并使用 Azure 事件网格中的事件
本文快速介绍使用 curl
bash shell 命令发布、接收和确认事件的拉取传递。 事件网格资源使用 CLI 命令创建。 本文适用于拉取传递功能的快速测试。 有关使用数据平面 SDK 的示例代码,请参阅 .NET 或 Java 示例。 对于 Java,我们在以下两篇文章中提供了示例代码:发布事件和接收事件快速入门。
有关拉取传递模型的详细信息,请参阅概念和拉取传递概述文章。
如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户。
先决条件
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
- 本文需要 Azure CLI 版本 2.0.70 或更高版本。 如果使用 Azure Cloud Shell,则最新版本已安装。
创建资源组
使用 az group create 命令创建 Azure 资源组。 你使用此资源组来包含本文中创建的所有资源。
使用 Cloud Shell 运行命令的一般步骤如下:
- 选择“打开 Cloud Shell”,可在右侧窗格中看到“Azure Cloud Shell”窗口。
- 复制命令并将其粘贴到 Azure Cloud Shell 窗口。
- 按 Enter 以运行该命令。
声明一个变量来保存 Azure 资源组的名称。 通过将
<your-resource-group-name>
替换为所需的值来指定资源组的名称。resource_group="<your-resource-group-name>"
创建资源组。 适当地更改位置。
az group create --name $resource_group --location eastus
启用事件网格资源提供程序
如果以前未在 Azure 订阅中使用过事件网格,则可能需要注册事件网格资源提供程序。 运行以下命令,注册提供程序:
az provider register --namespace Microsoft.EventGrid
完成注册可能需要一些时间。 若要查看状态,请运行以下命令:
az provider show --namespace Microsoft.EventGrid --query "registrationState"
当
registrationState
为Registered
后,即可继续。
创建命名空间
事件网格命名空间提供用户定义的终结点,事件将发布到该终结点。 以下示例在 Azure Cloud Shell 中使用 Bash 在资源组中创建一个命名空间。 命名空间名称必须唯一,因为它是域名系统 (DNS) 条目的一部分。 命名空间名称应符合以下规则:
- 应包含 3-50 个字符。
- 应在整个区域中唯一。
- 只允许使用字符 a-z、A-Z、0-9 和 -
- 不能以
Microsoft
、System
或EventGrid
等保留的关键字前缀开头。
声明一个变量来保存事件网格命名空间的名称。 通过将
<your-namespace-name>
替换为所需的值来指定命名空间的名称。namespace="<your-namespace-name>"
创建命名空间。 你可能需要更改它的部署位置。
az eventgrid namespace create -g $resource_group -n $namespace -l eastus
创建命名空间主题
创建一个主题来保存发布到命名空间终结点的所有事件。
声明一个变量来保存命名空间主题的名称。 通过将
<your-topic-name>
替换为所需的值来指定命名空间主题的名称。topic="<your-topic-name>"
创建命名空间主题:
az eventgrid namespace topic create -g $resource_group -n $topic --namespace-name $namespace
创建事件订阅
创建一个事件订阅,并将其传递模式设置为支持拉取传递的队列。 有关所有配置选项的详细信息,请查看最新的事件网格控制平面 REST API。
声明一个变量来保存命名空间主题的事件订阅的名称。 通过将
<your-event-subscription-name>
替换为所需的值来指定事件订阅的名称。event_subscription="<your-event-subscription-name>"
创建命名空间主题的事件订阅:
az eventgrid namespace topic event-subscription create -g $resource_group --topic-name $topic -n $event_subscription --namespace-name $namespace --delivery-configuration "{deliveryMode:Queue,queue:{receiveLockDurationInSeconds:300,maxDeliveryCount:4,eventTimeToLive:P1D}}"
将事件发送到主题
现在,按照本部分中的步骤将示例事件发送到命名空间主题。
列出命名空间访问密钥
获取与你创建的命名空间关联的访问密钥。 发布事件时,你将使用其中一个密钥进行身份验证。 若要列出密钥,首先需要完整的命名空间资源 ID。 通过运行以下命令获取它:
namespace_resource_id=$(az eventgrid namespace show -g $resource_group -n $namespace --query "id" --output tsv)
从命名空间获取第一个密钥:
key=$(az eventgrid namespace list-key -g $resource_group --namespace-name $namespace --query "key1" --output tsv)
发布事件
检索命名空间主机名。 你将使用该主机名来编写要将事件发送到的命名空间 HTTP 终结点。 以下操作最初在 API 版本
2023-06-01-preview
中提供。publish_operation_uri="https://"$(az eventgrid namespace show -g $resource_group -n $namespace --query "topicsConfiguration.hostname" --output tsv)"/topics/"$topic:publish?api-version=2023-06-01-preview
创建一个符合 CloudEvents 规范的示例事件:
event=' { "specversion": "1.0", "id": "'"$RANDOM"'", "type": "com.yourcompany.order.ordercreatedV2", "source" : "/mycontext", "subject": "orders/O-234595", "time": "'`date +%Y-%m-%dT%H:%M:%SZ`'", "datacontenttype" : "application/json", "data":{ "orderId": "O-234595", "url": "https://yourcompany.com/orders/o-234595"}} '
data
元素是事件的有效负载。 可以将任何格式正确的 JSON 置于此字段中。 若要详细了解可在事件中添加的属性(也称为上下文属性),请查看 CloudEvents 规范。使用 CURL 向主题发送事件。 CURL 是发送 HTTP 请求的实用工具。
curl -X POST -H "Content-Type: application/cloudevents+json" -H "Authorization:SharedAccessKey $key" -d "$event" $publish_operation_uri
接收事件
使用引用事件订阅的终结点从事件网格接收事件。
通过运行以下命令编写该终结点:
receive_operation_uri="https://"$(az eventgrid namespace show -g $resource_group -n $namespace --query "topicsConfiguration.hostname" --output tsv)"/topics/"$topic/eventsubscriptions/$event_subscription:receive?api-version=2023-06-01-preview
提交使用事件的请求:
curl -X POST -H "Content-Type: application/json" -H "Authorization:SharedAccessKey $key" $receive_operation_uri
确认事件
收到事件后,将该事件传递给应用程序进行处理。 成功处理事件后,该事件不再需要位于事件订阅中。 若要指示事件网格删除事件,请使用在接收操作的响应中获取的锁定令牌确认该事件。
在上一步骤中,你应已收到一个响应,其中包含一个具有
lockToken
属性的brokerProperties
对象。 复制锁定令牌值,并在环境变量中设置该值:lockToken="<paste-the-lock-token-here>"
现在,生成确认操作有效负载,它将为你要确认的事件指定锁定令牌。
acknowledge_request_payload=' { "lockTokens": ["'$lockToken'"]} '
继续使用确认操作 URI 生成字符串:
acknowledge_operation_uri="https://"$(az eventgrid namespace show -g $resource_group -n $namespace --query "topicsConfiguration.hostname" --output tsv)"/topics/"$topic/eventsubscriptions/$event_subscription:acknowledge?api-version=2023-06-01-preview
最后,提交请求以确认收到事件:
curl -X POST -H "Content-Type: application/json" -H "Authorization:SharedAccessKey $key" -d "$acknowledge_request_payload" $acknowledge_operation_uri
如果在锁定令牌过期(我们在创建事件订阅时已将其设置为 300 秒)之前执行确认操作,则应会看到类似于以下示例的响应:
{"succeededLockTokens":["CiYKJDQ4NjY5MDEyLTk1OTAtNDdENS1BODdCLUYyMDczNTYxNjcyMxISChDZae43pMpE8J8ovYMSQBZS"],"failedLockTokens":[]}
后续步骤
若要详细了解拉取传递模型,请参阅拉取传递概述。