Поделиться через


Начало работы с запросами WebSocket для гибридных подключений ретранслятора в Python

В этом кратком руководстве вы создадите приложения отправителя и получателя Python, которые отправляют и получают сообщения с помощью протокола WebSocket. Приложения используют функцию гибридных подключений службы Azure Relay. См. дополнительные сведения о службе Azure Relay.

При работе с этим кратким руководством вы выполните следующие задачи:

  1. Создайте пространство имен ретранслятора с помощью портала Azure.
  2. Создайте гибридное подключение в этом пространстве имен с помощью портала Azure.
  3. Создание файла свойств config.json для хранения сведений о подключении
  4. Разработка relaylib.py для вспомогательных функций (маркеры SAS, URL-адреса)
  5. Напишите скрипт сервера (прослушивателя) для получения сообщений.
  6. Напишите скрипт клиента (отправителя) для отправки сообщений.
  7. Выполните скрипт сервера (прослушиватель) и при необходимости скрипт клиента (отправителя).

Необходимые компоненты

  • Python. Убедитесь, что вы используете Python 3.10+
  • Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.

Создание пространства имен с помощью портала Azure

  1. Войдите на портал Azure.

  2. В меню слева выберите Все службы. Выберите "Интеграция", найдите ретрансляторы, переместите указатель мыши на ретрансляторы и нажмите кнопку "Создать".

    Снимок экрана: выбор ретрансляторов —> кнопка

  3. На странице "Создание пространства имен" выполните следующие действия.

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Выберите существующую группу ресурсов, в которую будет размещено это пространство имен, или создайте новую.

    3. Введите имя пространства имен Ретранслятора.

    4. Выберите регион, в котором должно размещаться пространство имен.

    5. В нижней части страницы выберите Review + create (Проверить и создать).

      Снимок экрана: страница

    6. На странице Отзыв и создание выберите Создать.

    7. Через несколько минут вы увидите страницу Ретранслятора для пространства имен.

      Снимок экрана: домашняя страница пространства имен Ретранслятора.

Получение учетных данных управления

  1. На странице "Ретранслятор" выберите политики общего доступа в меню слева.

  2. На странице Политики общего доступа щелкните RootManageSharedAccessKey.

  3. В разделе SAS Policy: RootManageSharedAccessKey (Политика SAS: RootManageSharedAccessKey) нажмите кнопку Копировать рядом с элементом Первичная строка подключения. Строка подключения будет скопирована в буфер обмена для дальнейшего использования. Вставьте на время эти значения в Блокноте или любом другом месте.

  4. Повторите предыдущий шаг, скопировав и вставив значение первичного ключа во временное расположение для последующего использования.

    Снимок экрана: сведения о подключении для пространства имен Ретранслятора.

Создание гибридного подключения с помощью портала Azure

На странице Ретранслятора для пространства имен выполните следующие действия, чтобы создать гибридное подключение.

  1. В меню слева выберите "Гибридные подключения" и выберите "Гибридные подключения".

    Снимок экрана: страница гибридных подключений.

  2. На странице "Создание гибридного подключения" введите имя гибридного подключения и нажмите кнопку "Создать".

    Снимок экрана: страница

Создание серверного приложения (прослушивателя)

Чтобы прослушивать и получать сообщения из Ретранслятора, напишите скрипт сервера Python WebSocket.

Создание скрипта Python

Если при создании ретранслятора отключен параметр "Требуется авторизация клиента", вы можете отправлять запросы по URL-адресу гибридных подключений с помощью любого браузера. Для доступа к защищенным конечным точкам необходимо создать и передать маркер SAS, который показан здесь.

Ниже приведен простой скрипт Python, демонстрирующий отправку запросов в URL-адрес гибридных подключений с маркерами SAS, использующими WebSockets.

Зависимости

  1. Установите следующие библиотеки Python с помощью pip перед запуском серверного приложения

    asyncio, , jsonloggingwebsockets

    Эти библиотеки можно установить с помощью следующей команды:

     pip install <package name>
    
  2. Создание файла для хранения сведений config.json о подключении

    {
        "namespace": "HYBRID_CONNECTION_NAMESPACE",
        "path": "HYBRID_CONNECTION_ENTITY_NAME",
        "keyrule": "SHARED_ACCESS_KEY_NAME",
        "key": "SHARED_ACCESS_PRIMARY_KEY"
     }
    

    Замените заполнители в скобках значениями, которые получены при создании гибридного подключения.

    • namespace — пространство имен ретранслятора. Необходимо использовать полное имя пространства имен, например {namespace}.servicebus.windows.net.
    • path — имя гибридного подключения.
    • keyrule— Имя ключа политики общего доступа, который по умолчанию.RootManageSharedAccessKey
    • key — первичный ключ пространства имен, сохраненного ранее.
  3. Создание вспомогательного файла функции для вспомогательных функций

    Следующий файл используется как relaylib.py и имеет вспомогательные функции для создания URL-адресов WebSocket и маркеров SAS

    Создание скрипта Python

    Этот скрипт предоставляет вспомогательные функции для приложений, использующих гибридные подключения Azure Relay. Эти функции, скорее всего, помогают с задачами, такими как создание маркеров SAS и установка подключений WebSocket для безопасного взаимодействия.

    Зависимости

    Установите следующие библиотеки Python с помощью pip перед созданием вспомогательного скрипта функции: base64, , hashlib, hmacmathtimeurllib

    Эти библиотеки можно установить с помощью следующей команды:

    pip install <package name>
    

    Написание вспомогательного скрипта функции

    Вот как должен выглядеть файл relaylib.py :

    import base64
    import hashlib
    import hmac
    import math
    import time
    import urllib
    
    # Function which generates the HMAC-SHA256 of a given message
    def hmac_sha256(key, msg):
       hash_obj = hmac.new(key=key, msg=msg, digestmod=hashlib._hashlib.openssl_sha256)
       return hash_obj.digest()
    
    # Function to create a WebSocket URL for listening for a server application
    def createListenUrl(serviceNamespace, entityPath, token = None):
       url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=listen&sb-hc-id=123456'
       if token is not None:
           url = url + '&sb-hc-token=' + urllib.parse.quote(token)
       return url
    
    # Function which creates the url for the client application
    def createSendUrl(serviceNamespace, entityPath, token = None):
       url = 'wss://' + serviceNamespace + '/$hc/' + entityPath + '?sb-hc-action=connect&sb-hc-id=123456'
       if token is not None:
           url = url + '&sb-hc-token=' + urllib.parse.quote(token)
       return url
    
    # Function which creates the Service Bus SAS token. 
    def createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey):
       uri = "http://" + serviceNamespace + "/" + entityPath
       encodedResourceUri = urllib.parse.quote(uri, safe = '')
    
       # Define the token validity period in seconds (48 hours in this case)   
       tokenValidTimeInSeconds = 60 * 60 * 48 
       unixSeconds = math.floor(time.time())
       expiryInSeconds = unixSeconds + tokenValidTimeInSeconds
    
       # Create the plain signature string by combining the encoded URI and the expiry time
       plainSignature = encodedResourceUri + "\n" + str(expiryInSeconds)
    
       # Encode the SAS key and the plain signature as bytes
       sasKeyBytes = sasKey.encode("utf-8")
       plainSignatureBytes = plainSignature.encode("utf-8")
       hashBytes = hmac_sha256(sasKeyBytes, plainSignatureBytes)
       base64HashValue = base64.b64encode(hashBytes)
    
       # Construct the SAS token string
       token = "SharedAccessSignature sr=" + encodedResourceUri + "&sig=" +  urllib.parse.quote(base64HashValue) + "&se=" + str(expiryInSeconds) + "&skn=" + sasKeyName
       return token
    

Написание кода для получения сообщений

  1. Убедитесь, что зависимость config.json и relaylib.py доступны в пути

  2. Вот как должен выглядеть файл listener.py :

    import asyncio
    import json
    import logging
    import relaylib
    import websockets
    
    async def run_application(config):
        serviceNamespace = config["namespace"]
        entityPath = config["path"]
        sasKeyName = config["keyrule"]
        sasKey = config["key"]
        serviceNamespace += ".servicebus.windows.net"
        # Configure logging
        logging.basicConfig(level=logging.INFO)  # Enable DEBUG/INFO logging as appropriate
    
        try:
            logging.debug("Generating SAS Token for: %s", serviceNamespace)
            token = relaylib.createSasToken(serviceNamespace, entityPath, sasKeyName, sasKey)
            logging.debug("Generating WebSocket URI")
            wssUri = relaylib.createListenUrl(serviceNamespace, entityPath, token)
            async with websockets.connect(wssUri) as websocket:
                logging.info("Listening for messages on Azure Relay WebSocket...")
                while True:
                    message = await websocket.recv()
                    logging.info("Received message: %s", message)
        except KeyboardInterrupt:
            logging.info("Exiting listener.")
    
        if __name__ == "__main__":
            # Load configuration from JSON file
            with open("config.json") as config_file:
            config = json.load(config_file)
    
        asyncio.run(run_application(config))
    

Создание клиентского приложения (отправителя)

Для отправки сообщений в Ретранслятор можно использовать любой клиент HTTP или WebSocket, пример включает реализацию Python.

Написание кода для отправки сообщений

  1. Убедитесь, что зависимость config.json и relaylib.py доступны в пути

  2. Вот как должен выглядеть файл sender.py :

    import asyncio
    import json
    import logging
    import relaylib
    import websockets
    
    async def run_application(message, config):
        service_namespace = config["namespace"]
        entity_path = config["path"]
        sas_key_name = config["keyrule"]
        sas_key = config["key"]
        service_namespace += ".servicebus.windows.net"
    
        # Configure logging
        logging.basicConfig(level=logging.DEBUG)  # Enable debug logging
    
        token = relaylib.createSasToken(service_namespace, entity_path, sas_key_name, sas_key)
        logging.debug("Token: %s", token)
        wss_uri = relaylib.createSendUrl(service_namespace, entity_path, token)
        logging.debug("WssURI: %s", wss_uri)
    
        try:
            async with websockets.connect(wss_uri) as websocket:
                logging.info("Sending message to Azure Relay WebSocket...")
                await websocket.send(json.dumps({"message": message}))
                logging.info("Message sent: %s", message)
        except Exception as e:
            logging.error("An error occurred: %s", str(e))
    
    if __name__ == "__main__":
        # Load configuration from JSON file
        with open("config.json") as config_file:
            config = json.load(config_file)
    
        asyncio.run(run_application("This is a message to Azure Relay Hybrid Connections!", config))
    

Примечание.

Пример кода в этой статье использует строка подключения для проверки подлинности в пространстве имен Ретранслятора Azure, чтобы упростить учебник. Мы рекомендуем использовать проверку подлинности Идентификатора Microsoft Entra в рабочих средах, а не использовать строка подключения или подписанные URL-адреса, что может быть проще скомпрометировано. Подробные сведения и пример кода для использования проверки подлинности идентификатора Microsoft Entra см. в статье "Проверка подлинности и авторизация приложения с помощью идентификатора Microsoft Entra ID" для доступа к сущностям Ретрансляции Azure и аутентификации управляемого удостоверения с помощью идентификатора Microsoft Entra для доступа к ресурсам Ретранслятора Azure.

Запуск приложений

  1. Запустите серверное приложение: из типа python3 listener.pyкомандной строки.
  2. Запустите клиентское приложение: из типа python3 sender.pyкомандной строки.

Поздравляем, вы создали комплексное приложение гибридных подключений с помощью Python!

Следующие шаги

В этом кратком руководстве вы создали клиентские и серверные приложения Python, которые использовали WebSockets для отправки и получения сообщений. Функция гибридных подключений службы Azure Relay также поддерживает использование протокола HTTP для отправки и получения сообщений. См. дополнительные сведения об использовании протокола HTTP с гибридными подключениями Azure Relay.

В этом кратком руководстве вы использовали Python для создания клиентских и серверных приложений. Сведения о создании клиентских и серверных приложений с помощью платформа .NET Framework см. в кратком руководстве по .NET HTTP или кратком руководствепо .NET HTTP.