Упражнение. Обработка сообщения очереди

Завершено

В этом упражнении вы дополните приложение маршрутом, который может активировать сообщение в очереди сообщений.

Примечание.

Прежде чем приступить к выполнению этого упражнения, убедитесь, что вы загрузили расширение Azurite, Обозреватель службы хранилища Azure и Azure Functions Core Tools.

Формирование шаблона приложения

В этом упражнении мы создадим новое приложение Функций Azure. Создайте новый каталог и зайдите в него.

  1. Выберите Вид>Палитра команд.

  2. Выберите Функции Azure: Создать проект.

  3. Выберите папку. Как правило, это будет текущая папка.

  4. В разделе Выбор языка выберите Пользовательский обработчик.

  5. В разделе Выбор шаблона для первой функции выберите HttpTrigger.

  6. Присвойте приложению имя, например queueTrigger.

  7. Выберите анонимный уровень авторизации. При необходимости имя можно изменить позже.

  8. В корневом каталоге создайте файл с именем server.go. Теперь в проекте должны быть следующие файлы:

    queueTrigger/
      function.json
    .funcignore
    .gitignore
    host.json
    local.settings.json
    proxies.json
    server.go 
    
  9. Перейдите к файлу function.json в каталоге queueTrigger. Найдите первую запись привязки в элементе type:

    {
       "authLevel": "anonymous",
       "type": "httpTrigger",
       "direction": "in",
       "name": "req",
       "methods": [
         "get",
         "post"
       ]
     }
    

    Измените запись привязки, применив следующую конфигурацию:

    {
       "name": "queueItem",
       "type": "queueTrigger",
       "direction": "in",
       "queueName" : "items",
       "connection": "AzureWebJobsStorage"
    }
    

    На этом этапе задается свойство name. Позже вы обратитесь к нему в коде. Вы также изменили тип триггера на queueTrigger, что дает возможность ожидать передачи сообщений очереди.

    Значение queueName указывает на определенную очередь. Когда вы позже запустите эмулятор, вы создадите очередь с таким именем.

    Наконец, вы указали переменную в local.settings.json, которая будет содержать строку подключения к очереди.

Создание приложения

На этом этапе у вы имеете основу приложения. Теперь все готово к добавлению кода, который может обрабатывать входящие сообщения очереди.

  1. Откройте файл server.go и добавьте следующий код:

    package main
    
    import (
      "encoding/json",
      "fmt"
      "io/ioutil"
      "log"
      "net/http"
      "os"
    )
    
    func queueHandler(w http.ResponseWriter, r *http.Request) {
    }
    
    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      mux.HandleFunc("/queueTrigger", queueHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    Теперь в /queueTrigger у вас есть настроенный маршрут.

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

    type InvokeRequest struct {
      Data     map[string]json.RawMessage
      Metadata map[string]interface{}
    }
    
  3. Найдите метод queueHandler() и измените его следующим образом:

    func queueHandler(w http.ResponseWriter, r *http.Request) {
      var invokeRequest InvokeRequest
    
      d := json.NewDecoder(r.Body)
      d.Decode(&invokeRequest)
    
      var parsedMessage string
      json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
    }
    

    Сначала код считывает текст из потока входящих ответов и декодирует его:

    var invokeRequest InvokeRequest
    
    d := json.NewDecoder(r.Body)
    d.Decode(&invokeRequest)
    

    Затем извлекается само сообщение с помощью вызова в Unmarshal():

    var parsedMessage string
    json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
    

    Теперь, когда у вас есть сообщение, давайте напечатаем его.

  4. Добавьте следующий код:

    fmt.Println(parsedMessage) // your message
    

    Теперь код написан, но необходимо настроить проект, чтобы его можно было протестировать.

  5. В файле host.json найдите элемент defaultExecutablePath и присвойте ему значение ./server.

    Примечание.

    Для Windows следует использовать значение .\server.exe.

  6. Выполните сборку файла server.go, запустив команду go build в корневом каталоге проекта:

    go build server.go
    

Настройка среды

Следующий шаг — настройка окружения. Так как разработка осуществляется локально, необходимо настроить ее, чтобы вы могли взаимодействовать с эмулируемой очередью сообщений.

  1. В файле local.settings.json найдите элемент в Values с именем AzureWebJobsStorage (или добавьте его, если он отсутствует). Присвойте ему значение UseDevelopmentStorage=true. Ваша запись JSON должна выглядеть следующим образом:

    "AzureWebJobsStorage" : "UseDevelopmentStorage=true"
    
  2. Запустите расширение Azurite, открыв палитру команд (Просмотр>Палитры команд) и выбрав Azurite: запуск службы очередей.

    Примечание.

    На этом шаге будут созданы некоторые локальные файлы в проекте.

  3. Откройте обозреватель службы хранилища Azure. В левой части отображается содержимое эмулятора.

  4. Нажмите правой кнопкой мыши узел Очереди и выберите вариант для создания новой очереди. Присвойте ей имя items.

    Screenshot that shows the emulator in Azure Storage Explorer, with a new queue created.

    Примечание.

    Вы можете присвоить очереди имя на свое усмотрение. Вместе с тем вам предстоит настроить файл function.json. Каким бы ни было имя, очередь должна попасть в function.json.

  5. В каталоге queueTrigger выберите function.json. Убедитесь в наличии следующей записи в массиве bindings:

    {
       "name": "queueItem",
       "type": "queueTrigger",
       "direction": "in",
       "queueName" : "items",
       "connection": "AzureWebJobsStorage"
     }
    

    Свойство queueName имеет то же имя, что и очередь, созданная в Обозревателе службы хранилища Azure. Свойство connection указывает на значение, которое вы задали в local.settings.json.

    Свойство name имеет значение queueItem. Ваш код Go использует это значение для анализа сообщения очереди.

Выполнить приложение

На этом этапе все настройки заданы. Вам нужно только запустить приложение, запустить Обозреватель службы хранилища Azure и создать сообщение очереди. Ваш код должен быть способен воспринять это сообщение.

  1. Из терминала выполните команду func start в корневом каталоге проекта:

    func start
    
  2. В Visual Studio Code откройте палитру команд и выполните Azurite: запуск службы очередей.

  3. Запустите Обозреватель службы хранилища Azure, если он еще не запущен.

  4. В Обозревателе службы хранилища Azure выберите Добавить сообщение:

    Screenshot that shows the selection for adding a message on the queue.

  5. В появившемся диалоговом окне введите сообщение и нажмите OK. После этого вы увидите сведения о созданном сообщении.

    Screenshot that shows message details.

  6. Теперь ваша функция должна работать в Visual Studio Code. На терминале теперь должно отобразиться сообщение, выведенное в виде последней строки.

    Функция смогла воспринять сообщение очереди и записать его содержимое.

Поздравляем! Вы создали функцию Azure в Go, которая может активироваться при получении сообщения очереди. Вы также проанализировали это сообщение.

Что делать с входящим сообщением, решать вам. Например, его можно сохранить в базе данных или отправить в качестве полезных данных в веб-запросе.