Creazione di applicazioni serverless con funzioni di Azure e soluzioni .NET
Pubblicato: 2023-09-21Il serverless computing è un modello di esecuzione cloud che consente agli sviluppatori di creare ed eseguire applicazioni e servizi senza pensare ai server. Con il serverless, le applicazioni non si basano sul mantenimento dei server in esecuzione: il fornitore di servizi cloud gestisce dinamicamente l'allocazione e il provisioning dei server. Ciò consente agli sviluppatori di concentrarsi sulla codifica della logica aziendale piuttosto che sulla gestione del server.
Funzioni di Microsoft Azure è un servizio di elaborazione serverless per la creazione e l'hosting di endpoint Web e processi di elaborazione in background senza dover effettuare il provisioning o gestire i server. Con Funzioni di Azure è possibile eseguire codice su richiesta in risposta a eventi senza dover effettuare o gestire in modo esplicito l'infrastruttura. In questo post del blog esploreremo come creare applicazioni serverless con Funzioni di Azure utilizzando soluzioni .NET, incluso l'utilizzo dei servizi di sviluppo ASP.NET .
Che cosa sono Funzioni di Azure?
Funzioni di Azure consente di eseguire codice nel cloud senza distribuire o gestire l'infrastruttura. Con Funzioni scrivi solo il codice necessario per il problema in questione senza preoccuparti della gestione dei server. Azure gestisce tutta l'infrastruttura e i server per te.
Alcuni aspetti e vantaggi chiave di Funzioni di Azure:
- Basato sugli eventi: le funzioni vengono attivate da eventi di molti servizi di Azure e di terze parti. Questi includono richieste HTTP, timer, code, API serverless e altro ancora. È possibile eseguire il codice in risposta a questi eventi.
- Ridimensionamento automatico: Azure gestisce e ridimensiona automaticamente le funzioni in base alla frequenza delle richieste in arrivo e al carico di elaborazione. Non è necessario effettuare il provisioning e ridimensionare i server manualmente.
- Pagamento per esecuzione: paghi solo per le risorse di calcolo necessarie per eseguire il codice. Non sono previsti costi di inattività quando le tue funzioni non sono in esecuzione.
- Più linguaggi: le funzioni supportano C#, JavaScript, Python, PowerShell, Java e altro. Puoi sviluppare funzioni nella tua lingua preferita.
- Esperienza serverless: con Funzioni ti concentri sulla scrittura del codice e lasci che Azure gestisca tutto il provisioning, la configurazione e la gestione del server. Ottieni una vera esperienza serverless.
Sviluppo di funzioni .NET in locale
Per sviluppare funzioni .NET in locale, sono necessari gli strumenti principali di Funzioni di Azure, ovvero un'interfaccia da riga di comando per lo sviluppo, il test e la distribuzione di Funzioni di Azure sia localmente che in Azure.
Per configurare l'ambiente di sviluppo:
- Installa la versione più recente di .NET Core SDK
- Installare gli strumenti principali di Funzioni di Azure utilizzando lo strumento dotnet install -g Microsoft.Azure.WebJobs.Script.WebHost
- Creare una directory per il progetto dell'app per le funzioni ed eseguire func init
- Ciò creerà un'impalcatura per un progetto di funzioni di esempio con un modello di funzione
Ora puoi aggiungere il codice della funzione, testarlo localmente e pubblicarlo in Azure usando l'interfaccia della riga di comando func. Aggiungi un file run.csx per una funzione C# attivata da HTTP:
Fonte {csharp}
copia
#r “Newtonsoft.Json”
utilizzando Microsoft.AspNetCore.Mvc;
utilizzando Microsoft.Extensions.Primitives;
utilizzando Newtonsoft.Json;
utilizzando System.Net;
utilizzando System.Threading.Tasks;
Attività pubblica asincrona statica <IActionResult> Esegui (HttpRequest req, registro ILogger)
{
log.LogInformation("La funzione trigger HTTP C# ha elaborato una richiesta.");
stringa nome = req.Query[“nome”];
stringa requestBody = attende nuovo StreamReader(req.Body).ReadToEndAsync();
dati dinamici = JsonConvert.DeserializeObject(requestBody);
nome = nome ?? dati?.nome;
nome restituito!= null
? (ActionResult)new OkObjectResult($”Ciao, {nome}”)
: new BadRequestObjectResult("Passa un nome nella stringa della query o nel corpo della richiesta");
}
Provalo localmente eseguendo func host start che avvia il gateway delle funzioni sul tuo localhost. Ora puoi attivarlo utilizzando Postman o il browser con http://localhost:7071/api/HttpExample?name=John.
Scelta dei trigger e delle associazioni di Funzioni di Azure
Funzioni di Azure supportano molte origini e destinazioni di eventi diverse denominate trigger e associazioni. La scelta dei trigger e dei collegamenti giusti è importante in base al caso d'uso.
Alcuni trigger comuni in Funzioni sono:
- Trigger HTTP: per creare API REST ed endpoint Web. Il codice viene attivato dalle richieste HTTP.
- Trigger timer: per lavori pianificati eseguiti secondo una pianificazione, ad esempio ogni 5 minuti.
- Trigger coda: per elaborare i messaggi dalle code di archiviazione.
- Trigger BLOB: per reagire ai BLOB nuovi o aggiornati nell'archiviazione BLOB di Azure.
Le associazioni consentono alle funzioni di interagire con archivi dati e servizi esterni. Le associazioni comuni includono:
- Coda di archiviazione: per inviare messaggi alle code di archiviazione.
- Archiviazione BLOB: per leggere e scrivere nell'archiviazione BLOB di Azure.
- Cosmos DB: per eseguire query e modificare documenti nel servizio database Azure Cosmos DB.
- Bus di servizio: per la gestione dei messaggi dalle code e dagli argomenti del bus di servizio di Azure.
La scelta del trigger e dei collegamenti giusti aiuta a creare soluzioni end-to-end integrando diverse funzioni con dati e servizi.
Utilizzo di funzioni durevoli
Le funzioni durevoli consentono di scrivere funzioni stateful che consentono di eseguire sequenze di operazioni in modo affidabile anche in caso di guasti o riavvii. Ti consente di strutturare flussi di lavoro di lunga durata come macchine a stati.
Ad esempio, puoi creare un flusso di lavoro utilizzando Funzioni durevoli composto da:
- Funzione orchestratore: agisce come una macchina a stati che coordina l'esecuzione delle funzioni di attività nell'ordine corretto.
- Funzioni di attività: piccole unità di lavoro indipendenti che possono essere chiamate dalle funzioni dell'orchestratore.
I vantaggi derivanti dall'utilizzo delle Funzioni durevoli includono:
- Tentativi affidabili: Durable Functions ritenta automaticamente le funzioni di attività se falliscono.
- Chiamate asincrone: la funzione dell'agente di orchestrazione può eseguire funzioni di attività in modo asincrono e attenderne il completamento.
- Punti di controllo: lo stato viene sottoposto a checkpoint continui in modo che i flussi di lavoro possano essere ripristinati anche dopo il riavvio o gli errori dell'app.
Vediamo un semplice flusso di lavoro che orchestra due attività:
Fonte {csharp}
copia
[NomeFunzione("Orchestratore")]
Attività pubblica asincrona statica RunOrchestrator(
[OrchestrazioneTrigger] Contesto IDurableOrchestrationContext)
{
var output1 = attendono contesto.CallActivityAsync<string>("DotNetActivity", "Ciao");
var output2 = attendono contesto.CallActivityAsync<string>(“DotNetActivity”, output1);
// restituisce il risultato
restituire l'output2;
}
[NomeFunzione("AttivitàDotNet")]
public static Task<string> Esegui(
Ingresso stringa [ActivityTrigger],
Registro ILogger)
{
log.LogInformation($”Funzione DotNetActivity elaborata: {input}”);
return Task.FromResult(input.ToUpper());
}
Le funzioni durevoli consentono di scomporre processi complessi in flussi di lavoro affidabili.
Procedure consigliate per lo sviluppo di Funzioni di Azure
Alcune best practice da seguire per lo sviluppo di Funzioni di Azure:
- Utilizzare l'inserimento delle dipendenze: servizi di inserimento delle dipendenze nelle funzioni per una migliore testabilità.
- Evita processi a lunga esecuzione: le funzioni hanno lo scopo di eseguire codice su piccole unità di elaborazione. Mantieni breve l'esecuzione del codice.
- Utilizza tipi di dati immutabili: le funzioni sono senza stato, quindi evita tipi/effetti collaterali modificabili che possono causare problemi.
- Gestione centralizzata degli errori: aggiungi una logica comune di gestione degli errori anziché gestire gli errori individualmente ovunque.
- Registrazione strutturata: la registrazione standardizzata aiuta con il debug, il monitoraggio e gli audit trail.
- Limitazione e tentativi: gestire gli errori di limitazione implementando nuovi tentativi con backoff esponenziali.
- Versionamento: trigger di versione, associazioni e input/output forti per evitare modifiche di rilievo.
- Monitoraggio e strumentazione: utilizza strumenti come Application Insights per la registrazione, il monitoraggio delle prestazioni e l'analisi dell'utilizzo.
- Utilizza associazioni di contesto: sfrutta le associazioni di contesto per accedere a elementi come le impostazioni dell'app senza dipendenze aggiuntive.
Il rispetto di queste procedure consigliate aiuta a creare applicazioni serverless robuste, affidabili e scalabili con Funzioni di Azure.
Distribuzione di funzioni in Azure
Una volta che le funzioni sono pronte, puoi distribuirle in Azure tramite l'interfaccia della riga di comando di Azure, PowerShell, Visual Studio o direttamente dall'interfaccia della riga di comando degli strumenti principali di Funzioni di Azure:
copia
func azure functionapp pubblicare <nome-app-funzione>
La cartella del progetto delle funzioni verrà pubblicata in un'app per le funzioni di Azure. Alcuni vantaggi chiave della distribuzione di funzioni in Azure includono:
- Scalabilità automatica: le funzioni si adattano in base al volume delle richieste in entrata o ai trigger temporali.
- Alta disponibilità: più istanze nei data center garantiscono un'elevata disponibilità.
- Monitoraggio e registrazione: utilizza strumenti come Application Insights per monitorare prestazioni, errori, ecc.
- Piattaforma serverless: nessun server da fornire/gestire. Ti concentri solo sul codice.
- Distribuzione continua: utilizza pipeline CI/CD per la distribuzione automatizzata in caso di modifiche al codice.
Azure gestisce tutta l'infrastruttura, evita i costi di inattività e fornisce una piattaforma completamente serverless per eseguire applicazioni serverless su larga scala in modo affidabile.
Conclusione
L'elaborazione serverless con Funzioni di Azure consente agli sviluppatori di concentrarsi sulla logica aziendale scaricando tutta l'infrastruttura e la gestione delle operazioni su Azure. Il supporto nativo per lo sviluppo .NET, inclusa la possibilità di assumere sviluppatori ASP.NET Core , consente di creare con facilità soluzioni serverless robuste in C#. Con trigger, associazioni e funzioni durevoli, gli sviluppatori possono creare architetture e flussi di lavoro end-to-end guidati da eventi come funzioni stateless e stateful. Combinate con le best practice, Funzioni di Azure consentono di creare e distribuire applicazioni serverless nel cloud con semplicità e scalabilità.