Ballerina è un linguaggio di programmazione dedito allo sviluppo di integrazione tra servizi e dati, si basa su un linguaggio semplice supportato dalla possibilità di disegnare sequence diagram dell’applicativo stesso.
L’obbiettivo di Ballerina è quello di astrarre lo sviluppo di applicativi dalla piattaforma che li andranno a contenere, il gruppo di lavoro non si deve quindi occupare di gestire differenze strutturali per l’esecuzione degli applicativi o per l’interconnessione delle basi di dati, disaccoppiando questi elementi ci si può concentrare in maniera totale sui requisiti di business.
Internet è diventato, nel corso degli anni, il modo migliore per distribuire dati. Il dato è diventato il core business delle aziende, la sua distribuzione in maniera sicura è una componente fondamentale richiesta in fase di sviluppo degli applicativi.
I dati vengono distribuiti tramite l’esposizione di API, le API sono uno standard per definire interfacce riguardanti i dati richiesti e forniti da uno specifico servizio. Quando uno sviluppatore si interfaccia tramite un’API non si chiede quale sia il linguaggio utilizzato per implementare il singolo servizio, il suo interesse principale è quello di fornire i dati come richiesto in input ed interpretare in maniera corretta le risposte ottenute.
L’obiettivo di Ballerina è proprio quello di dare agli sviluppatori un modo di interfacciarsi correttamente con le API esposte in modo da potersi concentrare in maniera pressoché totale sui requisiti di business.
Iniziamo da bal
Il primo approccio al linguaggio è dato dal comando bal
, questo comando permette la gestione delle dipendenze e la fase di build, test ed esecuzione dell’applicativo. Dopo aver sviluppato l’applicazione nel linguaggio Ballerina, si può utilizzare il comando bal build
per creare un pacchetto di distribuzione, o bal run
per eseguire il codice direttamente dai sorgenti.
A chi volesse iniziare ad approcciare il linguaggio consiglio anche i comandi bal new
che crea una struttura basilare di directory e files per il progetto che si vuole sviluppare ed il comando bal test
per procedere a testare quanto implementato.
I pacchetti di Ballerina permetto di strutturare le attività di sviluppo in appositi task. Il comando bal
permette di gestire i singoli pacchetti locali in base a quelli rilasciati nel repository centrale.
new | Create a Ballerina package. For more information, see Create a new package. |
add | Add a new module to the current package. |
graph | Print the dependency graph in the console. |
search | Search Ballerina Central for packages. |
semver | Validate SemVer compatibility of the local package changes against any previously published version(s) in Ballerina Central. |
pull | Pull a package from Ballerina Central. |
push | Publish a package to Ballerina Central. For more information, see Publish packages to Ballerina Central. |
deprecate | Deprecate a version of a package in Ballerina Central. |
Integrazione al centro
Quante righe di codice sono necessarie per esporre un servizio REST? La risposta corretta è: dipende dal linguaggio e dalle librerie disponibili. Nel caso di Ballerina queste si riducono al minimo:import ballerina/http;
è disponibile un package per la definizione dei servizi HTTP, quindi ci possiamo dedicare allo sviluppo del servizio stesso:service / on httpListener {
resource function get someGetMethod() returns string {
// logica applicativa
return "Some value";
}
// URI var
resource function get someGetValue/[string value]() returns string {
return "Some " + value;
}
}
Questo appena proposto è essenzialmente un mockup, esattamente ciò di cui necessitiamo per i test. Con la documentazione Swagger/OpenApi a disposizione, possiamo rapidamente renderlo accessibile ai sistemi periferici e, internamente, concentrarci sullo sviluppo delle singole funzionalità (risorse) esposte.
Pronto all’uso
Integrarsi con il cloud significa implementare connettori che interagiscano con il parco di prodotti disponibili, prendiamo ad esempio l’esigenza di dover gestire i dati salvati all’interno di un account Google Drive, Ballerina mette a disposizione una libreria:import ballerinax/trigger.google.drive;
che implementa i metodi onFileCreate, onFolderCreate, onFileUpdate, onFileUpdate, onFolderUpdate, onDelete, onFileTrash, onFolderTrash
così da poter sottoscrivere ognuno degli eventi disponibili1.
In alternativa potremmo aver bisogno di creare un ordine tramite Paypal2import ballerinax/paypal.orders;
o svariate altre esigenze che possono essere risolte velocemente attraverso le librerie messe a disposizione.
What you see is what you get
Una volta raccolti i requisiti di business occorre redigere la documentazione da condividere con gli sviluppatori che implementano il codice, questo normale processo porta naturalmente a creare un distacco tra quanto analizzato e quanto implementato.
L’integrazione di Ballerina con ide di sviluppo permette di avere costantemente la visibilità che quanto implementato corrisponda a quanto richiesto in fase di analisi. Si può partire dal disegno del sequence diagram che viene tradotto in codice Ballerina e successivamente verificare che i metodi scritti siano coerenti con quanto definito in fase di analisi.
E’ importante comprendere quanto esposto tramite questa immagine: il codice e la relativa rappresentazione in sequence diagram sono equivalenti, ogni modifica apportata ad una delle due componenti influisce sull’altra in quanto il disegno è il codice ed il codice è il disegno.
Integrazione con i progetti Java
Le organizzazioni hanno investito nel corso degli anni tempo e denaro per implementare applicativi sviluppati in Java, questi possono essere oggi dei programmi che richiedono una ristrutturazione per essere esposti come servizi REST tramite API e quindi interfacce standard.
La richiesta della maggior parte delle aziende è quella di poter riutilizzare quanto in loro possesso per evitare ulteriore esborso di capitali e per mantenere il know how degli applicativi stessi.
La struttura di Ballerina permette di integrarsi in maniera naturale con gli applicativi Java, anche se non si tratta di un linguaggio progettato per essere eseguito all’interno di una JVM, la sua implementazione fornisce piena aderenza alla semantica dei linguaggi.
E’ quindi possibile scrivere codice Ballerina per invocare in maniera nativa quanto già implementato in linguaggio Java. A supporto degli sviluppatori è stato rilasciato il tool Bindgen3 che permette di generare i bindings in linguaggio Ballerina per le relative classi Java.
Risposte alle esigenze di mercato
Ballerina propone alcuni costrutti che possono rispondere a casi d’uso o possono essere ispirazione per risolverne di più complessi. All’interno del proprio sito di documentazione sono descritti gli EIP4 e gli esempi di implementazione degli stessi.
Un esempio di risoluzione del pattern:
<strong>import ballerina/http;
type Approval record {
TEAM_LEAD|MANAGER|SENIOR_MANAGER leadLevel;
int score;
int nextPromotionLevel;
};
const TEAM_LEAD = 1;
const MANAGER = 2;
const SENIOR_MANAGER = 3;
final map<Approval[]> incompleteApprovals = {};
final http:Client hrClient = check new ("http://api.wso2hr.com.balmock.io");
service /api/v1 on new http:Listener(8080) {
resource function post employees/[string emoloyeeId]/approval(Approval approvalReq) returns error? {
Approval[]? approvals = incompleteApprovals[emoloyeeId];
if approvals == () {
incompleteApprovals[emoloyeeId] = [approvalReq];
return;
}
approvals.push(approvalReq);
if approvals.length() < 3 {
return;
}
from Approval approval in approvals
order by approval.leadLevel
do {
_ = check hrClient->/promotions/employees/[emoloyeeId]/approval.post(approval, targetType = json);
};
_ = incompleteApprovals.remove(emoloyeeId);
}
}</strong>
Code language: HTML, XML (xml)
Vengono anche proposti use case di integrazione tra prodotti di mercato, un esempio di integrazione dati tra Google Sheets e Salesforce:
Curva di apprendimento
Quando si è iniziato a pensare a Ballerina uno degli obiettivi era proprio la volontà di proporre un prodotto di semplice utilizzo, per poter analizzare a fondo questo linguaggio in modo da esplorarne tutte funzionalità puoi contattarci direttamente in modo da avere un supporto alla risoluzione dei vari use case.