你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本快速入门介绍如何使用 curl
bash shell 命令进行拉取传递,以发布、接收和确认事件。 使用 Azure CLI 命令创建 Azure 事件网格资源。 本文适用于拉取传递功能的快速测试。
有关使用数据平面 SDK 的示例代码,请参阅以下资源:
- .NET: 从 Azure 事件网格命名空间主题发送和接收消息 (.NET)
- Java: 使用 Java 将事件发布到命名空间主题
- Java:通过 Java 使用拉取传递来接收事件
有关拉取传递模型的详细信息,请参阅 Azure 事件网格命名空间概念 和 使用 HTTP 的拉取传递 文章。
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
先决条件
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 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>"
创建资源组。 可以将位置更改为任何 Azure 位置。
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 --resource-group $resource_group --name $namespace --location eastus
创建命名空间主题
创建一个主题,用于保存发布到命名空间终结点的所有事件。
声明一个变量以保存命名空间主题的名称。 通过将
<your-topic-name>
替换为自己的值来指定命名空间主题的名称。topic="<your-topic-name>"
创建命名空间主题:
az eventgrid namespace topic create --resource-group $resource_group --name $topic --namespace-name $namespace
创建事件订阅
创建一个事件订阅,并将其传递模式设置为支持拉取传递的队列。 有关所有配置选项的详细信息,请参阅 Azure 事件网格 REST API。
声明一个变量,用于保存命名空间主题的事件订阅名称。 请用您的值替换
<your-event-subscription-name>
来指定事件订阅的名称。event_subscription="<your-event-subscription-name>"
创建命名空间主题的事件订阅:
az eventgrid namespace topic event-subscription create --resource-group $resource_group --topic-name $topic --name $event_subscription --namespace-name $namespace --delivery-configuration "{deliveryMode:Queue,queue:{receiveLockDurationInSeconds:300,maxDeliveryCount:4,eventTimeToLive:P1D}}"
将事件发送到主题
按照本部分中的步骤将示例事件发送到命名空间主题。
列出命名空间访问密钥
获取与创建的命名空间关联的访问密钥。 发布事件时需要其中一个进行身份验证。 若要列出密钥,请获取完整的命名空间资源 ID。 运行下面的命令:
namespace_resource_id=$(az eventgrid namespace show --resource-group $resource_group --name $namespace --query "id" --output tsv)
从命名空间获取第一个密钥:
key=$(az eventgrid namespace list-key --resource-group $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 --resource-group $resource_group --name $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":[]}
后续步骤
若要了解有关拉取传递模型的详细信息,请参阅 使用 HTTP 进行拉取传递。