Negli ultimi anni, il concetto di “serverless” ha guadagnato notevole popolarità nel campo dello sviluppo software e dell’infrastruttura cloud. Contrariamente a quanto suggerisce il termine, il modello serverless non implica l’assenza di server, ma piuttosto che la gestione e il mantenimento dell’infrastruttura server sono completamente trasparenti agli sviluppatori e quindi il team di sviluppo non deve implementare l’infrastruttura, semmai potrebbe dover configurarla.
La differenza con il modello tradizionale
Nel modello tradizionale di sviluppo, gli sviluppatori devono gestire un’applicazione insieme all’infrastruttura necessaria per eseguirla, inclusi server, reti, bilanciatori di carico e altri componenti, questo comporta una notevole complessità e richiede competenze specifiche per l’amministrazione dei sistemi. Al contrario, con l’approccio serverless, gli sviluppatori possono concentrarsi esclusivamente sulla logica dell’applicazione, delegando la gestione dell’infrastruttura al provider di servizi cloud.
Funzionamento del modello serverless
Nel modello serverless, il provider di servizi cloud, come Amazon Web Services (AWS), Google Cloud Platform (GCP) o Microsoft Azure, si occupa di gestire le risorse server e i dettagli dell’infrastruttura. Gli sviluppatori creano funzioni o microservizi che vengono eseguiti su richiesta. Questo significa che la scalabilità, l’approvvigionamento delle risorse e l’ottimizzazione delle prestazioni sono gestiti automaticamente dal provider cloud, permettendo una scalabilità quasi infinita in risposta alla domanda degli utenti.
Vantaggi del modello serverless
L’architettura serverless offre numerosi vantaggi, tra cui:
- Riduzione dei costi operativi: Con il modello serverless, si paga solo per il tempo effettivo di esecuzione delle funzioni e non è necessario mantenere server dedicati che potrebbero rimanere inattivi per lunghi periodi, riducendo così i costi.
- Scalabilità automatica: L’infrastruttura cloud gestisce automaticamente la scalabilità in base alla domanda; le funzioni possono essere replicate e distribuite rapidamente ed efficientemente, consentendo di gestire carichi di lavoro variabili senza interventi manuali.
- Flessibilità e semplicità: Gli sviluppatori possono concentrarsi solo sulla logica dell’applicazione, senza preoccuparsi della gestione dell’infrastruttura sottostante e questo consente di ridurre i tempi di sviluppo e di distribuzione.
- Maggiore produttività: La riduzione delle attività amministrative permette agli sviluppatori di focalizzarsi sulle funzionalità dell’applicazione, aumentando la produttività e accelerando il rilascio di nuove funzionalità.
- Riduzione della complessità operativa: Non è necessario preoccuparsi dell’approvvigionamento delle risorse o della gestione dei server, riducendo così la complessità operativa e i potenziali errori.
- Affidabilità elevata: I servizi serverless sono gestiti da provider cloud affidabili che garantiscono alta disponibilità e robustezza; inoltre l’esecuzione isolata delle funzioni aumenta l’affidabilità complessiva.
- Tempi di risposta rapidi: La distribuzione automatica delle funzioni su server geograficamente distribuiti riduce la latenza e migliora l’esperienza dell’utente.
Esempi di codice java su piattaforme cloud serverless
Per utilizzare le funzionalità serverless con il linguaggio Java, possiamo sfruttare i servizi offerti da piattaforme come AWS Lambda, Google Cloud Functions e Azure Functions. Ecco una guida su come scrivere e distribuire una semplice funzione Java utilizzando AWS Lambda.
Prerequisiti
- Un account AWS
- AWS CLI configurato
- Maven installato
Step 1: creare un progetto maven
Creiamo un nuovo progetto Maven con una struttura di base.
mvn archetype:generate -DgroupId=com.example -DartifactId=lambda-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Code language: JavaScript (javascript)
Step 2: scrivere la funzione lambda
Modifichiamo il file App.java
per implementare la nostra funzione Lambda.
package com.example;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class App implements RequestHandler<RequestClass, ResponseClass> {
public ResponseClass handleRequest(RequestClass request, Context context) {
String greeting = "Hello, " + request.getName();
return new ResponseClass(greeting);
}
}
Code language: PHP (php)
Step 3: definire le classi di Request e Response
Creiamo le classi RequestClass
e ResponseClass
per gestire i dati di input e output.
package com.example;
public class RequestClass {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example;
public class ResponseClass {
private String message;
public ResponseClass(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
Code language: JavaScript (javascript)
Step 4: configurare il file di deployment
Modifichiamo il file pom.xml
per includere le dipendenze necessarie per AWS Lambda.
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
Code language: HTML, XML (xml)
Step 5: creare l’artifact
Compiliamo il progetto e creiamo l’artifact che sarà caricato su AWS Lambda.
mvn package
Step 6: caricare la funzione su aws lambda
Utilizziamo AWS CLI per caricare la funzione Lambda.
aws lambda create-function --function-name HelloWorldFunction --zip-file fileb://target/lambda-demo-1.0-SNAPSHOT.jar --handler com.example.App::handleRequest --runtime java11 --role arn:aws:iam::123456789012:role/lambda-execution-role
Code language: JavaScript (javascript)
Step 7: testare la funzione
Possiamo testare la funzione direttamente dalla console AWS o utilizzando AWS CLI.
aws lambda invoke --function-name HelloWorldFunction --payload '{"name": "World"}' response.json
Code language: JavaScript (javascript)
Il file response.json
conterrà l’output della funzione.
Limiti del modello serverless
Nonostante i numerosi vantaggi, il modello serverless potrebbe non essere adatto a tutte le applicazioni: carichi di lavoro che richiedono elaborazioni costanti o di lunga durata potrebbero non beneficiare del modello serverless e potrebbero necessitare di un’infrastruttura tradizionale per un controllo più granulare e per costi potenzialmente inferiori. È cruciale valutare attentamente le esigenze specifiche dell’applicazione prima di adottare un’architettura serverless.
Conclusioni
L’adozione di nuove forme di sviluppo, come il modello serverless, rappresenta un’opportunità significativa per migliorare l’efficienza e la scalabilità delle applicazioni. Tuttavia, è fondamentale comprendere che ogni esigenza ha il suo strumento dedicato e non bisogna adottare tecnologie solo perché vanno di moda, ma la scelta va fatta sulla base di motivazioni tecniche e di progetto per quanto possibile.
Imparare a valutare e selezionare gli strumenti più appropriati per ogni situazione è una competenza essenziale per sviluppatori e architetti del software, garantendo così soluzioni ottimali e sostenibili nel tempo.