Università degli Studi di Padova - SIAGAS

Pagina creata da Nicolo Lanza
 
CONTINUA A LEGGERE
Università degli Studi di Padova - SIAGAS
Università degli Studi di Padova
 Dipartimento di Matematica "Tullio Levi-Civita"
               Corso di Laurea in Informatica

           Sviluppo di un’applicazione web a
           microservizi con Java SpringBoot
                      Tesi di laurea triennale

Relatore                                             Laureando
Dott.Armir Bujari                                Giovanni Righi

                    Anno Accademico 2017-2018
Università degli Studi di Padova - SIAGAS
Giovanni Righi: Sviluppo di un’applicazione web a microservizi con Java SpringBoot,
Tesi di laurea triennale, c Dicembre 2018.
“In un universo infinito dove la realtà viene filtrata attraverso le nostre mutevoli
percezioni, dare una qualsiasi definizione su qualsivoglia cosa non è che speculazione
                                                                basata su dati empirici”
                                                                     — Timmy Turner

Ringraziamenti

Innanzitutto,vorrei ringraziare il Dott. Armir Bujari, relatore della mia tesi, per la
disponibilità e l’aiuto fornitomi durante la stesura del lavoro e nel periodo di stage .

Desidero ringraziare con affetto i miei genitori i miei fratelli e mia nonna che mi
hanno sempre supportato in questi anni.

Ringrazio anche i miei amici per tutte le aventure vissute in questi anni delle quali
avrò per sempre dei bellisimi ricordi.

Padova, Dicembre 2018                                                   Giovanni Righi

                                           iii
Indice

1 Introduzione                                                                                                                       1
  1.1 Il progetto di stage . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    1
  1.2 L’azienda . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    1
       1.2.1 Profilo aziendale . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    1
       1.2.2 Servizi offerti . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    2
  1.3 Processi e metodologie . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    2
       1.3.1 Strumenti di supporto . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    3
       1.3.2 Sistema di versionamento           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
       1.3.3 Ambiente di lavoro . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.4 Vantaggi aziendali . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.5 Struttura del documento . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5

2 Descrizione dello stage                                                                                                           7
  2.1 Introduzione al progetto . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   7
      2.1.1 Analisi preventiva dei rischi           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   7
      2.1.2 Prodotti attesi . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8
      2.1.3 Obbiettivi . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8
  2.2 Vincoli . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9
      2.2.1 Vincoli tecnologici . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9
      2.2.2 Vincoli metodologici . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9
      2.2.3 Vincoli temporali . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9

3 Tecnologie Utilizzate                                                                                                             11
  3.1 Java . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  3.2 IntelliJ . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  3.3 Git . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  3.4 GitHub . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  3.5 Framework Spring . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
      3.5.1 Spring Boot . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
      3.5.2 Spring Data (Hibernate) .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
      3.5.3 Spring Cloud . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
      3.5.4 Spring Security (OAuth2)            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  3.6 MySQL . . . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  3.7 Postman . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15

4 Analisi dei requisiti                                                                                                             17
  4.1 Casi d’uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                17
      4.1.1 Attori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  17

                                            v
vi                                                                                                                                 INDICE

           4.1.2 Elenco casi d’uso . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
     4.2   Requisiti individuati . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
           4.2.1 Requisiti funzionali .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
           4.2.2 Requisiti qualitativi     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
           4.2.3 Requisiti di vincolo .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22

5 Progettazione e codifica                                                                                                                 23
  5.1 Architettura . . . . . . . . . . . . . .                 . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      5.1.1 Architettura monolitica . . .                      . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      5.1.2 Service Oriented Architecture                      SOA         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
      5.1.3 Microservizi . . . . . . . . . .                   . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
      5.1.4 Architettura del prodotto . .                      . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
  5.2 Descrizione dei processi . . . . . . .                   . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
      5.2.1 Inserimento e modifica . . . .                     . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
      5.2.2 Lettura . . . . . . . . . . . .                    . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
      5.2.3 Cancellazione . . . . . . . . .                    . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
  5.3 Database . . . . . . . . . . . . . . .                   . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      5.3.1 Progettazione database . . .                       . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  5.4 Cross-origin resource sharing . . . .                    . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31

6 Verifica e validazione                                                                                                                   33
  6.1 Analisi statica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                      33
  6.2 Analisi dinamica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                         33

7 Conclusioni                                                                                                                              35
  7.1 Ripartizione oraria . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
  7.2 Raggiungimento degli obbiettivi              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
  7.3 Sviluppo futuro dell’applicativo             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
  7.4 Considerazioni personali . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36

Glossario                                                                                                                                  37

Bibliografia                                                                                                                               41
Elenco delle figure

 1.1   Logo Synclab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      2

 2.1   Diagramma di gantt . . . . . . . . . . . . . . . . . . . . . . . . . . . .       10

 3.1   Logo di Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     11

 3.2   Logo di Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    12

 3.3   Logo di Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     12

 3.4   Logo di hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    13

 3.5   Logo di OAuth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      14

 3.6   Logo di Postman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      15

 4.1   use case principali . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    18

 4.2   use case modifiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     19

 4.3   use case non implementati . . . . . . . . . . . . . . . . . . . . . . . . .      20

 5.1   Architettura monolitica . . . . . . . . . . . . . . . . . . . . . . . . . .      23

 5.2   Architettura a microservizi . . . . . . . . . . . . . . . . . . . . . . . .      25

 5.3   Architettura dell’applicazione . . . . . . . . . . . . . . . . . . . . . . .     25

 5.4   Funzionamento Oauth2 . . . . . . . . . . . . . . . . . . . . . . . . . .         26

 5.5   Pannello di controllo Server Eureka      . . . . . . . . . . . . . . . . . . .   27

 5.6   Operazione di inserimento e modifica . . . . . . . . . . . . . . . . . . .       28

 5.7   Operazione di lettura . . . . . . . . . . . . . . . . . . . . . . . . . . . .    29

 5.8   Operazione di cancellazione . . . . . . . . . . . . . . . . . . . . . . . .      29

 5.9   Schema del database . . . . . . . . . . . . . . . . . . . . . . . . . . . .      30

 5.10 Flowchart che mostra come un browser gestisce le chiamate CORS . .                31

                                          vii
viii                                                          ELENCO DELLE TABELLE

Elenco delle tabelle

       2.1   Tabella del tracciamento degli obbiettivi . . . . . . . . . . . . . . . . .    9

       4.1   Tabella del tracciamento dei requisti funzionali . . . . . . . . . . . . .    21
       4.2   Tabella del tracciamento dei requisti qualitativi . . . . . . . . . . . . .   21
       4.3   Tabella del tracciamento dei requisti di vincolo . . . . . . . . . . . . .    22

       7.1   Tabella del raggiungimento degli obbiettivi . . . . . . . . . . . . . . .     35
Capitolo 1

Introduzione

In questo capitolo viene introdotto il contesto dell’azienda nella quale è stato fatto lo
stage. Inoltre sarà presentata la struttura del documento, compresa la suddivisione dei
capitoli e le norme tipografiche che sono state adottate.

1.1     Il progetto di stage
Negli ultimi anni con l’avvento del cloud computing[g] e delle web application ci si è
trovati a dover gestire il cambiamento rapido della richiesta di prodotti software e al
dover scalare i sistemi rapidamente,questo ha portato la maggior parte delle aziende
ad adottare un approccio allo sviluppo e alla gestione delle applicazioni passando da
un architettura monolitica ad una a microservizi.
Lo scopo del progetto di stage di Sync Lab è quello di far si che lo studente prenda
conoscenza di queste nuove tecnologie realizzando un’applicazione a microservizi che
consenta di gestire gli ordini di una pizzeria.

1.2     L’azienda
1.2.1     Profilo aziendale
Sync Lab S.r.l. è una società di consulenza informatica fondata nel 2002 con sedi a
Napoli, Roma, Milano e Padova.
Fin dai primi anni Sync Lab è rapidamente cresciuta nel mercato ICT, consolidando i
rapporti con clienti e partner ha raggiunto un organico aziendale di oltre 200 risorse,
una solida base finanziaria e una diffusione sul territorio attraverso le sue quattro sedi.
L’organico aziendale è andato crescendo in modo continuo e rapido, in relazione
all’apertura delle varie sedi ed alla progressiva crescita delle stesse.
La grande attenzione alla gestione delle risorse umane ha fatto di Sync Lab un
riferimento in positivo per quanti volessero avviare o far evolvere in chiave professionale
la propria carriera.
Il basso turn-over testimonia la voglia dei collaboratori di condividere il progetto
comune, assumendo all’interno di esso ruoli e responsabilità che solo un processo
evolutivo così intenso può offrire.

                                            1
2                                                    CAPITOLO 1. INTRODUZIONE

I ricavi hanno avuto un incremento proporzionale alla crescita dell’azienda beneficiando
dell’approccio adattivo e diversificato al mercato.

                                Figura 1.1: Logo Synclab

1.2.2     Servizi offerti
Sync Lab Srl è un’azienda leader nella consulenza tecnologica, impegnata in un processo
continuo di identificazione e messa in opera di soluzioni per i clienti finalizzate alla
creazione di valore. Supporta le esigenze di innovazione di tutte le organizzazioni ed in
ogni settore di mercato nell’ambito dell’ Information Technology, con servizi in ambito:

    ∗ Business Consultancy

    ∗ Project Financing

    ∗ IT Consultancy

L’azienda ha come punti di forza la qualità dei servizi offerti (certificazioni ISO
9001, ISO 14001, ISO 27001, OHSAS 18001) ed un’accurata gestione delle risorse
umane. L’approfondita conoscenza di processi e tecnologie, maturata in esperienze
altamente significative e qualificanti, fornisce l’expertise e Know How necessari per
gestire progetti di elevata complessità, dominando l’intero ciclo di vita: Studio di
fattibilità, Progettazione, Implementazione, Governance e Post Delivery.
L’offerta di consulenza specialistica trova le punte di eccellenza nella progettazione
di architetture Software avanzate, siano esse per applicativi di dominio, per sistemi
di supporto al business (BSS), per sistemi di integrazione (EAI/SOA), per sistemi di
monitoraggio applicativo/territoriale.
Il nostro laboratorio RD è sempre al passo con i nuovi paradigmi tecnologici e di
comunicazione, ad esempio Big Data, Cloud Computing,Internet of Things, Mobile
e Sicurezza IT, per supportare i propri clienti nella creazione ed integrazione di
applicazioni, processi e dispositivi.
Le attività in ambito Educational ed RD ci hanno permesso di acquisire una profonda
conoscenza degli strumenti di finanza agevolata fruendone direttamente ed interagendo
con enti di supporto ai progetti innovativi dei propri clienti. L’azienda, grazie alla rete
di relazioni a livello nazionale ed internazionale, ha ottenuto importanti finanziamenti
in progetti RD europei (FP7 e H2020) della Comunità Europea.

1.3     Processi e metodologie
Il ciclo di vita adottato da Synclab S.r.l. segue un modello di tipo Agile.
I principi su cui si basa la metodologia agile sono i seguenti:
1.3. PROCESSI E METODOLOGIE                                                           3

   ∗ Le persone e le iterazioni sono più importanti dei processi e degli strumenti;

   ∗ Avere software funzionante è più importante dell’avere documentazione;

   ∗ Collaborazione con i cliente;

   ∗ Essere pronti a rispondere al cambiamento delle esigenze del cliente.

   Nello specifico il team di sviluppo cerca di seguire un approccio di tipo Scrum, il
quale è basato sui seguenti concetti:

   ∗ Sprint: rappresenta un’unità base dello sviluppo Scrum ed ha una durata fissa.
     Durante uno sprint non è possibile modificare gli obiettivi precedentemente
     pianificati;

   ∗ Riunioni: il team svolge riunioni nei seguenti casi:

        – Prima di uno Sprint, in modo da pianificare gli obiettivi e i tempi stimati
          per il successivo Sprint;
        – Dopo uno Sprint, per verificare il lavoro svolto e discutere di eventuali
          migliorie da apportare al modello di lavoro;
        – Quotidianamente(Daily Scrum), durante lo sprint, viene tenuta una riunione
          tra i membri del team di progetto;
        – Riunioni con i clienti, in modo da comprendere più a fondo i requisiti del
          software.

   ∗ Product Backlog: rappresenta una lista ordinata dei requisiti relativi ad un
     prodotto software, ognuno dei quali avente una priorità. Rappresenta ciò che
     deve essere fatto, organizzato in base all’ordine relativo in cui dovrà essere
     realizzato;

   ∗ Sprint Backlog: lista del lavoro che il team di sviluppo deve effettuare nel corso
     dello sprint successivo, viene generata selezionando una quantità di storie/funzio-
     nalità a partire dalla cima del product backlog determinata da quanto il Team di
     sviluppo ritiene possa realizzare durante lo sprint;

   ∗ Incremento: è la somma di tutti gli elementi del Product Backlog completati
     durante gli sprint precedenti;

1.3.1    Strumenti di supporto
Come strumenti di supporto per la gestione di progetto l’azienda utilizza i seguenti
strumenti:

   ∗ Slack: una piattaforma di messaggistica per team che integra insieme diversi canali
     di comunicazione in un unico servizio con l’obiettivo di migliorare l’esperienza
     lavorativa aumentando l’interazione tra differenti servizi, per esempio integra
     Google Drive, GitHub e altre applicazioni, in questo modo si ha un unico
     contenitore/archivio di informazioni accessibili da un team tramite la possibilità
     di organizzare la comunicazione attraverso canali specifici.
     I canali potranno essere accessibili a tutto il team o solo ad alcuni membri ed è
     possibile comunicare anche attraverso chat individuali private o chat con due o
     più membri;
4                                                    CAPITOLO 1. INTRODUZIONE

    ∗ Asana: un’applicazione web progettata per migliorare la collaborazione e la
      gestione del lavoro di squadra. Si possono creare progetti ed assegnare attività
      ai compagni di squadra attraverso task, eventualmente gerarchizzati. Ogni task
      può avere una data di scadenza ed è possibile assegnare uno o più follower,
      cioè persone che seguono l’andamento del task con la possibilità di intervenire
      commentando il flusso della gestione. Include anche strumenti di reporting, file
      allegati, calendari e altro.

1.3.2     Sistema di versionamento
Come sistema di versionamento Synclab S.r.l. utilizza git. Git è un software per il
versionamento che serve a tener traccia dei cambiamenti che vengono effettuati su uno
o più file nel tempo, in questo modo è possibile in caso di bisogno risalire a versioni
precedenti in un qualsiasi momento e permette di coordinare il lavoro di più persone
che lavorano sugli stessi file.

1.3.3     Ambiente di lavoro
IDE
L’ambiente di sviluppo varia a seconda delle tecnologie impiegate nel progetto in
questione. Vengono utilizzati i seguenti IDE[g] :
    ∗ Eclipse: per lo sviluppo di applicativi in Java;
    ∗ Sts(Spring Tool Suite): per lo sviluppo di applicazioni utilizzando il framework[g]
      Spring;
    ∗ DBeaver: per lo sviluppo di database Oracle.

Sistemi operativi
Per quanto riguarda i sistemi operativi da utilizzare i dipendenti utilizzano sistemi
Windows e/o Linux a seconda delle proprie preferenze e delle esigenze del progetto.

1.4      Vantaggi aziendali
Per le strategie di Sync Lab i percorsi di tirocinio in accompagnamento alla tesi/tesina
sono fondamentali in quanto permettono all’azienda di venire in contatto con i ragazzi
e lavorarci assieme.
Questo consente da un lato al laureando di capire se è l’azienda in cui vorrebbe costruire
una futura carriera lavorativa ed dall’altro lato ovviamente permettere all’azienda di
valutare le potenzialità dei ragazzi per procedere poi eventualmente con l’assunzione.
Gli argomenti delle tesine poi vengono scelti assieme ai ragazzi in base alle inclinazioni
di ognuno. Si fa attenzione inoltre ad indirizzare i percorsi in modo da renderli utili
per la rivedibilità sul mercato, cioè i ragazzi poi potranno essere subito pronti per le
attività lavorative che il mondo enterprise dell’informatica richiede. I ragazzi che invece
dimostrano l’interesse per continuare con la specialistica l’azienda cerca di indirizzare
invece i percorsi su tematiche più teoriche, quindi tematiche magari non richieste dal
mercato però molto interessanti per la formazione del tesista.
In Sync Lab inoltre viene messa a disposizione un’aula per mettere assieme i ragazzi
e favorire il più possibile l’interazione tra loro, coadiuvata dal tutor aziendale. Il
1.5. STRUTTURA DEL DOCUMENTO                                                                5

team-working in azienda è visto come elemento fondamentale per favorire lo scambio
di esperienze e punti di vista, per arrivare alla risoluzione dei problemi in modo coope-
rativo.

1.5     Struttura del documento
Riguardo la stesura del testo, relativamente al documento sono state adottate le
seguenti convenzioni tipografiche:
   • le abbreviazioni e i termini ambigui o di uso non comune menzionati vengono
     definiti nel glossario, situato alla fine del presente documento;
   • le parole in blu seguite da il simbolo [g] sono definite nel glossario, viene evidenziata
     soltanto la prima occorrenza di ogni parola;
   • i termini in lingua straniera o facenti parti del gergo tecnico sono evidenziati con
     il carattere corsivo.
   Il documento è suddiviso nei seguenti capitoli

      Capitolo 2: Descrive il progetto svolto durante lo stage;
      Capitolo 3: Descrive le tecnologie utilizzate nel progetto;
      Capitolo 4: Approfondisce i requisiti del progetto;
      Capitolo 5: Approfondisce le parti di progettazione e codifica, in particolare
      l’architettura dell’applicazione e del database;
      Capitolo 6: Approfondisce le parti di verifica e validazione del progetto;
      Capitolo 7: Contiene le considerazioni dello studente relative allo stage.
Capitolo 2

Descrizione dello stage

Questo capitolo descrive il progetto, i requisiti e gli obbiettivi che sono stati fissati,e la
pianificazione.

2.1      Introduzione al progetto
Lo scopo di questo progetto di stage consiste nell’acquisizione delle competenze relative
al framework Spring e dei vari tool disponibili come Spring Cloud,Spring Data e
Spring Security, ed in particolare nel realizzare un applicazione con architettura a
microservizi. Nello specifico il progetto prevede la realizzazione della parte di Back-
end[g] di un’applicazione web per la gestione degli ordini di una pizzeria .
Le caratteristiche principali della soluzione proposta sono:

   • Gestione del login all’applicazione;

   • gestione dei prodotti in vendita (pizze,bibite,fritti etc..) e suddivisione in categorie
     di questi;

   • gestione dei clienti dei quali si vuole sapere almeno il nome o il cognome e nel
     caso di clienti che richiedono la consegna a domicilio si vuole conoscere anche
     l’indirizzo e il numero di telefono;

   • gestione degli ordini ;

   • stampa delle comande e degli scontrini fiscali;

   • gestione dei resoconti giornalieri degli ordini effettuati.

2.1.1     Analisi preventiva dei rischi
Durante la fase di analisi sono stati individuati alcuni rischi che si potevano incontrare
durante il progetto.Sono state quindi individuate delle possibili soluzioni a tali rischi.

   1. Inesperienza sulle tecnologie da utilizzare
      Descrizione: Le tecnologie da utilizzare nel progetto sono poco note allo stagista.
      Soluzione: Lo stagista si documenterà autonomamente sulle tecnologie e nel
      caso sorgano dei dubbi richiederà informazioni ai colleghi.

                                              7
8                                        CAPITOLO 2. DESCRIZIONE DELLO STAGE

    2. Sottostima dei tempi di realizzazione
       Descrizione: Data l’inesperienza da parte dello stagista per quanto riguarda
       la pianificazione di un progetto potrebbe verificarsi una sottostima dei tempi di
       realizzazione dello stesso.
       Soluzione: Lo stagista aggiornerà giornalmente con il proprio tutor aziendale e
       settimanalmente con il tutor interno per prevenire eventuali ritardi e effettuando
       ove necessario le opportune correzioni di pianificazione.

    3. Inesperienza degli strumenti da utilizzare
       Descrizione: L’approccio al metodo di lavoro risulta nuovo. Sono richieste
       capacità di pianificazione e di analisi che lo stagista non possiede a causa dell’i-
       nesperienza. Alcune conoscenze richieste richiedono tempo per essere apprese.
       Soluzione: Lo stagista si documenterà in maniera autonoma sugli strumenti da
       utilizzare e richiederà informazioni ai colleghi nel caso siano sorti dei dubbi.

    4. Problemi personali
       Descrizione: Lo stagista potrebbe avere degli impegni personali o dei problemi
       di salute che non gli permetterebbero di essere presente in azienda e continuare
       il progetto.
       Soluzione: Nel caso in cui lo stagista non sia disponibile per un periodo di tempo
       dovrà comunicarlo tempestivamente al tutor aziendale,il quale riorganizzerà il
       lavoro da svolgere.

    5. Problemi aziendali
       Descrizione: E’ possibile che per motivi aziendali gli uffici dell’azienda non
       siano aperti per qualche giorno.
       Soluzione: L’azienda metterà a disposizione degli strumenti per far si che lo
       stagista possa lavorare al progetto anche da casa.

2.1.2      Prodotti attesi
L’attività di stage prevedeva la produzione di un insieme di oggetti, frutto di tale
attività. Di seguito, ne è riportato l’elenco:

    • Documentazione dell’applicazione

    • Codice sorgente dell’applicazione

    • Allegato tecnico

2.1.3      Obbiettivi
All’inizio dell’attività di stage sono stati concordati con il tutor interno dell’azienda gli
obbiettivi del progetto. Si farà riferimento agli obbiettivi secondo la seguente notazione
X.Y dove X è una lettera tra:

       O per i requisiti obbligatori;

       D per i requisiti desiderabili;

       F per i requisiti facoltativi.
2.2. VINCOLI                                                                                9

e Y è il numero identificativo del requisito.

        ID      Descrizione
                                       Obbligatori
        O.01    Acquisire le competenze sui framework
        O.02    Definizione e documentazione interfacce (tra microservizi)
        O.03    Implementazione di un back-end basato su microservizi usando
                il framework Spring
        O.04    Test e verifica dell’implementazione
        O.05    Realizzazione dell’analisi tecnica
                                       Desiderabili
        D.01    Studio e utilizzo del framework Spring Security
        D.02    Studio e utilizzo del framework Spring Cloud
                                       Facoltativi
        F.01    Integrazione con Google Maps[g]
        F.02    Stampa comande e scontri fiscali
                  Tabella 2.1: Tabella del tracciamento degli obbiettivi

2.2      Vincoli
2.2.1     Vincoli tecnologici
Per lo sviluppo del prodotto l’azienda ha richiesto l’utilizzo del linguaggio Java in
particolare del framework Spring e MySql come DBMS[g] .
Per quanto riguarda gli strumenti di sviluppo come l’IDE o il sistema di versionamento
non sono stati imposti vincoli.

2.2.2     Vincoli metodologici
Per lo svolgimento dello stage è stato concordato con l’azienda che dovesse essere
effettuato presso la sede dell’azienda.
Essendo che il progetto prevedeva che lo studente realizzasse il lato back-end di un
applicativo mentre un altro studente realizzava la parte front-end per poter decidere la
configurazione dell’applicazione e successivamente per testarla i due studenti dovevano
essere entrambi presenti in azienda.
Inoltre vista la presenza in azienda di altri stagisti che lavoravano a progetti diversi
ma che utilizzavano le stesse tecnologie è stato possibile collaborare scambiandosi
informazioni per arrivare ad una soluzione ai problemi comuni.
Il fatto che lo studente fosse in azienda durante lo stage ha favorito il dialogo tra studente
e tutor aziendale e anche con gli altri dipendenti dell’azienda.Lo studente ha potuto co-
sì confrontarsi con programmatori più esperti e chiedere informazioni in caso di bisogno.

2.2.3     Vincoli temporali
Le stage prevede lo svolgimento di 300 ore di lavoro complessive. Queste ore sono
state suddivise nell’arco di 8 settimane lavorative di cui 7 da 40 ore e una da 20 ore.
L’orario di lavoro è stato dal Lunedì al Venerdì dalle 9:00 alle 18:00 con un ora di
10                                    CAPITOLO 2. DESCRIZIONE DELLO STAGE

pausa pranzo. Prima dell’inizio dello stage è stato redatto il piano di lavoro il quale
includeva la seguente pianificazione settimanale:

     • Prima Settimana - (40 ore):
       Studio Architettura a Microservizi e REST[g] ful;
     • Seconda Settimana - (40 ore):
       Studio Framework Spring e SpringRest;

     • Terza Settimana - (40 ore):
       Studio Hibernate/Spring Data;
     • Quarta Settimana - (40 ore):
       Studio di integrazione dei temi studiati nelle settimane precedenti;

     • Quinta Settimana - (40 ore):
       Studio e Implementazione Base Dati del progetto;
     • Sesta Settimana - (40 ore):
       Studio e Implementazione dei singoli microservizi del progetto;
     • Settima Settimana - (40 ore):
       Studio e Implementazione dei singoli microservizi del progetto ’Pizza’;
     • Ottava Settimana - (20 ore):
       Test e Collaudo Finale .

                            Figura 2.1: Diagramma di gantt
Capitolo 3

Tecnologie Utilizzate

In questo capitolo verranno descritte le tecnologie utilizzate nel progetto.

3.1     Java
Java è un linguaggio di programmazione ad alto livello orientato agli oggetti. L’intento
è quello che gli sviluppatori "Scrivano una volta, eseguano ovunque" ossia che il codice
Java compilato sia eseguibili in tutte le piattaforme che supportano Java senza essere
ricompilato. Di seguito sono elencati i cinque obbiettivi che i creatori di Java si sono
posti:

   • Deve essere semplice,orientato agli oggetti e familiare;

   • Deve essere robusto e sicuro;

   • Deve essere portabile e non deve dipendere dall’architettura;

   • Deve avere alte performance di esecuzione;

   • Deve essere interpretato,dinamico.

                               Figura 3.1: Logo di Java

3.2     IntelliJ
IntelliJ IDEA è un ambiente di sviluppo integrato per il linguaggio di programmazione
Java. IntelliJ supporta numerose tecnologie e framework tra i quali Spring.

                                          11
12                                      CAPITOLO 3. TECNOLOGIE UTILIZZATE

3.3      Git

                                 Figura 3.2: Logo di Git

Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di
comando, creato da Linus Torvalds nel 2005.
Permette di gestire il codice di un progetto informatico in maniera efficace.

3.4      GitHub
Servizio di hosting per progetti software che implementa il software di controllo di
versione distribuito Git.
Gli sviluppatori possono caricare il loro codice sorgente sulla piattaforma cosicché’
gli altri utenti possono interagirvi tramite un sistema di issue tracking, pull request
e commenti che permette di migliorare il codice del repository risolvendo bug o
aggiungendo funzionalità.

3.5      Framework Spring
3.5.1      Spring Boot

                               Figura 3.3: Logo di Spring

    Spring è un framework open source[g] per lo sviluppo di applicazioni su piattaforma
Java. Spring Boot in particolare è una soluzione per creare applicazioni stand-alone
all’interno delle quali possono essere inserite le librerie di Spring e di terze parti
permettendo cosi ai programmatori di concentrarsi meno sulla parte di configurazione
e di più nella parte di sviluppo. Le sue principali caratteristiche sono:

     • Creazione di applicazioni stand-alone

     • Incorpora direttamente i server Tomcat, Jetty o Undertow.

     • Creazione automatica dei file di configurazione di Maven[g] o Gradle[g] ,

     • Configurazione automatica delle librerie di Spring e di terze parti.
3.5. FRAMEWORK SPRING                                                                 13

                             Figura 3.4: Logo di hibernate

3.5.2    Spring Data (Hibernate)
In Java le Java Persistence API[g] (JPA) sono un framework che si occupa della persi-
stenza nei dati all’interno di un database.
Per fare ciò Spring Data incorpora uno dei più famosi JPA, Hibernate, una piattaforma
middelware open source.

    Hibernate fornisce un servizio di Object-relational mapping(ORM) che consente
di mappare le classi Java in tabelle di un database relazionale; sulla base di questo
mapping Hibernate gestisce il salvataggio e il reperimento,producendo ed eseguendo
automaticamente le query SQL, di tali classi sul database. L’obbiettivo principale
di Hibernate è di far si che il programmatore non si prenda in carico la persistenza
dei dati,riducendo cosi il carico di lavoro è rendendo il codice più leggibile. L’unica
richiesta per la persistenza di una classe è la presenza del costruttore senza parametri.

3.5.3    Spring Cloud
Spring Cloud: Fornisce dei tool per implementare rapidamente i pattern utilizzati nei
sistemi distribuiti. I tool utilizzati nel progetto sono:

   • Netflix Eureka: Tool che permette la Service Discovery, ovvero un registro dei
     servizi disponibili in modo che i moduli possano registrarvisi e trovarsi a vicenda;

   • ZUUL API Gateway: È l’entrypoint del sistema, fa in modo che non venga
     percepita l’atomicità dei sistemi sottostanti, che possono essere liberamente
     sostituiti o replicati;

   • Config Server: È il sistema di Configuration Management che permette di
     centralizzare e ridistribuire le configurazioni dei vari moduli del sistema.

3.5.4    Spring Security (OAuth2)
Spring Security è un framework per l’autenticazione e la gestione dell’accesso per le
applicazioni basate su Spring,permettendo di ottenere le informazioni tramite LDAP,
database e altri servizi per la gestione del login.
In particolare Spring Security Oauth fornisce il supporto per utilizzare Spring Security
e OAuth2 utilizzando i modelli e le configurazioni standard di Spring.
Oauth è un protocollo open che permette l’autorizzazione di API di sicurezza con
un metodo standard e semplice. Il protocollo è compatibile con qualsiasi tipologia di
applicazione: desktop, web e mobile.
    L’idea di base è quella di autorizzare terze parti a gestire documenti privati senza
condividere la password. La condivisione della password infatti presenta molti limiti a
livello di sicurezza, come per esempio non garantisce supporto per singoli privilegi su
determinati file o operazioni, e soprattutto rende accessibile l’intero account e il pan-
nello di amministrazione. In particolare questo accesso incondizionato è indesiderato.
14                                       CAPITOLO 3. TECNOLOGIE UTILIZZATE

                                Figura 3.5: Logo di OAuth

Inoltre l’unico modo per revocare l’accesso è cambiare la password dell’intero account.
OAuth è nato quindi con il presupposto di garantire l’accesso delegato ad un client
specifico per determinate risorse sul server per un tempo limitato, con possibilità di
revoca.
OAuth2 è un evoluzione di OAuth, presenta una chiara divisone dei ruoli, implementan-
do un mediatore tra client e server.Un altro vantaggio rispetto alla precedente versione
è dato dalla possibilità di prolungare il tempo di utilizzo del token di accesso qualora
desiderato. OAuth 2.0 prevede i seguenti ruoli:

     • Resource Owner è il proprietario della risorsa da proteggere.

     • Resource Server è il server che espone la risorsa protetta. Riceve le richieste da
       un client che si identifica tramite un access-token e fornisce la risposta richiesta.

     • Client è l’applicazione fruitrice della risorsa che richiede il token di accesso.

     • Authorization Server: è il server che, a fronte di un grant da parte del Resource
       Owner,fornisce al client i token di accesso alla risorsa.

3.6       MySQL
MySQL è un Relational database management system (RDBMS[g] ) open source . E’
una delle soluzioni più adottate nell’ambito delle applicazioni web ed è una delle
componenti principali della piattaforma software di sviluppo WAMP,acronimo che
indica le componenti software con cui è realizzata:"Windows,Apache,MySQL,PHP". I
vantaggi offerti dall’utlizzo di MySQL sono i seguenti:

     • È veloce. L’obbiettivo principale degli sviluppatori di MySQL è stata la velocità;

     • È facile da utilizzare. È possibile creare e interagire con un database MySQL
       utilizzando alcune affermazioni semplici nel linguaggio SQL, che è lo standard
       linguaggio per la comunicazione con RDBMS;

     • È sicuro.Il sistema flessibile di MySQL consente ad alcuni o tutti privilegi di
       database a specifici utenti o gruppi di utenti. Le password sono criptate attraverso
       moderni algoritmi.
3.7. POSTMAN                                                                           15

3.7     Postman

                             Figura 3.6: Logo di Postman

Postman è un’applicazione del browser[g] Google Chrome che consente di costruire,
testare e documentare API più velocemente. Tramite Postman è possibile effettuare
delle chiamate API senza dover mettere mano al codice dell’applicazione, consentendo
di effettuare le chiamate tramite questo plugin che fornisce un’utile interfaccia grafica.
Le richieste possono essere effettuate sia verso un server locale che verso un server
online impostando tutti i dati di una tipica chiamata API, dagli headers al body.
Alcune delle caratteristiche di Postman sono:

   • Cronologia della chiamate effettuate;
   • Consente di creare velocemente le API;
   • Personalizzazione con gli script;
   • Robustezza dei framework dei test;

   • Creare delle collezioni di API.
Capitolo 4

Analisi dei requisiti

Questo capitolo descrive l’attività di analisi dei requisiti svolta durante il progetto.
Vengono descritti, di seguito, i casi d’uso principali e i requisiti individuati.

4.1     Casi d’uso
Lo scopo di questa fase è stato stilare la lista dei casi d’uso che una volta implementati
avrebbero soddisfatto i requisti del prodotto da realizzare. Per stilare i casi d’uso è
stato effettuato un brainstorming con il tutor aziendale e lo stagista che si è occupato
del front-end per individuare i requisiti del prodotto discutendo i possibili scenari di
utilizzo ed individuare le funzionalità da implementare.

4.1.1    Attori
Sono stati individuati due attori, L’utente non autenticato e l’utente autenticato.
Per utente si intende la persona che tramite il front-end manda delle richieste al
back-end che rappresenta il sistema che reagisce alle richieste.
L’utente non autenticato rappresenta l’utente che non ha ancora effettuato l’autentica-
zione e che quindi non può accedere alle funzionalità dell’applicativo.
L’utente autenticato è l’utente che ha effettuato l’autenticazione e può accedere alle
funzionalità dell’applicativo.

4.1.2    Elenco casi d’uso
Per facilitarne la consultazione e la gestione i casi d’uso verranno numerati con un
codice del tipo: UC[numero caso d’uso].
I casi d’uso principali individuati sono i seguenti:
   • UC1: Autenticazione effettuata tramite passaggio di username e password;
   • UC2: Possibilità di richiedere la lista delle categorie di items.
   • UC3: Possibilità di richiedere gli items di una categoria
   • UC4: Possibilità di cercare uno o più ordini effettuati.
        – UC4.1: Ricerca ordine per data;
        – UC4.2: Ricerca ordine per cliente.

                                           17
18                                           CAPITOLO 4. ANALISI DEI REQUISITI

     • UC5: Possibilità di cercare un cliente;

          – UC5.1: Ricerca cliente per nome;
          – UC5.2: Ricerca cliente per cognome;
          – UC5.3: Ricerca cliente per indirizzo.

                               Figura 4.1: use case principali

     I casi d’uso per la gestione dei dati sono i seguenti:

     • UC6: Possibilità di gestire le categorie di items presenti;

          – UC6.1: Inserimento di una nuova categoria;
          – UC6.2: Modifica di una categoria esistente;
          – UC6.3: Cancellazione di una categoria esistente.

     • UC7: Possibilità di gestire gli items presenti;

          – UC7.1: Inserimento di un nuovo item;
          – UC7.2: Modifica di un item esistente;
          – UC7.3: Cancellazione di un item esistente.
4.1. CASI D’USO                                                    19

  • UC8: Possibilità di gestire gli ordini presenti;
       – UC8.1: Inserimento di una nuovo ordine;
       – UC8.2: Modifica di un ordine esistente;
       – UC8.3: Cancellazione di un ordine esistente.
  • UC9: Possibilità di gestire i clienti presenti;
       – UC9.1: Inserimento di una nuovo cliente;
       – UC9.2: Modifica di un cliente esistente;
       – UC9.3: Cancellazione di un cliente esistente esistente.

                           Figura 4.2: use case modifiche

  I casi d’uso che non sono stati implementati sono i seguenti:
20                                          CAPITOLO 4. ANALISI DEI REQUISITI

     • UC10: Possibilità di stampare la comanda di un ordine ;
     • UC11: Possibilità di stampare lo scontrino fiscale di un ordine;
     • UC12: Possibilità di richiedere il resoconto giornaliero;
     • UC13: Possibilità di identificare il percorso migliore di consegna tramite Google
       Maps;

                           Figura 4.3: use case non implementati

4.2      Requisiti individuati
Attraverso l’analisi dei requisiti e tramite gli use case individuati è stata stilata la
tabella che traccia i requisiti in rapporto agli use case.
Sono stati individuati diversi tipi di requisiti e si è quindi fatto utilizzo di un codice
identificativo per distinguerli.
Il codice dei requisiti è così strutturato R(F/Q/V)(N/D/O) dove:
       R = requisito;
       F = funzionale;
       Q = qualitativo;
       V = di vincolo;
       O = obbligatorio;
       D = desiderabile;
       F = facoltativo.
Nelle seguenti tabelle sono riassunti i requisti
4.2. REQUISITI INDIVIDUATI                                                           21

4.2.1     Requisiti funzionali

   ID       Descrizione                                                                     Fonti
                                             Obbligatori
  RFO1      L’utente   puòrichiedere la lista delle categorie di Items                      UC2
  RFO2      L’utente   puòrichiedere gli items di una specifica categoria                   UC3
  RFO3      L’utente   puòricercare un ordine                                               UC4
 RFO4.1     L’utente   puòricercare un ordine in base alla data in cui è stato effettuato   UC4.1
 RFO4.2     L’utente   puòricercare un ordine in base al cliente che l’ha effettuato        UC4.2
  RFO5      L’utente   puòricercare un cliente                                              UC5
 RFO5.1     L’utente   puòricercare un cliente in base al nome                              UC5.1
 RFO5.2     L’utente   puòricercare un cliente in base al cognome                           UC5.2
 RFO5.3     L’utente   puòricercare un cliente in base all’indirizzo                        UC5.3
  RFO6      L’utente   puògestire le categorie di items                                     UC6
 RFO6.1     L’utente   puòinserire una nuova categoria                                      UC 6.1
 RFO6.2     L’utente   puòmodificare una categoria esistente                                UC6.2
 RFO6.3     L’utente   puòcancellare una categoria esistente                                UC6.3
  RFO7      L’utente   puògestire gli items                                                 UC7
 RFO7.1     L’utente   puòinserire una nuovo item                                           UC 7.1
 RFO7.2     L’utente   puòmodificare un item esistente                                      UC7.2
 RFO7.3     L’utente   puòcancellare un item esistente                                      UC7.3
  RFO8      L’utente   puògestire gli ordini                                                UC8
 RFO8.1     L’utente   puòinserire un nuovo ordine                                          UC 8.1
 RFO8.2     L’utente   puòmodificare un ordine esistente                                    UC8.2
 RFO8.3     L’utente   puòcancellare un ordine esistente                                    UC8.3
  RFO9      L’utente   puògestire i clienti                                                 UC9
 RFO9.1     L’utente   puòinserire un nuova cliente                                         UC 9.1
 RFO9.2     L’utente   puòmodificare un cliente esistente                                   UC9.2
 RFO9.3     L’utente   puòcancellare un cliente esistente                                   UC9.3
                                            Desiderabili
 RFD1       L’utente per accedere all’applicazione deve effettuare il login                 UC1
                                             Facoltativi
 RFF1       L’utente può richiedere la stampa della comanda dell’ordine                     UC   10
 RFF2       L’utente può richiedere la stampa dello scontrino fiscale dell’ordine           UC   11
 RFF3       L’utente può richiedere il resoconto giornaliero degli ordini                   UC   12
 RFF4       Il sistema consiglia il percorso migliore di consegna all’utente                UC   13
             Tabella 4.1: Tabella del tracciamento dei requisti funzionali

4.2.2     Requisiti qualitativi

         ID      Descrizione                                         Fonti
        RQO1     Viene fornito l’allegato tecnico dell’applicativo   Capitolato
        RQO1     Vengono effettuati test dell’applicativo            Capitolato
             Tabella 4.2: Tabella del tracciamento dei requisti qualitativi
22                                         CAPITOLO 4. ANALISI DEI REQUISITI

4.2.3     Requisiti di vincolo

     ID    Descrizione                                                       Fonti
                                       Obbligatori
 RVO1      L’applicativo deve   essere sviluppato in Java                    Capitolato
 RVO2      L’applicativo deve   utilizzare un architettura a microservizi    Capitolato
 RVO3      L’applicativo deve   utilizzare il framework Spring               Capitolato
                                       Desiderabili
 RVD1      L’applicativo deve   utilizzare il framework Spring Cloud         Capitolato
 RVD2      L’applicativo deve   utilizzare il framework Spring Security      Capitolato
                                       Facoltativi
 RVF1      L’applicativo deve   utilizzare integrare Google Maps             Capitolato
             Tabella 4.3: Tabella del tracciamento dei requisti di vincolo
Capitolo 5

Progettazione e codifica

Questo capitolo descrive l’attività di progettazione svolta durante il periodo di stage.
Viene illustrata l’architettura dell’applicazione, la struttura del database, l’implemen-
tazione di essa attraverso la descrizione dei microservizi implementati.

5.1     Architettura
L’evoluzione dell’informatica ha cambiato la prospettiva di business mondiale. Inizial-
mente l’informatica era pensata per svolgere funzioni di supporto alle organizzazioni
riducendo il lavoro manuale di alcune funzioni.
Al giorno d’oggi però l’informatica non è più utilizzata come funzione di supporto ma
è diventata il fulcro del business mondiale.
Per gestire il cambiamento rapido della richiesta di prodotti software e per scalare
i sistemi rapidamente,lo sviluppo ha bisogno di spostarsi da un sistema statico ad
uno dinamico. Essere in grado di sviluppare,evolvere e scalare grandi applicazione è
processo un critico per le organizzazioni.
Per questo i microservizi sono diventati il pattern dominante per sviluppare le moderne
applicazioni Cloud suddividendo i singoli componenti in servizi indipendenti incentrati
in specifiche funzionalità. Ma prima dei microservizi come venivano sviluppate le
applicazioni?

5.1.1    Architettura monolitica

                          Figura 5.1: Architettura monolitica

    L’architettura monolitica è stato il principale approccio per lo sviluppo di applica-
zioni distribuite come singole unità.
Questo tipo di architettura è adatta allo sviluppo di applicazioni piccole e poco soggette
ai cambiamenti ma non appena ci si trova a sviluppare applicazioni complesse e che
evolvono rapidamente i limiti dell’architettura vengono fuori.

                                           23
24                                  CAPITOLO 5. PROGETTAZIONE E CODIFICA

Il problema principale di questa architettura è che qualsiasi modifica apportata a un
qualunque modulo può portare ad avere effetti collaterali in altri moduli e quindi
richiede che l’intera applicazione venga testata in modo da verificare l’assenza di errori.
Inoltre unico modo per poter scalare questo tipo di applicazione è quello di replicarla
interamente con conseguente aumento delle risorse necessarie e di conseguenza dei
costi.

5.1.2      Service Oriented Architecture SOA
La Service Oriented Architecture è l’architettura software nata per fronteggiare le
problematiche dell’architettura monolitica. Essa prevede la scomposizione dell’applica-
zione in servizi indipendenti, quindi con basso accoppiamento, ognuno dei quali ha una
piccola e specifica funzionalità. In questo modo le applicazioni possono usare un certo
numero di servizi e connetterli in base alle loro esigenze.
E’ quindi possibile modificare,in maniera relativamente semplice, la modalità di ite-
razione tra i servizi,oppure la combinazione con la quale i servizi vengono utilizzati.
Inoltre risulta più semplice aggiungere o modificare i servizi per rispondere alle esigenze
dell’applicazione.
Nonostante questo modello abbia fornito un notevole miglioramento nella costruzione
di architetture più efficaci, nella pratica è stata generalmente inefficace a causa di
inutili astrazioni e protocolli legacy complessi.
Gli sviluppatori si sono trovati ad utilizzare SOA per collegare una vasta gamma di ap-
plicazioni che parlavano una lingua diversa, e che hanno richiesto l’implementazione di
un ulteriore livello, usato per la comunicazione che è l’ Enterprise Service Bus. Questo
porta a configurazioni costose che non possono tenere il passo come la tecnologia e il
business di oggi.

5.1.3      Microservizi
Il modello a microservizi è una variante del SOA che ne migliora le funzionalità
ereditandone l’idea di base per questo motivo viene definito come SOA a "grana fine".
Invece che suddividere le funzionalità dell’applicazione tramite l’utilizzo di servizi,
quindi avere un servizio per funzionalità , il modello a microservizi mira a creare
una singola applicazione composta da servizi indipendenti ognuno dei quali segue il
principio di singola responsabilità.
Di fatti la filosofia dei microservizi è la stessa di UNIX che dice "Se fai una cosa, falla
bene" ed è definita dalle seguenti proprietà:

     • I servizi sono piccoli, "a grana fine" per eseguire singole funzioni.

     • Consente l’automazione dei test e della distribuzione. In questo permette a
       diversi team di sviluppo di lavorare in modo indipendente.

     • Consente di comprendere fallimenti e difetti.

     • Ogni servizio è elastico,resiliente,componibile,minimale e completo.

Nell’architettura a micorservizi la comunicazione tra i servizi è basata su HTTP[g]
tramite le API Restful, passando i dati in formato JSON[g] , spesso attraverso una coda
di messaggi, quando è necessario garantire l’affidabilità.
I singoli microservizi sono generalmente trattati in modo asincrono, innescati da un
evento come una chiamata ad una API o un inserimento di un dato in coda. Questo
5.1. ARCHITETTURA                                                                   25

tipo di comunicazione basata su un protocollo “leggero” quale è l’HTTP è un ulteriore
differenza tra microservizi e SOA.

                        Figura 5.2: Architettura a microservizi

5.1.4    Architettura del prodotto
Il seguente diagramma mostra la struttura architetturale dell’applicativo realizzato:

                       Figura 5.3: Architettura dell’applicazione

   Sono stati identificati i seguenti microservizi:
26                                 CAPITOLO 5. PROGETTAZIONE E CODIFICA

Microservizi gestione dati
Questi servizi gestiscono i dati dell’intero applicativo, implementano Hibernate per
mappare gli oggetti con le entità nel database. Ricevono le chiamate HTTP dal
gateway e interrogano il loro database per effettuare operazioni sui dati(reperimento,
inserimento, modifica, cancellazione).
I Microservizi per la gestione dei dai sono i seguenti:
      Order-Service: Gestione dei dati relativi agli ordini.
      Product-Service: Gestione dei dati relativi agli items e alle categorie.
      Customer-Service: Gestione dei dati relativi ai clienti.

Login-Service
Microservizio per la gestione del login all’applicativo è di fatto l’authorization server
del protocollo OAuth2.
Esso riceve dal client, nel nostro caso lo Spring Gateway Server, le credenziali, ne
controlla la validità interrogando il database e se sono valide crea un token di accesso
e lo restituisce al client.
Ogni volta che il client vuole accedere ad una risorsa protetta deve fornire il token che
viene controllato, se il token è valido può accedere alle risorse nel caso il token non sia
presente o sia scaduto bisognerà effettuare di nuovo l’autenticazione per ricevere un
altro token.

                           Figura 5.4: Funzionamento Oauth2

Spring Config Server
Microservizio per la gestione della configurazione centralizzata.
Contiene la configurazione dei vari moduli del sistema nel caso del progetto contiene
informazioni relative alla porta sulla quale il modulo dovrà lavorare e quelle relative al
database.
Ogni qualvolta un modulo viene eseguito richiede al Config Server la sua configurazione
questo permette di avere diverse configurazioni per i diversi ambienti in cui i microservizi
possono essere eseguiti.
5.1. ARCHITETTURA                                                                      27

Spring Eureka Server
Microservizio che implementa il tool Netflix Eureka per la Service Discovery, esso
contiene un registro dei servizi disponibili.
In questo modo quando un servizio viene lanciato deve conoscere solo l’indirizzo
e la porta del Server Eureka per poter risalire al Config Server e ottenere la sua
configurazione, una volta ottenuta la comunica al Server Eureka che la salva nel suo
registro.
Quando un servizio vuole comunicare con un altro basta che ne conosca l’id per poter,
tramite il Server Eureka, risalire al suo indirizzo e alla porta, in questo modo i servizi
non devono conoscere le configurazioni degli altri servizi per poterci comunicare ma
basta che ne conoscano l’id.

                     Figura 5.5: Pannello di controllo Server Eureka

Spring Gateway Server
Microservizio che funge da entrypoint del sistema implementando il tool Zuul API
Gateway.
Immaginiamo di avere un applicazione con più microservizi e di dover implementare
una UI che effettua chiamate ai microservizi per cercare e mostrare le informazioni.
Poiché ogni microservizio espone una REST API per la comunicazione il client dovrà
conoscere i dettagli di ogni REST API e gli URL e le porte per chiamarle.
Inoltre se si pensa ad altri aspetti come la sicurezza, l’autenticazione e la Cross Origin
Resurce Sharing ogni microservizio dovrà implementare ognuno di questi aspetti al suo
interno ciò porterebbe ad avere lo stesso codice replicato più volte.
Zuul nasce per risolvere queste problematiche fungendo da API Gateway,esso riceve
tutte le richieste dalla UI e le delega ai microservizi interni appropriati.
Il vantaggio di questo design è che i vari aspetti come la sicurezza, l’autenticazione e
la CORS vengono implementati in un unico servizio centralizzato in questo tutti gli
aspetti comuni vengono applicati a tutte le richieste senza aver codice replicato, inoltre
nel caso ci sia bisogno di effettuare modifiche bisogna solo aggiornare il microservizio
che implementa Zuul.
Inoltre si possono implementare regole di routing o filtri per determinate richieste.
28                                  CAPITOLO 5. PROGETTAZIONE E CODIFICA

Questo microservizio ha un altra funzione ossia l’aggregazione di richieste, è possibile
quindi aggregare più richieste del client destinate a più microservizi interni in una
singola richiesta. Questo schema è particolarmente utile quando il client necessita di
informazioni da svariati microservizi.
Con questo approccio,il client invia una singola richiesta al gateway API che invia
diverse richieste ai microservizi interni, per poi aggregare i risultati e inviare nuovamente
tutti i dati al client.
Il vantaggio e l’obiettivo principali di questo schema progettuale consistono nel ridurre
le comunicazioni frammentate tra il client e i microservizi e anche le comunicazioni tra
microservizi. Per fare un esempio nel applicativo realizzato si ha un associazione tra
clienti ed ordini che però non è gestita tramite database in quanto i dati si trovano in
database diversi. Quindi se il client avesse bisogno dei dati di un cliente e i relativi
ordini nel caso non ci fosse il gateway dovrebbe fare due chiamate ai singoli servizi
una per i dati del cliente e una per gli ordini, la stessa cosa averebbe nel caso in cui
il gateway non facesse da aggregatore ma in questo caso le due chiamate verrebbero
gestite dal gateway. Nel nostro caso poiché il gateway funge anche da aggregatore il
client fa un unica chiamata specifica al gateway che chiama a due microservizi aggrega
i dati ricevuti e li restituisce al client.

5.2      Descrizione dei processi
5.2.1     Inserimento e modifica

                    Figura 5.6: Operazione di inserimento e modifica

    Poiché i processi di inserimento e modifica e dei dati dal database sono simili
verranno descritti tramite un unico esempio. In questi processi il client, tramite una
chiamata REST, invia i dati da inserire/modificare in formato JSON all’API Gateway
il quale interroga il server Eureka per ottenere gli Endpoint[g] del microservizio che
gestisce la specifica chiamata REST e gli invia i dati. Nel microservizio tramite un
controller che mappa le chiamate REST viene richiamata la funzione richiesta per la
manipolazione dei dati nel database.
5.2. DESCRIZIONE DEI PROCESSI                                                            29

5.2.2     Lettura
Nel processo di lettura di dati dal database, il client invia una richiesta di dati, tramite
una chiamata REST, all’API Gateway il quale interroga il server Eureka per ottenere
gli endpoint del microservizio che gestisce la specifica chiamata REST e gli invia la
richiesta. Nel microservizio tramite un controller che mappa le chiamate REST viene
richiamata la funzione di lettura dei dati nel database. Una volta ottenuti i dati dal
database il microservizio li passa all’API gateway che a sua volta li invia al client.

                            Figura 5.7: Operazione di lettura

5.2.3     Cancellazione
In questo processo il client invia una richiesta di cancellazione, tramite una chiamata
REST, all’API Gateway il quale interroga il server Eureka per ottenere gli endpoint
del micro servizio che gestisce la specifica chiamata REST e gli invia la richiesta. Nel
micro servizio tramite un controller che mappa le chiamate REST viene richiamata la
funzione che gestisce la cancellazione dei dati nel database.

                         Figura 5.8: Operazione di cancellazione
30                                 CAPITOLO 5. PROGETTAZIONE E CODIFICA

5.3     Database
Per la persistenza dei dati si è deciso di utilizzare un database MySQL.
A differenza dell’architettura monolitica, dove i dati dell’applicativo vengono salvati in
un unico grande database, l’architettura a microservizi prevede che per la persistenza
dei dati ogni microservizio abbia un proprio database.
In questo modo si posso utilizzare tecnologie diverse a seconda delle esigenze del
microservizio e le modifiche effettuate ai database per implementare nuove funzionalità
necessarie ad un servizio non vanno ad interrompere gli altri microservizi.
Inoltre nel caso di un elevato numero di richieste al database, se si è nel caso nel quale
si ha un unico database per tutti i microservizi, quest’ultimi si troveranno tutti con le
richieste verso il database congestionate andando così a rallentare il funzionamento
dell’intera applicazione.
Questo va contro la filosofia che c’è dietro l’architettura a microservizi permette nel
caso in cui un servizio sia congestionato innanzitutto di non avere congestione negli
altri microservizi e inoltre di poter replicare il microservizio e il suo database in modo
da poter riuscire a bilanciare il traffico di dati.

5.3.1     Progettazione database
Per quanto riguarda la progettazione del database dell’applicativo poiché non vi era
esperienza di progettazione di database per microservizi inizialmente si è definito uno
schema del database con architettura monolitica definendo i dati da memorizzare e le
relazioni tra i diversi elementi presenti.
Dopodiché si è scomposto il database monolitico nei vari database dei singoli microser-
vizi, si sono implementati i microservizi e sono stati testati singolarmente dopodiché si
è implementato lo Spring Gateway Server che funge da aggregatore come spiegato in
precedenza e si sono testate le chiamate aggregate.
Il seguente schema mostra la struttura monolitica del database e la suddivisione nei
vari database dei microservizi.

                            Figura 5.9: Schema del database
5.4. CROSS-ORIGIN RESOURCE SHARING                                                     31

5.4      Cross-origin resource sharing
Questo paragrafo spiega il funzionamento del Cross-origin resource sharing (CORS)
meccanismo del quale non si era a conoscenza in fase di analisi e che ha portato via
diverso tempo in fase di realizzazione del prodotto per essere configurato in modo
adeguato.
Il CORS è un meccanismo che consente ai domini esterni di accedere alle risorse protette
di un domino. Per ragioni di sicurezza, i browser limitano le cross-origin HTTP requests
che vengono generate all’interno degli scripts. Ciò significa che un’applicazione web può
solamente richiedere risorse HTTP dalla stessa origine di caricamento dell’applicazione,
a meno che la risposta dall’altra origine includa i corretti header CORS.
Lo standard Cross-Origin Resource Sharing funziona aggiungendo nuovi header HTTP
che consentono ai server di descrivere l’insieme di origini che sono autorizzate a leggere
quelle informazioni tramite un web browser. In aggiunta, per i metodi di richiesta
HTTP che possono causare effetti collaterali sui dati del server la specifica prevede che
il browser "anticipi" la richiesta (questa operazione è detta "preflight"), richiedendo al
server i metodi supportati tramite una richiesta HTTP OPTIONS, e poi, dopo una
"approvazione" del server, invii la richiesta effettiva con il metodo HTTP effettivo. I
server possono anche informare i client se delle "credenziali" (inclusi Cookies e dati di
autenticazione HTTP) debbano essere inviate insieme alle richieste.

      Figura 5.10: Flowchart che mostra come un browser gestisce le chiamate CORS
Puoi anche leggere