Serverless in Java : Azure Functions

Dopo aver visto AWS Lambda nel precedente articolo è ora il turno di Azure Functions

Azure Functions è la proposta di Microsoft in ambito Servless/FaaS e permette di realizzare una funzione/applicazione all’interno di Azure senza preoccuparsi troppo dell’infrastruttura circostante. Allo stato attuale i linguaggi supportati sono C#, F#, Node.js, Java e PHP, mentre per quanto riguarda il modello di pagamento previsto per queste funzioni è possibile utilizzare quello a consumo (come le AWS Lambda) oppure un piano di servizio (App Service plan) tipico di Azure dove si paga un fisso per una serie di servizi con certe caratteristiche.

Le integrazioni previste da Azure Functions sono principalmente quelle relative alla piattaforma Azure:

  • Azure Cosmos DB
  • Azure Event Hubs
  • Azure Event Grid
  • Azure Mobile Apps (tables)
  • Azure Notification Hubs
  • Azure Service Bus (queues and topics)
  • Azure Storage (blob, queues, and tables)
  • GitHub (webhooks)
  • On-premises (using Service Bus)
  • Twilio (SMS messages)

Un punto di forza di questa piattaforma è la possibilità di avere il runtime in locale, ovvero di poter lanciare e testare le funzioni prima sulla nostra macchina e successivamente effettuare il deploy su Azure. A partire da qualche mese è stato supportato anche Java tra i linguaggi che dispongono di un runtime per Azure Functions e ora vedremo come sia possibile realizzare una prima semplice funzione. Se non avete a disposizione un account su Azure potete richiederne uno gratuito a questo link

 

Hello Azure

Prima di iniziare dobbiamo installare una serie di tool necessari per lo sviluppo di Azure Functions con Java

Una volta completata l’installazione di questi tool possiamo iniziare ad installare il runtime locale di Azure Functions utilizzando npm per aggiungere al nostro ambiente alcuni programmi necessari per lo sviluppo/test di funzioni. Andiamo quindi in una console dei comandi e aggiungiamo il seguente modulo

 

Possiamo quindi generare il nostro progetto Java utilizzando un archetipo Maven

 

durante la generazione del progetto ci verrà chiesto il nome della nuova applicazione e la regione geografica dove sarà creata

 

 

Il progetto generato avrà al suo interno il nostro primo esempio di funzione

 

Il fatto che sia una funzione viene evidenziato dall’annotation FunctionName, dove indichiamo il nome da associare. L’altra informazione essenziale è il modo in cui viene scatenata l’esecuzione di questa funzione ed in questo caso si tratta di un trigger azionato da una chiamata HTTP, che viene dichiarato attraverso l’annotation HttpTrigger. Il metodo quindi scatta in risposta ad una chiamata HTTP e restituisce una stringa. Per lanciarlo prima di tutto lo impacchettiamo

 

e poi utilizziamo il plugin Maven di Azure (che ci troviamo automaticamente aggiunto nel POM) per lanciare la funzione in locale sul nostro pc

 

Se tutto è andato a buon fine troveremo il seguente output

 

 

e possiamo richiamare la nostra funzione con una semplice chiamata HTTP. Una volta testata l’applicazione in locale passiamo al deploy su Azure. Dalla console prima dobbiamo autenticarci con Azure seguendo le indicazioni

 

 

In questo modo saremo autenticati e potremo lanciare il comando del plugin Maven per effettuare il deploy

 

 

A questo punto potremo richiamare la nostra applicazione dall’url https://testazure-func0001.azurewebsites.net/api/hello

 

Trigger, Input e Output

Esplorando i trigger che possiamo utilizzare uno interessante è sicuramente quello relativo ai timer. Possiamo definire un timer attraverso la classica notazione stile crontab e vedere la nostra funzione richiamata ogni volta che scade il timer

 

 

Nell’esempio utilizziamo prima di tutto l’annotation TimerTrigger per specificare che la nostra funzione sarà richiamato ogni 30 secondi. Nel metodo della funzione viene creata una stringa random e ritornata in output. Attraverso l’utilizzo dell’annotation QueueOutput quello che ritorna la nostra funzione sarà inserito all’interno di una coda di messaggi su Azure. Microsoft mette a disposizione un servizio Storage, il quale include code, tabelle NoSQL chiave-valore, blob e file.

In questo esempio il risultato finirà in una coda di messaggi, con nome codaMessaggiInTransito ottenuta dalla connessione AzureWebJobsStorage. Quest’ultima è un’informazione che viene recuperata in fase di test dal file local.settings.json e ci permette di sapere a chi deve collegarsi la nostra funzione.

 

 

Questo file viene generato automaticamente dal plugin Azure Maven ma se poi vogliamo aggiungere configurazione specifiche o comunque customizzare lo storage utilizzato dovremo aggiungere la seguente configurazione al plugin

 

 

Queste informazioni poi saranno dopo il deploy tranquillamente aggiornabili dal tab Application Settings sulla nostra Azure Function App. Quindi ora abbiamo una funzione che viene azionata da un trigger ogni 30 secondi ed inserisce una stringa random sulla coda codaMessaggiInTransito. A questo punto vediamo come far scattare una seconda funzione con l’annotation QueueTrigger

 

 

Questa funzione viene risvegliata ogni volta che è inserito un elemento sulla coda codaMessaggiInTransito, effettua l’uppercase ed inserisce il messaggio nella nuova coda codaMessaggiInArrivo. Per concludere la catena c’è l’ultima funzione che scoda il messaggio e lo stampa nel log.

 

 

Conclusioni

Azure Functions è sicuramente interessante per lo sviluppo di applicazioni che potrebbero rientrare nella categoria serverless, soprattutto per chi già si trova a lavorare su Azure in quanto le integrazioni su questo sistema sono quelle primarie. Dal punto di vista dell’ambiente di sviluppo è molto utile la possibilità di testare le funzioni in locale ma purtroppo Java ancora non dispone di tutti i trigger/input/ouput che sono destinati a tutti i linguaggi sulla piattaforma (probabilmente perchè è stato appena inserito il suo supporto). Trigger e bindings attualmente supportati dalla piattaforma possono essere trovati a questa pagina, mentre per il riferimento per lo sviluppo Java è questo.

Di seguito trovate il solito progetto d’esempio Github

https://github.com/fpaparoni/AzureFuctions

 

 

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *