Esercizio - Usare un gestore personalizzato per creare un'app
In questo esercizio si creerà ed eseguirà un'app serverless usando Go.
Eseguire lo scaffolding dell'app
Inizia strutturando l'applicazione, utilizzando l'estensione Azure Functions in Visual Studio Code.
- Selezionare Visualizza>Riquadro comandi.
- Selezionare Azure Functions: Crea nuovo progetto.
- Selezionare una cartella, in genere la cartella corrente.
- In Selezionare un linguaggio specificare Gestore personalizzato.
- In Selezionare un modello per la prima funzione specificare HttpTrigger.
- Assegnare un nome all'app, ad esempio hello.
- Selezionare un livello di autorizzazione anonimo. È possibile modificare questa impostazione in un secondo momento, se necessario.
A questo punto è disponibile un progetto simile al seguente:
hello/
function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json
Creare l'app
La sequenza successiva di passaggi consiste nella creazione di un'app in grado di rispondere a un trigger HTTP.
Creare un file denominato server.go nella radice del progetto.
Includere in server.go il contenuto seguente:
package main import ( "fmt" "io" "log" "net/http" "os" )Il codice precedente importa tutte le librerie necessarie per creare un'app HTTP e cercare le variabili di ambiente.
Aggiungere il codice seguente dopo le istruzioni di importazione:
func main() { customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT") if !exists { customHandlerPort = "8080" } mux := http.NewServeMux() // mux.HandleFunc("/api/hello", helloHandler) fmt.Println("Go server Listening on: ", customHandlerPort) log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux)) }La funzione
main()viene richiamata da sola. La prima riga del codice indica come viene letta dalla variabile di ambienteFUNCTIONS_CUSTOM_HANDLER_PORT:customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")Successivamente, la funzione verifica se la porta esiste. In caso contrario, alla funzione viene assegnata la porta 8080:
if !exists { customHandlerPort = "8080" }Il codice successivo crea un'istanza del server HTTP:
mux := http.NewServeMux()L'ultima riga rilevante è quella che inizia ad ascoltare su una porta specifica e segnala che è pronta per ricevere richieste, con il metodo
ListenAndServe():log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))Si aggiungerà ora il codice rimanente. Prima di tutto, individuare la riga seguente e rimuovere il commento:
// mux.HandleFunc("/api/hello", helloHandler)Tra le istruzioni di importazione e la funzione
main()aggiungere il codice seguente:func helloHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == "GET" { w.Write([]byte("hello world")) } else { body, _ := io.ReadAll(r.Body) w.Write(body) } }La funzione
helloHandler()imposta il tipo di contenuto suapplication/json. Risponde con "hello world" o il corpo eventualmente pubblicato.
Eseguire l'app
A questo punto la creazione del codice è stata completata, ma si devono eseguire alcune operazioni di configurazione per rendere operativo lo scenario. È necessario specificare dove si trova il file eseguibile, in modo che sia rilevabile dall'host di Funzioni, Devi anche configurare il routing e indicare che questa app gestisce solo trigger HTTP e nessun altro tipo di associazione.
Da un terminale eseguire
go build server.gonella radice del progetto:go build server.goQuesto passaggio crea un file eseguibile denominato server in macOS e Linux oppure oserver.exe in un sistema operativo Windows.
Aprire il file host.json e trovare l'elemento
defaultExecutablePathall'interno dicustomHandler. Specificare./serverin macOS e Linux oppure.\\server.exein un sistema operativo Windows.In
customHandleraggiungere l'elementoenableForwardingHttpRequeste assegnargli il valoretrue. L'elementocustomHandleravrà l'aspetto seguente:"customHandler": { "description": { "defaultExecutablePath": "./server", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest" : true }Da un terminale eseguire
func startnella radice del progetto. Verrà così avviata l'app per le funzioni.func startAlla fine verrà visualizzato un output simile al seguente:
Functions: hello: [GET,POST] http://localhost:7071/api/helloIn un browser, passare a
http://localhost:7071/api/hello. Dovresti vedere l'output "hello world".
Complimenti. Hai sviluppato un'app serverless in Go.