如何将事件从 Azure SignalR 服务发送到事件网格
Azure 事件网格是一个完全托管的事件路由服务,可以通过发布-订阅模型提供一致的事件使用数据。 在本指南中,我们将使用 Azure CLI 创建 Azure SignalR 服务、订阅连接事件,然后部署一个示例 Web 应用程序来接收事件。 最后,可以连接和断开连接,并可在示例应用程序中查看事件负载。
如果没有 Azure 试用版订阅,请在开始前创建一个试用版订阅。
先决条件
如需在本地运行 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 命令已根据 Bash shell 设置了格式。 如果使用其他 shell(例如 PowerShell 或命令提示符),则可能需要相应地调整行连续字符或变量赋值行。 本文使用变量来最大程度地减少所需的命令编辑量。
创建资源组
Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 命令 az group create 在 chinaeast2 区域中创建一个名为 myResourceGroup 的资源组。 若要对资源组使用不同的名称,请将 RESOURCE_GROUP_NAME
设置为不同的值。
RESOURCE_GROUP_NAME=myResourceGroup
az group create --name $RESOURCE_GROUP_NAME --location chinaeast2
创建 SignalR 服务
接下来,使用以下命令将 Azure SignalR 服务部署到资源组中。
SIGNALR_NAME=SignalRTestSvc
az signalr create --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --sku Free_F1
创建 SignalR 服务之后,Azure CLI 将返回类似于以下示例的输出:
{
"externalIp": "13.76.156.152",
"hostName": "clitest.servicedev.signalr.azure.cn",
"hostNamePrefix": "clitest",
"id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/clitest1/providers/Microsoft.SignalRService/SignalR/clitest",
"location": "chinaeast2",
"name": "clitest",
"provisioningState": "Succeeded",
"publicPort": 443,
"resourceGroup": "clitest1",
"serverPort": 443,
"sku": {
"capacity": 1,
"family": null,
"name": "Free_F1",
"size": "F1",
"tier": "Free"
},
"tags": null,
"type": "Microsoft.SignalRService/SignalR",
"version": "1.0"
}
创建事件终结点
在本部分,我们使用 GitHub 存储库中的资源管理器模板,将一个预生成的示例 Web 应用程序部署到 Azure 应用服务。 稍后,我们将订阅该注册表的事件网格事件,并将此应用指定为事件要发送到的终结点。
若要部署示例应用,请将 SITE_NAME
设置为 Web 应用的唯一名称,并执行以下命令。 站点名称在 Azure 中必须唯一,因为它是 Web 应用的完全限定域名 (FQDN) 的一部分。 在稍后的部分,我们将在 Web 浏览器中导航到应用的 FQDN,以查看注册表的事件。
SITE_NAME=<your-site-name>
az deployment group create \
--resource-group $RESOURCE_GROUP_NAME \
--template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
--parameters siteName=$SITE_NAME hostingPlanName=$SITE_NAME-plan
部署成功后(可能需要几分钟时间),打开浏览器并转到 Web 应用,确保它正在运行:
http://<your-site-name>.chinacloudsites.cn
启用事件网格资源提供程序
如果以前未在 Azure 订阅中使用过事件网格,则可能需要注册事件网格资源提供程序。 运行以下命令,注册提供程序:
az provider register --namespace Microsoft.EventGrid
完成注册可能需要一些时间。 若要查看状态,请运行以下命令:
az provider show --namespace Microsoft.EventGrid --query "registrationState"
当
registrationState
为Registered
后,即可继续。
订阅注册表事件
在事件网格中订阅一个主题,以告知你要跟踪哪些事件,以及要将事件发送到何处。 命令 az eventgrid event-subscription create
订阅已创建的 Azure SignalR 服务,并将 Web 应用的 URL 指定为要将事件发送到的终结点。 此处可以重复使用在前面几个部分填充的环境变量,因此无需进行编辑。
SIGNALR_SERVICE_ID=$(az signalr show --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --query id --output tsv)
APP_ENDPOINT=https://$SITE_NAME.chinacloudsites.cn/api/updates
az eventgrid event-subscription create \
--name event-sub-signalr \
--source-resource-id $SIGNALR_SERVICE_ID \
--endpoint $APP_ENDPOINT
完成订阅后,应该会看到类似于以下示例的输出:
{
"deadLetterDestination": null,
"destination": {
"endpointBaseUrl": "https://$SITE_NAME.chinacloudsites.cn/api/updates",
"endpointType": "WebHook",
"endpointUrl": null
},
"filter": {
"includedEventTypes": [
"Microsoft.SignalRService.ClientConnectionConnected",
"Microsoft.SignalRService.ClientConnectionDisconnected"
],
"isSubjectCaseSensitive": null,
"subjectBeginsWith": "",
"subjectEndsWith": ""
},
"id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/Microsoft.SignalRService/SignalR/SignalRTestSvc/providers/Microsoft.EventGrid/eventSubscriptions/event-sub-signalr",
"labels": null,
"name": "event-sub-signalr",
"provisioningState": "Succeeded",
"resourceGroup": "myResourceGroup",
"retryPolicy": {
"eventTimeToLiveInMinutes": 1440,
"maxDeliveryAttempts": 30
},
"topic": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/microsoft.signalrservice/signalr/SignalRTestSvc",
"type": "Microsoft.EventGrid/eventSubscriptions"
}
触发注册表事件
将服务模式切换到 Serverless Mode
,设置一个到 SignalR 服务的客户端连接。 可以将无服务器示例作为参考。
git clone git@github.com:aspnet/AzureSignalR-samples.git
cd samples/Management
# Start the negotiation server
# Negotiation server is responsible for generating access token for clients
cd NegotitationServer
dotnet user-secrets set Azure:SignalR:ConnectionString "<Connection String>"
dotnet run
# Use a separate command line
# Start a client
cd SignalRClient
dotnet run
查看注册表事件
现在已将客户端连接到 SignalR 服务。 导航到事件网格查看器 Web 应用,应会看到 ClientConnectionConnected
事件。 如果终止客户端,还会看到 ClientConnectionDisconnected
事件。