Знакомая модель HTTP-запроса и ответа была разработана для упрощения работы с и масштабируемой моделью. Однако в настоящее время конечные пользователи требуют гораздо больше от Интернета, чем изначально он был разработан. Протокол HTTP требует от пользователей инициировать запрос, чтобы получить ответ. Но разработчикам нужен способ отправки данных с сервера на клиенты, не запрашивая его; другими словами, им нужно "отправить" данные клиентам, например отправить последнюю цену торгов продукта на аукционе или быстро движущихся цен на акции в финансовом приложении.
В этом кратком руководстве показано, как
подписка на сообщения с сервера приложений
отправка данных с сервера приложений ко всем подключенным клиентам
Внимание
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей.
Строка подключения содержит сведения об авторизации, требуемые для доступа приложения к службе Azure Web PubSub. Ключ доступа в строке подключения аналогичен паролю привилегированного пользователя для службы. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты подключения.WebPubSubServiceClient
Старайтесь не распространять ключи доступа среди других пользователей, жестко программировать их или где-то сохранять в виде обычного текста в открытом доступе для других пользователей. Меняйте свои ключи постоянно, если предполагаете, что они могут быть подобраны.
Чтобы подписаться на сообщения , отправленные с сервера приложений, клиента, будь то браузер, мобильное приложение или устройство Интернета вещей, сначала необходимо подключиться к ресурсу Web PubSub и прослушивать соответствующее событие сообщения.
Создание каталога проекта с именем subscriber и установка необходимых зависимостей
mkdir subscriber
cd subscriber
npm init -y
# The client SDK is available as a module on NPM
npm install @azure/web-pubsub-client
Подключитесь к ресурсу Web PubSub и зарегистрируйте прослушиватель для server-message события
Клиент использует URL-адрес клиентского доступа для подключения и проверки подлинности с помощью ресурса.
Этот URL-адрес следует шаблону wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token>. У клиента может быть несколько способов получения URL-адреса клиентского доступа. Для этого краткого руководства можно скопировать и вставить один из портал Azure, показанный на следующей схеме. Рекомендуется не жестко кодировать URL-адрес клиентского доступа в коде. В рабочей среде обычно настраивается сервер приложений для возврата этого URL-адреса по запросу. Создание URL-адреса клиентского доступа подробно описывает практику.
Как показано на схеме выше, клиент присоединяется к концентратору с именем myHub1.
В папке subscriber проекта создайте файл с именем subscribe.js со следующим кодом.
const { WebPubSubClient } = require("@azure/web-pubsub-client");
// Instantiates the client object
// <client-access-url> is copied from Azure portal mentioned above
const client = new WebPubSubClient("<client-access-url>")
// Registers a handler for the "server-message" event
client.on("server-message", (e) => {
console.log(`Received message ${e.message.data}`)
});
// Before a client can receive a message,
// you must invoke start() on the client object.
client.start();
Запуск программы
node subscribe.js
Теперь этот клиент устанавливает подключение к ресурсу Web PubSub и готов получать сообщения, отправленные с сервера приложений.
Создание каталога проекта с именем subscriber и установка необходимых зависимостей
mkdir subscriber
cd subscriber
# Create a .net console app
dotnet new console
# Add the client SDK
dotnet add package Azure.Messaging.WebPubSub.Client --prerelease
Подключитесь к ресурсу Web PubSub и зарегистрируйте прослушиватель для ServerMessageReceived события
Клиент использует URL-адрес клиентского доступа для подключения и проверки подлинности с помощью ресурса.
Этот URL-адрес следует шаблону wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token>. У клиента может быть несколько способов получения URL-адреса клиентского доступа. Для этого краткого руководства можно скопировать и вставить один из портал Azure, показанный на следующей схеме. Рекомендуется не жестко кодировать URL-адрес клиентского доступа в коде. В рабочей среде обычно настраивается сервер приложений для возврата этого URL-адреса по запросу. Создание URL-адреса клиентского доступа подробно описывает практику.
Как показано на схеме выше, клиент присоединяется к концентратору с именем myHub1.
Замените код в следующем коде Program.cs
using Azure.Messaging.WebPubSub.Clients;
// Instantiates the client object
// <client-access-uri> is copied from Azure portal mentioned above
var client = new WebPubSubClient(new Uri("<client-access-uri>"));
client.ServerMessageReceived += eventArgs =>
{
Console.WriteLine($"Receive message: {eventArgs.Message.Data}");
return Task.CompletedTask;
};
client.Connected += eventArgs =>
{
Console.WriteLine("Connected");
return Task.CompletedTask;
};
await client.StartAsync();
// This keeps the subscriber active until the user closes the stream by pressing Ctrl+C
var streaming = Console.ReadLine();
while (streaming != null)
{
if (!string.IsNullOrEmpty(streaming))
{
await client.SendToGroupAsync("stream", BinaryData.FromString(streaming + Environment.NewLine), WebPubSubDataType.Text);
}
streaming = Console.ReadLine();
}
await client.StopAsync();
Выполните следующую команду.
dotnet run
Теперь этот клиент устанавливает подключение к ресурсу Web PubSub и готов получать сообщения, отправленные с сервера приложений.
Создайте каталог проекта с именем subscriber и установите необходимые зависимости:
Служба Web PubSub использует проверку подлинности веб-маркера JSON (JWT ). Пример кода используется WebPubSubServiceClient.GetClientAccessUri() в пакете SDK web PubSub для создания URL-адреса службы, содержащей полный URL-адрес с допустимым маркером доступа.
После установки подключения клиент получит сообщения через подключение WebSocket. Используется await ws.recv() для прослушивания входящих сообщений.
Выполните следующую команду.
python subscribe.py $connection_string "myHub1"
Создание каталога проекта с именем pubsub
mkdir pubsub
cd pubsub
Создание нового консольного приложения с помощью webpubsub-quickstart-subscriberMaven;
В Web PubSub можно подключиться к службе и подписаться на сообщения через подключения WebSocket. WebSocket — это полно дуплексный канал связи, позволяющий службе отправлять сообщения клиенту в режиме реального времени. Вы можете использовать любой API или библиотеку, которая поддерживает WebSocket. В этом примере мы используем пакет Java-WebSocket.
Перейдите в каталог /src/main/java/com/webpubsub/quickstart .
Измените содержимое файла App.java следующим кодом:
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Connect to Azure Web PubSub service using WebSocket protocol
*/
public class App
{
public static void main( String[] args ) throws IOException, URISyntaxException
{
if (args.length != 2) {
System.out.println("Expecting 2 arguments: <connection-string> <hub-name>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
WebPubSubClientAccessToken token = service.getClientAccessToken(new GetClientAccessTokenOptions());
WebSocketClient webSocketClient = new WebSocketClient(new URI(token.getUrl())) {
@Override
public void onMessage(String message) {
System.out.println(String.format("Message received: %s", message));
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
// TODO Auto-generated method stub
}
@Override
public void onError(Exception arg0) {
// TODO Auto-generated method stub
}
@Override
public void onOpen(ServerHandshake arg0) {
// TODO Auto-generated method stub
}
};
webSocketClient.connect();
System.in.read();
}
}
Этот код создает подключение WebSocket, подключенное к концентратору в Azure Web PubSub. Концентратор — это логическая единица в Azure Web PubSub, где можно публиковать сообщения в группе клиентов. Основные понятия содержат подробное описание терминов, используемых в Azure Web PubSub.
Служба Web PubSub использует проверку подлинности веб-маркера JSON (JWT ). Пример кода используется WebPubSubServiceClient.GetClientAccessUri() в пакете SDK web PubSub для создания URL-адреса службы, содержащей полный URL-адрес с допустимым маркером доступа.
После установки подключения клиент получит сообщения через подключение WebSocket. Используется onMessage(String message) для прослушивания входящих сообщений.
Теперь, когда у вас есть клиент, подключенный к ресурсу Web PubSub, вы можете отправлять сообщения с сервера приложений в любое время с помощью пакета SDK сервера, предоставленного Web PubSub.
Создание нового каталога проекта с именем publisher и установка необходимых зависимостей
mkdir publisher
cd publisher
npm init
# This command installs the server SDK from NPM,
# which is different from the client SDK you used in subscribe.js
npm install --save @azure/web-pubsub
publish.js Создание файла со следующим кодом
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
// This is the hub name we used on Azure portal when generating the Client Access URL.
// It ensures this server can push messages to clients in the hub named "myHub1".
const hub = "myHub1";
let server = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, hub);
// By default, the content type is `application/json`.
// Specify contentType as `text/plain` for this demo.
server.sendToAll(process.argv[2], { contentType: "text/plain" });
Вызов server.sendToAll() отправляет сообщение всем подключенным клиентам в центре.
Получение строки подключения
Внимание
Строка подключения включает сведения о авторизации, необходимые для доступа к службе Web PubSub приложения. Ключ доступа в строке подключения аналогичен паролю привилегированного пользователя для службы.
В этом кратком руководстве мы получите его из портал Azure, как показано ниже.
Запуск серверной программы
Выполните следующие команды в новой командной оболочке.
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты подключения.WebPubSubServiceClient
# Set the environment variable for your connection string.
export WebPubSubConnectionString="<Put your connection string here>"
node publish.js "Hello World"
Наблюдение за полученными сообщениями на стороне клиента
Попробуйте запустить одну и ту же программу подписки в нескольких оболочках команд, чтобы стимулировать больше клиентов. После запуска программы публикации вы увидите, что сообщения передаются в режиме реального времени всем этим клиентам.
Создайте каталог проекта с именем publisher и установите необходимые зависимости:
mkdir publisher
cd publisher
dotnet new console
dotnet add package Azure.Messaging.WebPubSub
Замените Program.cs файл следующим кодом.
using System;
using System.Threading.Tasks;
using Azure.Messaging.WebPubSub;
namespace publisher
{
class Program
{
static async Task Main(string[] args)
{
if (args.Length != 3) {
Console.WriteLine("Usage: publisher <connectionString> <hub> <message>");
return;
}
var connectionString = args[0];
var hub = args[1];
var message = args[2];
// Either generate the token or fetch it from server or fetch a temp one from the portal
var serviceClient = new WebPubSubServiceClient(connectionString, hub);
await serviceClient.SendToAllAsync(message);
}
}
}
Вызов SendToAllAsync() отправляет сообщение всем подключенным клиентам в концентраторе.
Запустите серверную программу для отправки сообщений всем подключенным клиентам
$connection_string="<connection-string>"
dotnet run $connection_string "myHub1" "Hello World"
Наблюдение за полученными сообщениями на стороне клиента
# On the command shell used for running the "subscribe" program, you should see the received the messaged logged there.
# Try running the same "subscribe" program in multiple command shells, which simulates more than clients.
# Try running the "publish" program several times and you see messages being delivered in real-time to all these clients.
Message received: Hello World
Сначала создайте каталог проекта с именем publisher и установите необходимые зависимости:
mkdir publisher
cd publisher
# Create venv
python -m venv env
# Active venv
source ./env/bin/activate
pip install azure-messaging-webpubsubservice
Используйте пакет SDK azure Web PubSub для публикации сообщения в службе. Создайте файл publish.py с помощью приведенного ниже кода:
import sys
from azure.messaging.webpubsubservice import WebPubSubServiceClient
if __name__ == '__main__':
if len(sys.argv) != 4:
print('Usage: python publish.py <connection-string> <hub-name> <message>')
exit(1)
connection_string = sys.argv[1]
hub_name = sys.argv[2]
message = sys.argv[3]
service = WebPubSubServiceClient.from_connection_string(connection_string, hub=hub_name)
res = service.send_to_all(message, content_type='text/plain')
print(res)
send_to_all() отправляет сообщение всем подключенным клиентам в концентраторе.
Проверьте предыдущую командную оболочку, чтобы подписчик получил сообщение:
Received message: Hello World
Перейдите в pubsub каталог. Используйте Maven для создания консольного приложения webpubsub-quickstart-publisher издателя и перейдите в каталог webpubsub-quickstart-publisher :
Используйте пакет SDK azure Web PubSub для публикации сообщения в службе. Перейдите в каталог /src/main/java/com/webpubsub/quickstart , откройте файл App.java в редакторе и замените содержимое следующим кодом:
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
/**
* Publish messages using Azure Web PubSub service SDK
*
*/
public class App
{
public static void main( String[] args )
{
if (args.length != 3) {
System.out.println("Expecting 3 arguments: <connection-string> <hub-name> <message>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
service.sendToAll(args[2], WebPubSubContentType.TEXT_PLAIN);
}
}
Вызов sendToAll() отправляет сообщение всем подключенным клиентам в центре.
Перейдите в каталог webpubsub-quickstart-publisher и запустите проект с помощью следующей команды:
Вы можете увидеть, что предыдущий подписчик получил сообщение:
Message received: Hello World
Итоги
В этом кратком руководстве показано, как легко отправлять сообщения с сервера приложений ко всем подключенным клиентам в концентраторе. Кроме того, Web PubSub позволяет отправлять сообщения в
подмножество клиентов в концентраторе
определенная группа в концентраторе
Подмножество клиентов в группе
Эти API позволяют множество вариантов использования, позволяя разработчикам сосредоточиться на уникальной бизнес-логике в то время как быть уверены, что Web PubSub предлагает низкую задержку (<100 мс), высокий уровень доступности и массовый масштаб (миллион и одновременные подключения).
Следующие шаги
На следующем шаге мы рассмотрим, как работать с системой событий Web PubSub, необходимой для создания полных веб-приложений.