Упражнение. Обработка сообщения очереди
В этом упражнении вы дополните приложение маршрутом, который может активировать сообщение в очереди сообщений.
Примечание.
Прежде чем приступить к выполнению этого упражнения, убедитесь, что вы загрузили расширение Azurite, Обозреватель службы хранилища Azure и Azure Functions Core Tools.
Формирование шаблона приложения
В этом упражнении мы создадим новое приложение Функций Azure. Создайте новый каталог и зайдите в него.
Выберите Вид>Палитра команд.
Выберите Функции Azure: Создать проект.
Выберите папку. Как правило, это будет текущая папка.
В разделе Выбор языка выберите Пользовательский обработчик.
В разделе Выбор шаблона для первой функции выберите HttpTrigger.
Присвойте приложению имя, например queueTrigger.
Выберите анонимный уровень авторизации. При необходимости имя можно изменить позже.
В корневом каталоге создайте файл с именем server.go. Теперь в проекте должны быть следующие файлы:
queueTrigger/ function.json .funcignore .gitignore host.json local.settings.json proxies.json server.go
Перейдите к файлу 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, которая будет содержать строку подключения к очереди.
Создание приложения
На этом этапе у вы имеете основу приложения. Теперь все готово к добавлению кода, который может обрабатывать входящие сообщения очереди.
Откройте файл 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
у вас есть настроенный маршрут.Найдите раздел импорта и добавьте в него следующие структуры:
type InvokeRequest struct { Data map[string]json.RawMessage Metadata map[string]interface{} }
Найдите метод
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)
Теперь, когда у вас есть сообщение, давайте напечатаем его.
Добавьте следующий код:
fmt.Println(parsedMessage) // your message
Теперь код написан, но необходимо настроить проект, чтобы его можно было протестировать.
В файле host.json найдите элемент
defaultExecutablePath
и присвойте ему значение./server
.Примечание.
Для Windows следует использовать значение
.\server.exe
.Выполните сборку файла server.go, запустив команду
go build
в корневом каталоге проекта:go build server.go
Настройка среды
Следующий шаг — настройка окружения. Так как разработка осуществляется локально, необходимо настроить ее, чтобы вы могли взаимодействовать с эмулируемой очередью сообщений.
В файле local.settings.json найдите элемент в
Values
с именемAzureWebJobsStorage
(или добавьте его, если он отсутствует). Присвойте ему значениеUseDevelopmentStorage=true
. Ваша запись JSON должна выглядеть следующим образом:"AzureWebJobsStorage" : "UseDevelopmentStorage=true"
Запустите расширение Azurite, открыв палитру команд (Просмотр>Палитры команд) и выбрав Azurite: запуск службы очередей.
Примечание.
На этом шаге будут созданы некоторые локальные файлы в проекте.
Откройте обозреватель службы хранилища Azure. В левой части отображается содержимое эмулятора.
Нажмите правой кнопкой мыши узел Очереди и выберите вариант для создания новой очереди. Присвойте ей имя items.
Примечание.
Вы можете присвоить очереди имя на свое усмотрение. Вместе с тем вам предстоит настроить файл function.json. Каким бы ни было имя, очередь должна попасть в function.json.
В каталоге выберите
queueTrigger
. Убедитесь в наличии следующей записи в массивеbindings
:{ "name": "queueItem", "type": "queueTrigger", "direction": "in", "queueName" : "items", "connection": "AzureWebJobsStorage" }
Свойство
queueName
имеет то же имя, что и очередь, созданная в Обозревателе службы хранилища Azure. Свойствоconnection
указывает на значение, которое вы задали в local.settings.json.Свойство
name
имеет значениеqueueItem
. Ваш код Go использует это значение для анализа сообщения очереди.
Выполнить приложение
На этом этапе все настройки заданы. Вам нужно только запустить приложение, запустить Обозреватель службы хранилища Azure и создать сообщение очереди. Ваш код должен быть способен воспринять это сообщение.
Из терминала выполните команду
func start
в корневом каталоге проекта:func start
В Visual Studio Code откройте палитру команд и выполните Azurite: запуск службы очередей.
Запустите Обозреватель службы хранилища Azure, если он еще не запущен.
В Обозревателе службы хранилища Azure выберите Добавить сообщение:
В появившемся диалоговом окне введите сообщение и нажмите OK. После этого вы увидите сведения о созданном сообщении.
Теперь ваша функция должна работать в Visual Studio Code. На терминале теперь должно отобразиться сообщение, выведенное в виде последней строки.
Функция смогла воспринять сообщение очереди и записать его содержимое.
Поздравляем! Вы создали функцию Azure в Go, которая может активироваться при получении сообщения очереди. Вы также проанализировали это сообщение.
Что делать с входящим сообщением, решать вам. Например, его можно сохранить в базе данных или отправить в качестве полезных данных в веб-запросе.