Le nostre competenze a vostra disposizione sul blog
Amiamo il nostro lavoro e vogliamo condividerlo con voi! Tenetevi aggiornati su tutte le news e le tecnologie con le quali lavoriamo e di cui potreste avere bisogno! Seguite il nostro blog.
×

Error message

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.
andrea.piolanti's picture

Un classico problema riscontrato nello sviluppo di applicazioni distribuite è rappresentato dalla realizzazione dell'architettura software che si occupa in maniera efficiente dello scambio dei messaggi fra i vari applicativi. In tal senso un valido contributo è rappresentato da Apache Thrift il quale presenta un linguaggio ed una piattaforma utili per la serializzazione delle entità software. Ovviamente nel corso degli anni il problema è stato affrontato numerose volte e come risultato sono nate varie alternative fra cui Protocol Buffer, JSON, o XML. Ma Thrift oltre alla serializzazione dei dati offre anche la possibilità di creare, in maniera semplice e indipendente dal linguaggio di programmazione, i servizi di back-end. Mette infatti a disposizione il codice necessario per lo sviluppo di client e server RPC.
La configurazione di Thrift è completamente racchiusa in un unico file (di estensione .thrift) nel quale, utilizzando l'IDL fornito da thrift, si vanno a definire i tipi di dato e le interfacce dei servizi da realizzare. Al fine di generare il codice in diversi linguaggi (C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk ), l'IDL di thrift è molto semplice e composto quasi esclusivamente da tipi di dato primitivi. In particolare : bool, byte, i16 (intero a 16 bit), i32 (intero a 32 bit), i64 (intero a 64 bit), double, string e i contenitori list, set e map.
Per esempio, se vogliamo realizzare un servizio thrift che restituisce i dettagli di un utente con uno specifico "nome utente", dobbiamo creare un file con estensione .thrift in cui si definisce l'entità che rappresenta l'utente e il servizio come segue:

struct UserTh {
       1:optional i64 idUser,
       2:string userName,
       3:string password,
       4:string name,
       5:string surname,
       6:string email,
}

service RetrieveUserInfoService {
       UserTh retrieveUser(1:string userName),
}

Prendendo questo file come input, il compilatore genera il codice da utilizzare per creare facilmente gli applicativi client e server mascherando tutta la parte di serializzazione/deserializzazione e trasposto dei dati.
Nel nostro esempio si crea una classe denominata UsertTh e una classe nominata RetrieveUserInfoService classe che contiene gli stub necessari per creare facilmente il client RPC e l'applicazione server.
Per esempio per creare il lato server abbiamo semplicemente bisogno di creare un gestore che implementa il server stub (Iface) generato:

public class RetrieveUserInfoServiceHandler implements RetrieveUserInfoService.Iface {
 
	public  UserTh retrieveUser(String userName) {
		// application dependent implementation
		return  …;
	}

}

Ciò consente allo sviluppatore di focalizzarsi sulla parte di business intelligence dell'applicazione e di non preoccuparsi del livello di trasporto.
Nel prossimo post verranno analizzati più da vicino i servizi thrift e in particolare: protocollo di trasporto, tipologie (bloccanti, non bloccanti, sincroni, asincroni) e sicurezza.

Aggiungi un commento

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.