如何将事件从 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

启用事件网格资源提供程序

  1. 如果以前未在 Azure 订阅中使用过事件网格,则可能需要注册事件网格资源提供程序。 运行以下命令,注册提供程序:

    az provider register --namespace Microsoft.EventGrid
    
  2. 完成注册可能需要一些时间。 若要查看状态,请运行以下命令:

    az provider show --namespace Microsoft.EventGrid --query "registrationState"
    

    registrationStateRegistered 后,即可继续。

订阅注册表事件

在事件网格中订阅一个主题,以告知你要跟踪哪些事件,以及要将事件发送到何处。 命令 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 事件。