Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
La compatibilidad con Go para Azure Functions está actualmente en versión preliminar pública. Durante la versión preliminar, las aplicaciones de funciones de Go solo se admiten en el plan de consumo flexible.
Azure Functions es un servicio de proceso sin servidor que puede usar para ejecutar código controlado por eventos sin aprovisionar ni administrar la infraestructura. El proceso de trabajo de Go permite escribir Azure Functions de forma nativa en Go, con una integración estrecha con el ecosistema de desencadenadores de Azure Functions.
Esta guía le ayuda a:
- Descripción del modelo de programación de Go
- Crear y estructurar el código del proyecto
- Trabajar con desencadenadores
- Implementar y ejecutar la aplicación localmente y en Azure
Para obtener más información sobre el desarrollo de Azure Functions en general, consulte la referencia del desarrollador de Azure Functions.
Cómo empezar
Elija el entorno que se adapte al flujo de trabajo y empiece a trabajar con Azure Functions para Go:
Prerequisites
- Go 1.24 o una versión posterior
-
Azure Functions Core Tools versión
4.12o posterior. Ejecutefunc --versionpara comprobar la versión instalada. -
CLI de Azure versión
2.87.0o posterior, al crear recursos Azure o implementar paquetes en Azure. Ejecuteaz versionpara comprobar la versión instalada.
Modelo de programación
El worker de Go usa un modelo de programación centrado en el código. Las funciones sin servidor y sus desencadenadores se definen mediante controladores de Go idiomáticos.
Punto de entrada
Cada proyecto de código de Go comienza con una main() función que crea una FunctionAppfunción , registra las funciones e inicia el trabajo:
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)
}
Registro de funciones
Registre funciones mediante la API fluent builder con el patrón de opciones funcionales. Cada tipo de desencadenador tiene un método de registro en el App objeto :
// 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"),
)
Estructura del proyecto
Un proyecto de código de Go para Azure Functions es un módulo de Go estándar. Al ejecutar func init --worker-runtime go, se generan los siguientes archivos:
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
El host.json archivo contiene opciones de configuración de nivel de host. Para obtener más información, consulte la referencia dehost.json.
local.settings.json
El local.settings.json archivo almacena la configuración de la aplicación y las cadenas de conexión que se usan durante el desarrollo local. Este archivo no se publica en Azure. Para más información, consulte Archivo de configuración local.
Desencadenadores
El trabajo de Go organiza los desencadenadores en dos niveles en función de sus requisitos de dependencia:
Desencadenadores principales
Los desencadenadores principales reciben su carga en línea a través de gRPC. El host de Azure Functions serializa los datos del activador en el mensaje gRPC, y el proceso de trabajo los deserializa en estructuras tipadas de Go. Estos desencadenadores tienen:
- Firmas de controlador tipadas con seguridad en tiempo de compilación
-
No se necesitan dependencias externas del SDK de Azure: solo se necesita
encoding/json - Cargas limitadas: los documentos, los mensajes y los eventos de fuente de cambios son objetos discretos y limitados por tamaño
Desencadenadores principales admitidos:
| Trigger | Firma del manejador | Método de registro |
|---|---|---|
| HTTP | func(http.ResponseWriter, *http.Request) |
app.HTTP() |
| Timer | TimerHandler |
app.Timer() |
| Azure Cosmos DB (la base de datos de Azure Cosmos) | func(context.Context, []bindings.CosmosDocument) error |
app.CosmosDB() |
| Azure Service Bus (cola) | ServiceBusHandler |
app.ServiceBusQueue() |
| Azure Service Bus (tema) | ServiceBusHandler |
app.ServiceBusTopic() |
| Event Hubs | EventHubHandler |
app.EventHub() |
| Event Grid | EventGridHandler |
app.EventGrid() |
Desencadenadores de extensión
Los desencadenadores de extensión proporcionan un cliente de SDK de Azure autenticado en lugar de datos sin procesar. El host solo envía metadatos (como el nombre del contenedor y la ruta del blob), y el proceso de trabajo crea un cliente limitado al recurso específico. Estos desencadenadores tienen:
- Inserción de cliente del SDK: el controlador recibe un cliente listo para usar
-
Dependencias aisladas: los paquetes del SDK de Azure se encuentran en
triggers/<name>/ - Compatibilidad con streaming: permite leer cargas grandes sin almacenar en búfer a través de gRPC.
Para usar un desencadenador de extensión, agregue una importación en blanco para el paquete de extensión:
import _ "github.com/azure/azure-functions-golang-worker/triggers/blob"
| Trigger | El controlador recibe | Método de registro |
|---|---|---|
| Blob Storage | *blob.Client |
app.Blob() |
Ejemplo de desencadenador de blobs
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
}
Desencadenadores HTTP
Los controladores de activadores HTTP usan tipos estándar de Go net/http, lo que hace que resulten inmediatamente familiares para los desarrolladores de 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)
}
Registrar funciones HTTP con métodos y nivel de autorización:
app.HTTP("myApi", myHandler,
sdk.WithMethods("GET", "POST"),
sdk.WithAuth("anonymous"),
)
Transmisión por HTTP
El worker de Go es compatible con la transmisión HTTP en escenarios como eventos enviados por el servidor o el envío de grandes volúmenes de datos de respuesta:
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()
}
}
Activador del temporizador
Los desencadenadores de temporizador se ejecutan según una programación definida por una expresión 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
}
Administración de dependencias
Los proyectos de código de Go usan módulos de Go estándar para la administración de dependencias.
Inicialice un nuevo módulo:
go mod init myappAgregue el SDK de trabajo de Azure Functions Go:
go get github.com/azure/azure-functions-golang-workerPara la compatibilidad con el desencadenador de blobs, la dependencia se incluye automáticamente a través de la importación en blanco de
triggers/blob.Dependencias ordenadas:
go mod tidy
Ejecutar localmente
Use Azure Functions Core Tools para ejecutar el proyecto localmente:
func start
Core Tools automáticamente:
- Detecta
FUNCTIONS_WORKER_RUNTIME = "native"desdelocal.settings.json. - Resuelve el tiempo de ejecución de trabajo nativo en Go cuando hay un
go.modarchivo presente. - Ejecuta
go build -o bin/app .para compilar el proyecto para el sistema operativo local. - Inicia el host de Azure Functions, que se comunica con el binario compilado a través de gRPC.
- Muestra los endpoints de tus funciones (por ejemplo,
http://localhost:7071/api/hello).
Use local.settings.json para configurar variables de entorno para el desarrollo local:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "native"
}
}
El valor generado AzureWebJobsStorage está vacío para los proyectos de Go. Establézcalo como una cadena de conexión de una cuenta de almacenamiento o UseDevelopmentStorage=true cuando use desencadenadores que requieran almacenamiento del host durante el desarrollo local.
Deployment
Compilación y empaquetado
Azure Functions Core Tools versión 4.12 o posterior gestiona las compilaciones de Go para los flujos habituales de implementación local y en Azure:
-
func startcompila el proyecto como bin/app para el sistema operativo local antes de iniciar el host local de Functions. -
func azure functionapp publishcompila, empaqueta e implementa el proyecto en una aplicación de funciones existente en Azure. -
func packcompila el proyecto como bin/app para Linux x64 y crea un paquete .zip implementable.
Al empaquetar para Azure, el archivo .zip generado contiene los archivos necesarios para el host de Functions de Linux. El binario compilado se almacena como bin/app en el proyecto local, pero Core Tools lo coloca en la raíz del paquete de implementación como aplicación.
Si usa func pack --no-build, debe compilar el binario x64 de Linux antes de empaquetar:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app .
Implementación con Core Tools
Use func azure functionapp publish para implementar el proyecto de Go en una aplicación de funciones existente en Azure:
func azure functionapp publish <APP_NAME>
Reemplace <APP_NAME> por el nombre de la aplicación de función.
Implementación de un paquete ZIP
Use func pack cuando necesite crear un paquete de implementación independientemente de la publicación:
Cree un artefacto zip que se pueda implementar:
func packImplemente el paquete mediante el CLI de Azure:
az functionapp deployment source config-zip --resource-group <RESOURCE_GROUP> --name <APP_NAME> --src <ZIP_FILE_PATH>
El paquete generado por func pack está listo para ejecutarse en Azure, por lo que no solicite una compilación remota al implementarlo.
Compatibilidad con Docker
Puede ejecutar proyectos de código de Go en contenedores. Inicialice un proyecto con compatibilidad con Docker:
func init --worker-runtime go --docker
El comando genera un Dockerfile junto con los archivos de proyecto estándar.
Telemetría y observabilidad
El proceso de trabajo de Go para Azure Functions admite el registro estructurado y la observabilidad basada en OpenTelemetry. Use métodos compatibles con el contexto del paquete estándar log/slog , como slog.InfoContext, para correlacionar los registros con la invocación de función actual. Para habilitar OpenTelemetry, configure el host de Functions y registre el middleware de OpenTelemetry para el trabajador de Go en su aplicación. Para obtener instrucciones de configuración, consulte Use OpenTelemetry con Azure Functions.
Limitaciones conocidas (versión preliminar)
Durante la versión preliminar pública, se aplican las siguientes limitaciones:
-
func newno es compatible. Agregue funciones editandomain.godirectamente. - Durable Functions no es compatible con Go durante la vista previa pública.
- Las aplicaciones de funciones de Go solo se ejecutan en Linux en Azure.
- Solo se admiten los desencadenadores enumerados en Desencadenadores durante la versión preliminar.
- El empaquetado de go en Core Tools está destinado actualmente a aplicaciones x64 de Linux.