Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure Functions is een serverloze rekenservice die u kunt gebruiken om gebeurtenisgestuurde code uit te voeren zonder infrastructuur in te richten of te beheren. Met de Go-worker kunt u Azure Functions rechtstreeks in Go ontwikkelen, met diepgaande integratie met het ecosysteem van Azure Functions-triggers.
Deze handleiding helpt u bij het volgende:
- Meer informatie over het Go-programmeermodel
- Uw projectcode maken en structuren
- Werken met triggers
- Uw app lokaal en in Azure implementeren en uitvoeren
Voor meer informatie over de ontwikkeling van Azure Functions in het algemeen, zie de Azure Functions developer reference.
Aan de slag
Kies de omgeving die past bij uw werkstroom en ga aan de slag met Azure Functions voor Go:
Prerequisites
- Go 1.24 of hoger
-
Azure Functions Core Tools versie
4.12of hoger. Voer deze opdracht uitfunc --versionom uw geïnstalleerde versie te controleren. -
Azure CLI versie
2.87.0of hoger wanneer u Azure resources maakt of pakketten implementeert in Azure. Voer deze opdracht uitaz versionom uw geïnstalleerde versie te controleren.
Programmeermodel
De Go-worker gebruikt een codegericht programmeermodel. U definieert serverloze functies en hun triggers met behulp van idiomatische Go-handlers.
Ingangspunt
Elk Go-codeproject begint met een main()-functie die een FunctionApp maakt, functies registreert en de worker start:
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)
}
Registratie van functies
Registreer functies met behulp van de Fluent Builder-API met het patroon functionele opties. Elk triggertype heeft een registratiemethode voor het App object:
// 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 Queue Storage trigger
app.Queue("myQueueFunc", handler,
sdk.WithQueueName("myqueue"),
sdk.WithConnection("AzureWebJobsStorage"),
)
// Azure Service Bus trigger
app.ServiceBusQueue("myServiceBusFunc", handler,
sdk.WithQueueName("myqueue"),
sdk.WithConnection("ServiceBusConnection"),
)
// Azure SQL trigger
app.SQL("mySqlFunc", handler,
sdk.WithTable("dbo.Products"),
sdk.WithConnection("SqlConnectionString"),
)
// 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"),
)
Projectstructuur
Een Go-codeproject voor Azure Functions is een standaard Go-module. Wanneer u uitvoert func init --worker-runtime go, worden de volgende bestanden gegenereerd:
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
Het host.json bestand bevat configuratieopties op hostniveau. Zie de host.json-verwijzing voor meer informatie.
local.settings.json
In het local.settings.json bestand worden app-instellingen en verbindingsreeksen opgeslagen die tijdens lokale ontwikkeling worden gebruikt. Dit bestand wordt niet gepubliceerd naar Azure. Zie het bestand Met lokale instellingen voor meer informatie.
Triggers
De Go-worker biedt speciale registratiemethoden voor ondersteunde triggers.
Getypeerde triggerpayloads
De meeste ondersteunde triggers ontvangen hun payload inline via gRPC. De Azure Functions-host serialiseert de triggergegevens in het gRPC-bericht, en de worker deserialiseert deze in getypte Go-waarden. Deze triggers hebben:
- Getypte handler-signatures met compile-time-veiligheid
-
Geen externe Azure SDK afhankelijkheden: alleen
encoding/jsonis nodig - Payloads met beperkte omvang: change-feed-documenten, berichten en gebeurtenissen zijn afzonderlijke objecten met een beperkte omvang
Ondersteunde triggers:
| Aanleiding | Handlersignatuur | Registratiemethode |
|---|---|---|
| HTTP | func(http.ResponseWriter, *http.Request) |
app.HTTP() |
| Timer | TimerHandler |
app.Timer() |
| Azure Queue Storage (opslagservice voor wachtrijen) | QueueHandler |
app.Queue() |
| Azure Cosmos DB | func(context.Context, []bindings.CosmosDocument) error |
app.CosmosDB() |
| Azure Service Bus (wachtrij) | ServiceBusHandler |
app.ServiceBusQueue() |
| Azure Service Bus (onderwerp) | ServiceBusHandler |
app.ServiceBusTopic() |
| Event Hubs | EventHubHandler |
app.EventHub() |
| Event Grid | EventGridHandler |
app.EventGrid() |
| Azure SQL | func(context.Context, []bindings.SQLChange) error |
app.SQL() |
Event Hubs en Service Bus ondersteunen ook sterk getypeerde batchhandlers via app.EventHubBatch(), app.ServiceBusQueueBatch(), en app.ServiceBusTopicBatch().
SDK-typebindingen
SDK-typebindings bieden een geauthenticeerde Azure SDK-client in plaats van geserialiseerde triggergegevens. Voor Go worden SDK-typebindings ondersteund voor Blob Storage-triggers. De host stuurt metadata, zoals de containernaam en het blobpad, en de worker construeert een client die is gescoped op de specifieke resource. SDK-type bindings bieden:
- SDK-clientinjectie: de handler ontvangt een kant-en-klare client
-
Geïsoleerde afhankelijkheden: Azure SDK-pakketten bevinden zich in
triggers/<name>/ - Streaming-ondersteuning: maakt het mogelijk om grote nettoladingen te lezen zonder te bufferen via gRPC
Om de Blob Storage SDK-typebinding te gebruiken, voeg je een blanco import toe voor het Blob trigger-pakket:
import _ "github.com/azure/azure-functions-golang-worker/triggers/blob"
| Aanleiding | Verwerker ontvangt | Registratiemethode |
|---|---|---|
| Blob Storage | *blob.Client |
app.Blob() |
Voorbeeld van blob-trigger
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
}
Generieke host-triggers
Gebruik app.GenericTrigger() wanneer een compatibele hostextensie een trigger biedt die geen speciale Go-registratiemethode heeft. Generieke triggers ondersteunen ruwe tekst, byte slices en JSON-compatibele Go-types:
app.GenericTrigger("echoTool", echoTool, &bindings.GenericTrigger{
Type: "mcpToolTrigger",
Name: "call",
DataType: "string",
Properties: map[string]any{
"toolName": "echo",
"description": "Echo text using a generic Go trigger",
"toolProperties": `[{"propertyName":"text","propertyType":"string","description":"Text to echo","isRequired":true}]`,
},
})
De compatibele hostextensie moet worden geïnstalleerd. Generieke triggerregistratie biedt geen HTTP-afhandeling, SDK-clientinjectie, Durable Functions replay of service-specifieke berichtafwikkeling. Voor volledige voorbeelden, zie het voorbeeld van generieke triggers.
HTTP-triggers
HTTP-triggerhandlers maken gebruik van standaard Go-typen net/http , zodat ze onmiddellijk bekend zijn met Go-ontwikkelaars:
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-functies registreren met methoden en autorisatieniveau:
app.HTTP("myApi", myHandler,
sdk.WithMethods("GET", "POST"),
sdk.WithAuth("anonymous"),
)
HTTP-streaming
De Go-werkrol ondersteunt HTTP-streaming voor scenario's zoals door de server verzonden gebeurtenissen of het verzenden van grote antwoordgegevens:
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()
}
}
Timeractivatie
Timertriggers worden uitgevoerd volgens een schema dat is gedefinieerd door een cron-expressie:
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
}
Durable Functions
Go ondersteunt Durable Functions-orkestraties en -activiteiten via het middleware/durabletask pakket. Registreer je orchestrators en activiteiten bij de Durable middleware voordat je de middleware toevoegt aan de functie-app:
durable := durabletask.Middleware()
durable.Orchestrator("HelloCities", helloCities)
durable.Activity("SayHello", sayHello)
app.Use(durable)
Durable Functions voor Go vereist de Durable Task-extensie versie 3.15.0 of later. Entiteiten worden momenteel niet ondersteund. Voor een volledige toepassing, zie het voorbeeld van Durable Functions.
Beheer van afhankelijkheden
Go-codeprojecten maken gebruik van standaard Go-modules voor afhankelijkheidsbeheer.
Initialiseer een nieuwe module:
go mod init myappVoeg de Azure Functions Go Worker SDK toe:
go get github.com/azure/azure-functions-golang-workerVoor ondersteuning van blob-triggers wordt de afhankelijkheid automatisch opgenomen via de lege import van
triggers/blob.Nette afhankelijkheden:
go mod tidy
Lokaal uitvoeren
Gebruik Azure Functions Core Tools om uw project lokaal uit te voeren:
func start
Core Tools automatisch:
- Detecteert
FUNCTIONS_WORKER_RUNTIME = "native"uitlocal.settings.json. - Hiermee wordt de systeemeigen werkruntime omgezet naar Go wanneer een
go.modbestand aanwezig is. - Voert
go build -o bin/app .uit om uw project voor uw eigen besturingssysteem te compileren. - Start de Azure Functions host, die communiceert met het gecompileerde binaire bestand via gRPC.
- Geeft uw functie-eindpunten weer (bijvoorbeeld
http://localhost:7071/api/hello).
Gebruik local.settings.json dit om omgevingsvariabelen te configureren voor lokale ontwikkeling:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "native"
}
}
De gegenereerde AzureWebJobsStorage waarde is leeg voor Go-projecten. Stel dit in op een verbindingsreeks voor een opslagaccount of UseDevelopmentStorage=true wanneer u triggers gebruikt waarvoor hostopslag is vereist tijdens lokale ontwikkeling.
Uitrol
Compilatie en verpakking
Azure Functions Core Tools-versie 4.12 of hoger verwerkt Go-builds voor de algemene lokale en Azure-implementatiestromen:
-
func startbouwt uw project als bin/app voor uw lokale besturingssysteem voordat u de lokale Functions-host start. -
func azure functionapp publishbouwt, verpakt en implementeert uw project naar een bestaande functie-app in Azure. -
func packbouwt uw project als bin/app voor Linux x64 en maakt een implementeerbaar .zip pakket.
Bij het verpakken van Azure bevat het gegenereerde .zip-bestand de bestanden die nodig zijn voor de Linux Functions-host. Het gecompileerde binaire bestand wordt opgeslagen als bin/app in uw lokale project, maar Core Tools plaatst het in de hoofdmap van het implementatiepakket als app.
Als u gebruikt func pack --no-build, moet u het binaire Linux x64-bestand bouwen voordat u het pakket verpakt:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app .
Implementeren met Core Tools
Gebruik func azure functionapp publish om uw Go-project te implementeren in een bestaande functie-app in Azure:
func azure functionapp publish <APP_NAME>
Vervang door <APP_NAME> de naam van uw functie-app.
Een zip-pakket implementeren
Gebruik func pack dit wanneer u een implementatiepakket afzonderlijk van publicatie moet maken:
Maak een implementeerbaar zip-artefact:
func packImplementeer het pakket met behulp van de Azure CLI:
az functionapp deployment source config-zip --resource-group <RESOURCE_GROUP> --name <APP_NAME> --src <ZIP_FILE_PATH>
Het pakket dat wordt geproduceerd door func pack is klaar om in Azure te worden uitgevoerd, dus vraag geen externe build aan wanneer u het implementeert.
Docker-ondersteuning
U kunt Go-codeprojecten uitvoeren in containers. Initialiseer een project met Docker-ondersteuning:
func init --worker-runtime go --docker
Met de opdracht wordt een Dockerfile samen met de standaardprojectbestanden gegenereerd.
Telemetrie en waarneembaarheid
De Azure Functions Go-werkrol ondersteunt gestructureerde logboekregistratie en op OpenTelemetry gebaseerde waarneembaarheid. Gebruik contextbewuste methoden uit het standaardpakket log/slog , zoals slog.InfoContext, om logboeken te correleren met de huidige functie-aanroep. Als u OpenTelemetry wilt inschakelen, configureert u de Functions-host en registreert u de OpenTelemetry-middleware van de Go-worker in uw app. Zie
Bekende beperkingen
-
func newwordt niet ondersteund. Voeg functies toe door rechtstreeks te bewerkenmain.go. - Go-functie-apps draaien alleen op Linux in het Flex Consumption-plan.
- Alleen de specifieke triggers die in Triggers staan en compatibele generieke hosttriggers worden ondersteund.
- Extra inputbindings en niet-HTTP outputbindings worden momenteel niet ondersteund.
- Het verpakken van Go-apps in de Core Tools is momenteel gericht op Linux x64-toepassingen.