Introduzione al Simple Cloud API by Enrico Zimuel Senior Consultant & Architect Zend Technologies enrico@zend.com
Mi presento Dal 2008 Senior Consultant e Architect presso Zend Technologies Software Engineer dal 1996: C/C++, Java, PHP, Perl, VB/C#/ASP.NET, JavaScript Più di 10 anni di esperienza in PHP Speaker internazionale: PHPCon, PHP Barcelona Conference, PHPDay, ZendCon, etc Laurea in Economia Informatica presso l'università G.D'Annunzio di Pescara Blog sulla programmazione web in PHP: http://www.zimuel.it/blog
Sommario Lo sviluppo di applicazioni web in ambienti di cloud computing Il progetto Simple Cloud API Obiettivo e finalità del progetto I servizi attualmente disponibili
Cloud computing
Cloud computing E' l'insieme di tecnologie informatiche che permettono l'utilizzo di risorse hardware (storage, CPU) o software distribuite in remoto. Fonte: Wikipedia
Sviluppo di applicazioni in ambienti cloud Alcuni vantaggi, dal punto di vista dello sviluppatore: Architettura distribuita Facile accesso a risorse potenti Semplicità d'utilizzo: delega di gestione del servizio Alcuni punti critici: Vendor lock-in Portabilità Interoperabilità
Vendor lock-in L'utilizzo di tecnologie proprietarie può portare a problemi di lock-in Lo sviluppo di un applicazione software che dipende da un vendor può portare ad una serie di problemi, ad esempio: Cambio dei costi dei servizi Cambio di policy dei servizi Se si decide di cambiare vendor è necessario tener presente il costo di tale operazione (switching cost) In ambito software, switching cost = riscrittura del codice
Portabilità Portabilità = la capacità di eseguire la stessa applicazione su piattaforme cloud differenti Non è semplice cambiare piattaforma di cloud computing, molto spesso è necessaria una modifica sostanziale del proprio software (riscrittura del codice) Per fornire portabilità ad un software è necessario effettuare un'astrazione delle operazioni di base
Interoperabilità Interoperabilità = la capacità di scrivere software che sia in grado di utilizzare sistemi cloud differenti Il vs. software è in grado di utilizzare indifferentemente un servizio di storage su Amazon S3 o Nirvanix? Anche qui, il cambio di vendor porta a dei costi derivanti dalla riscrittura del codice
Esempi di ambienti cloud
API = Application Programmming Interface
Livelli di API Come invocare un servizio: Livello 1: utilizzare direttamente le API del servizio con un protocollo specifico (ad esempio REST o SOAP) Livello 2: utilizzare una funzione specifica del linguaggio per l'accesso al protocollo Livello 3: utilizzare una funzione specifica del servizio per l'accesso Livello 4: utilizzare un API comune in grado di supportare servizi/vendor differenti
Livello 1 - REST e JSON Esempio di richiesta: listfolder.php?sessiontoken=8da051b0a60f4c22a& folderpath=/cs1&pagenumber=1&pagesize=5 Esempio di risposta: { "ResponseCode": 0, "ListFolder": { "TotalFolderCount": 3, "TotalFileCount": 3215, "PageFolderCount": 3, "PageFileCount": 2,...}}
Livello 1 - SOAP Esempio di richiesta: <ListFolderRequest> <SessionToken> 8da051b0a60f4c22a </SessionToken> <FolderPath>/cs1</FolderPath> <PageNumber>1</PageNumber> <PageSize>5</PageSize> </ListFolderRequest>
Livello 1 SOAP (2) Esempio di risposta: <Response> <ResponseCode>0</ResponseCode> <ListFolder> <TotalFolderCount>3</TotalFolderCount> <TotalFileCount>3215</TotalFileCount> <PageFolderCount>3</PageFolderCount> <PageFileCount>2</PageFileCount> <Folder> <FolderCount>0</FolderCount> <FileCount>1</FileCount> <Name>F8AChild</Name>...
Livello 2 specifico del linguaggio Una richiesta PHP di tipo REST: file_get_contents('listfolder.php? SessionToken=8da051b0a60f4c22a...'); Una richiesta PHP di tipo SOAP: $param = array( 'SessionToken' => '8da051b0a60f4c22a', 'FolderPath' => '/cs1', 'PageNumber' => 1,...); $soapclient->call('listfolder', $param, $name);
Livello 3 specifico del servizio Esempio in PHP su Amazon S3 (leggere un oggetto da un bucket): $s3-> getobjectsbybucket('cs1'); Esempio in PHP su Nirvanix IMFS: $imfs->listfolder(array( 'folderpath' => '/cs1', 'pagenumber' => 1, 'pagesize' => 5));
Livello 4 API comune Esempio di richiesta PHP comune per restituire la lista di un folder: $storage->listitems('cs1'); Indipendentemente dal servizio/vendor utilizzato (S3, Nirvanix, GoGrid, etc)
Simple Cloud API
Che cos'è il Simple Cloud API? E' un'interfaccia comune, in PHP, per l'accesso ai servizi di cloud computing E' un progetto open source ideato da Zend Technologies con la collaborazione di IBM, Microsoft, Rackspace, Nirvanix e GoGrid Il progetto è iniziato nel Settembre 2009 http://simplecloud.org
Simple Cloud API Servizi: File storage (Amazon S3, Nirvanix, Azure Blog Storage, Rackspace Cloud Files) Document storage (Amazon SimpleDB, Azure Table Storage) Simple queues (Amazon SQS, Azure Table Storage) Utilizza il design pattern Factory e Adapter Un file di configurazione comunica all'oggetto Factory quale Adapter utilizzare
Dependency injection Il Simple Cloud API utilizza la tecnica di dependency injection Un esempio di file di configurazione: storage_adapter = "Zend_Cloud_StorageService_Adapter_Nirvanix" auth_accesskey = "338ab839-ac72870a" auth_username = "enrico" auth_password = "/p@$$w0rd" remote directory = "/test"
Dependency injection (2) Un secondo esempio di file di configurazione: storage_adapter = "Zend_Cloud_StorageService_Adapter_S3" aws_accesskey = "ac72870a-338ab839" aws_secretkey = "/par$w3rd" bucket_name = "test"
API per Nirvanix Esempio con Zend Framework: $auth = array('username' => 'username', 'password' => 'password', 'appkey' => 'appkey'); $nirvanix = new Zend_Service_Nirvanix($auth); $imfs = $nirvanix->getservice('imfs'); $args = array('folderpath' => '/test', 'pagenumber' => 1, 'pagesize' => 5); $stuff = $imfs->listfolder($args); Tutte queste istruzioni sono specifiche del vendor
API per Amazon S3 Esempio con Zend Framework: $s3 = new Zend_Service_Amazon_S3 ($accesskey, $secretkey); $stuff = $s3->getobjectsbybucket($bucketname); Tutte queste istruzioni sono specifiche del vendor
Simple Cloud Storage API Elenco di una directory Nirvanix o S3: $credentials = new Zend Config Ini($configFile); $stuff = Zend_Cloud_StorageService_Factory ::getadapter($credentials)->listitems(); Questo codice funziona indifferentemente su Nirvanix, S3, RackSpace, etc La scelta del vendor avviene tramite l'utilizzo del file di configurazione ($configfile)
Metodi Lo storage API supporta differenti metodi: storeitem(), fetchitem() e deleteitem() copyitem(), moveitem() e renameitem() listfolders() e listitems() storemetadata(), fecthmetadata() e deletemetadata()
Simple Cloud Queue API Il Simple Cloud Queue API utilizza i servizi di Azure o Amazon per la gestione di una coda di messaggi Metodi supportati: createqueue(), deletequeue() e listqueueu() sendmessage(), receivemessage() e deletemessage() fetchqueuemetadata() e storequeuemetadata()
Simple Cloud Document API Il Simple Cloud Document API utilizza i servizi di Amazon SimpleDB e Azure Table Services Metodi supportati: createcollection(), deletecollection() e listcollection() insertdocument(), replacedocument(), updatedocument(), deletedocument() e fetchdocument() query() e select()
Scrivere uno specifico adapter E' possibile implementare il proprio specifico adapter scrivendo tutti le interfacce ai propri metodi: Storage Service, Queue, etc Se il cloud vendor ha già un API (Livello 3) il grosso del lavoro è già stato fatto, basta tradurre le specifiche chiamate, ad esempio: public function listfolders($path = null, $options = null) { return $this->_connection->list_containers(); }
Domande?
Grazie! Per maggiori informazioni: http://www.zend.com http://simplecloud.org