Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Important
Поддержка Go для Функции Azure сейчас находится на этапе общедоступной предварительной версии. Во время предварительной версии приложения-функции Go поддерживаются только в плане потребления Flex.
Функции Azure — это бессерверная служба вычислений, которую можно использовать для запуска управляемого событиями кода без подготовки или управления инфраструктурой. Рабочий процесс Go позволяет писать функции Azure непосредственно на Go с глубокой интеграцией в экосистему триггеров Функции Azure.
Это руководство поможет вам:
- Общие сведения о модели программирования Go
- Создание и структура кода проекта
- Работа с триггерами
- Развертывание и запуск приложения локально и в Azure
Дополнительные сведения о разработке Функции Azure см. в справочнике по разработчику Функции Azure.
Начало работы
Выберите среду, которая подходит для вашего рабочего процесса, и начните работу с Функции Azure for Go:
Необходимые условия
- Go 1.24 или более поздней версии
-
Функции Azure Core Tools версии
4.12или более поздней версии. Запуститеfunc --version, чтобы проверить установленную версию. -
Azure CLI версии
2.87.0или более поздней версии при создании ресурсов Azure или развертывании пакетов в Azure. Выполните командуaz version, чтобы проверить установленную версию.
Модель программирования
Обработчик Go использует модель программирования с приоритетом кода. Вы определяете бессерверные функции и их триггеры с помощью идиоматических обработчиков Go.
Точка входа
Каждый проект на Go начинается с функции main(), которая создаёт FunctionApp, регистрирует функции и запускает воркер:
package main
import (
"fmt"
"net/http"
"github.com/azure/azure-functions-golang-worker/sdk"
"github.com/azure/azure-functions-golang-worker/worker"
)
func main() {
app := sdk.FunctionApp()
app.HTTP("hello", hello,
sdk.WithMethods("GET", "POST"),
sdk.WithAuth("anonymous"),
)
worker.Start(app)
}
func hello(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if name == "" {
name = "world"
}
fmt.Fprintf(w, "Hello, %s!", name)
}
Регистрация функции
Зарегистрируйте функции с помощью API построителя fluent с помощью шаблона функциональных параметров. Каждый тип триггера имеет метод регистрации объекта App :
// HTTP trigger
app.HTTP("myHttpFunc", handler,
sdk.WithMethods("GET", "POST"),
sdk.WithAuth("anonymous"),
)
// Timer trigger
app.Timer("myTimerFunc", handler,
sdk.WithSchedule("0 */5 * * * *"),
)
// Azure Cosmos DB trigger
app.CosmosDB("myCosmosFunc", handler,
sdk.WithDatabase("mydb"),
sdk.WithContainer("mycontainer"),
sdk.WithConnection("CosmosDBConnection"),
)
// Azure Service Bus trigger
app.ServiceBusQueue("myServiceBusFunc", handler,
sdk.WithQueueName("myqueue"),
sdk.WithConnection("ServiceBusConnection"),
)
// Event Hubs trigger
app.EventHub("myEventHubFunc", handler,
sdk.WithEventHubName("myeventhub"),
sdk.WithConnection("EventHubConnection"),
)
// Event Grid trigger
app.EventGrid("myEventGridFunc", handler)
// Blob trigger (extension model)
app.Blob("myBlobFunc", handler,
sdk.WithPath("mycontainer/{name}"),
sdk.WithConnection("AzureWebJobsStorage"),
)
структура проекта
Проект кода Go для Функции Azure — это стандартный модуль Go. При запуске func init --worker-runtime goсоздаются следующие файлы:
my-function-app/
├── host.json # Host configuration
├── local.settings.json # Local settings (connection strings, app settings)
├── go.mod # Go module file
├── go.sum # Go module checksums
└── main.go # Entry point with function registrations
host.json
Файл host.json содержит параметры конфигурации уровня узла. Дополнительные сведения см. в справочнике по host.json.
local.settings.json
В local.settings.json файле хранятся параметры приложения и строки подключения, используемые во время локальной разработки. Этот файл не публикуется в Azure. Подробнее см. в разделе Файл локальных параметров.
Триггеры
Воркер Go распределяет триггеры на два уровня в зависимости от требований к зависимостям:
Основные триггеры
Основные триггеры получают полезную нагрузку напрямую через gRPC. Хост Функции Azure сериализует данные триггера в сообщение gRPC, а рабочий процесс десериализует их в типизированные структуры Go. Эти триггеры имеют следующие компоненты:
- Типизированные подписи обработчика с безопасностью во время компиляции
-
Без внешних зависимостей от Azure SDK: требуется только
encoding/json - Полезные нагрузки ограниченного размера: документы ленты изменений, сообщения и события являются отдельными объектами ограниченного размера
Поддерживаемые основные триггеры:
| Trigger | Подпись обработчика | Метод регистрации |
|---|---|---|
| HTTP | func(http.ResponseWriter, *http.Request) |
app.HTTP() |
| Timer | TimerHandler |
app.Timer() |
| Azure Cosmos DB (облачная база данных) | func(context.Context, []bindings.CosmosDocument) error |
app.CosmosDB() |
| Служебная шина Azure (очередь) | ServiceBusHandler |
app.ServiceBusQueue() |
| Служебная шина Azure (тема) | ServiceBusHandler |
app.ServiceBusTopic() |
| Event Hubs | EventHubHandler |
app.EventHub() |
| Event Grid | EventGridHandler |
app.EventGrid() |
Триггеры расширения
Триггеры расширения предоставляют проверенный клиент Azure SDK вместо необработанных данных. Хост отправляет только метаданные (например, имя контейнера и путь к BLOB-объекту), а рабочий процесс создает клиент для конкретного ресурса. Эти триггеры имеют следующие компоненты:
- Внедрение клиента SDK: обработчик получает клиент, готовый к использованию
-
Изолированные зависимости: пакеты Azure SDK живут в
triggers/<name>/ - Поддержка потоковой передачи: позволяет считывать большие полезные данные без буферизации с помощью gRPC
Чтобы использовать триггер расширения, добавьте пустой импорт для пакета расширения:
import _ "github.com/azure/azure-functions-golang-worker/triggers/blob"
| Trigger | Обработчик получает | Метод регистрации |
|---|---|---|
| Хранилище BLOB-объектов | *blob.Client |
app.Blob() |
Пример триггера BLOB-объектов
package main
import (
"context"
"fmt"
"io"
"log"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
"github.com/azure/azure-functions-golang-worker/sdk"
_ "github.com/azure/azure-functions-golang-worker/triggers/blob"
"github.com/azure/azure-functions-golang-worker/worker"
)
func main() {
app := sdk.FunctionApp()
app.Blob("processBlobTrigger", processBlob,
sdk.WithPath("samples-workitems/{name}"),
sdk.WithConnection("AzureWebJobsStorage"),
)
worker.Start(app)
}
func processBlob(ctx context.Context, client *blob.Client) error {
get, err := client.DownloadStream(ctx, nil)
if err != nil {
return fmt.Errorf("download error: %w", err)
}
data, _ := io.ReadAll(get.Body)
get.Body.Close()
log.Printf("Blob size: %d bytes", len(data))
return nil
}
Триггеры HTTP
Обработчики триггеров HTTP используют стандартные типы Go net/http , что делает их сразу знакомыми разработчикам Go:
func myHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if name == "" {
name = "world"
}
w.Header().Set("Content-Type", "application/json")
fmt.Fprintf(w, `{"message": "Hello, %s!"}`, name)
}
Регистрация функций HTTP с помощью методов и уровня авторизации:
app.HTTP("myApi", myHandler,
sdk.WithMethods("GET", "POST"),
sdk.WithAuth("anonymous"),
)
Потоковая передача по HTTP
Go-воркер поддерживает потоковую передачу по HTTP для таких сценариев, как события, отправляемые сервером, или передача больших объемов данных в ответе:
func streamHandler(w http.ResponseWriter, r *http.Request) {
flusher, ok := w.(http.Flusher)
if !ok {
http.Error(w, "streaming not supported", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/event-stream")
for i := 0; i < 10; i++ {
fmt.Fprintf(w, "data: message %d\n\n", i)
flusher.Flush()
}
}
Таймерный триггер
Триггеры таймера выполняются по расписанию, определенному выражением cron:
app.Timer("myScheduledFunc", timerHandler,
sdk.WithSchedule("0 */5 * * * *"),
)
func timerHandler(ctx context.Context, timer bindings.TimerInfo) error {
log.Printf("Timer trigger executed at: %s", timer.ScheduleStatus.Next)
return nil
}
Управление зависимостями
Проекты кода Go используют стандартные модули Go для управления зависимостями.
Инициализация нового модуля:
go mod init myappДобавьте пакет SDK обработчика Go для Функции Azure:
go get github.com/azure/azure-functions-golang-workerДля поддержки триггера больших двоичных объектов зависимость добавляется автоматически через пустой импорт
triggers/blob.Упорядочить зависимости:
go mod tidy
Запустить локально
Используйте Функции Azure Core Tools для локального запуска проекта:
func start
Базовые инструменты автоматически:
- Обнаруживает
FUNCTIONS_WORKER_RUNTIME = "native"изlocal.settings.json. - Определяет Go как среду выполнения собственного рабочего процесса при наличии файла
go.mod. - Запускает
go build -o bin/app ., чтобы скомпилировать ваш проект для вашей локальной операционной системы. - Запускает узел Функции Azure, который взаимодействует с скомпилируемым двоичным файлом через gRPC.
- Отображает конечные точки функции (например,
http://localhost:7071/api/hello).
Используется local.settings.json для настройки переменных среды для локальной разработки:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "native"
}
}
Значение AzureWebJobsStorage, созданное для проектов Go, пусто. Установите для него значение строки подключения учетной записи хранения или UseDevelopmentStorage=true, если при локальной разработке вы используете триггеры, которым требуется хранилище узла.
Развертывание
Компиляция и упаковка
Функции Azure Core Tools, начиная с версии 4.12 , поддерживают сборку Go в типичных сценариях локального развертывания и развертывания в Azure:
-
func startсобирает ваш проект в исполняемый файл bin/app для вашей локальной операционной системы перед запуском локального узла Functions. -
func azure functionapp publishсобирает, упаковывает и развертывает ваш проект в существующее приложение-функцию в Azure. -
func packсоздает проект в виде bin/app для Linux x64 и создает развернутый пакет .zip.
При упаковке для Azure созданный .zip-файл содержит файлы, необходимые узлу Функций Linux. Скомпилированный двоичный файл хранится в виде bin/app в локальном проекте, но основные инструменты помещает его в корень пакета развертывания в качестве приложения.
Если используется func pack --no-build, перед упаковкой необходимо создать двоичный файл Linux x64:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app .
Развертывание с помощью Core Tools
Используйте func azure functionapp publish для развертывания проекта Go в существующем приложении-функции в Azure:
func azure functionapp publish <APP_NAME>
Замените <APP_NAME> на имя приложения-функции.
Развертывание zip-пакета
Используйте, func pack когда необходимо создать пакет развертывания отдельно от публикации:
Создайте развернутый zip-артефакт:
func packРазверните пакет с помощью Azure CLI:
az functionapp deployment source config-zip --resource-group <RESOURCE_GROUP> --name <APP_NAME> --src <ZIP_FILE_PATH>
Пакет, созданный func pack готов к выполнению в Azure, поэтому не запрашивайте удаленную сборку при его развертывании.
Поддержка Docker
Вы можете запускать проекты кода Go в контейнерах. Инициализация проекта с поддержкой Docker:
func init --worker-runtime go --docker
Команда создает Dockerfile вместе со стандартными файлами проекта.
Телеметрия и наблюдаемость
Рабочий элемент Функции Azure Go поддерживает структурированное ведение журнала и наблюдаемость на основе OpenTelemetry. Используйте методы с учетом контекста из стандартного log/slog пакета, например slog.InfoContextдля сопоставления журналов с текущим вызовом функции. Чтобы включить OpenTelemetry, настройте среду выполнения Functions и зарегистрируйте в приложении промежуточное ПО OpenTelemetry для обработчика Go. Инструкции по настройке см. в разделе Use OpenTelemetry с Функции Azure.
Известные ограничения (предварительная версия)
Во время общедоступной предварительной версии применяются следующие ограничения:
-
func newне поддерживается. Добавление функций путем непосредственного редактированияmain.go. - Устойчивые функции не поддерживается для Go во время общедоступной предварительной версии.
- Приложения-функции Go выполняются только в Linux в Azure.
- Во время предварительной версии поддерживаются только триггеры, перечисленные в триггерах .
- Упаковка Go-приложений в Core Tools в настоящее время ориентирована на 64-разрядные приложения Linux.