JavaRush /Java Blog /Random-IT /SpringBoot + Flyway - "Progetto Java dalla A alla Z"
Roman Beekeeper
Livello 35

SpringBoot + Flyway - "Progetto Java dalla A alla Z"

Pubblicato nel gruppo Random-IT
Un articolo tratto da una serie sulla creazione di un progetto Java (i collegamenti ad altri materiali sono alla fine). Il suo obiettivo è analizzare le tecnologie chiave, il risultato è scrivere un bot di Telegram. In questa parte proviamo a lanciare SpringBoot e Flyway. Il minimo di teoria, come preferisci))) Tralasciamo il confronto finale Flyway/Liquibase per un periodo di tempo indefinito e arriviamo al dunque. E anche così la situazione si è già trascinata. Per non descrivere Flyway due volte, ho deciso di aggiungerlo immediatamente al nostro futuro progetto JRTB."Progetto Java dalla A alla Z": SpringBoot + Flyway - 1

Cosa dobbiamo fare in questo contesto?

  1. Avvia un'applicazione SpringBoot basata su Maven.
  2. Aggiungi Flyway lì: fortunatamente si integrano facilmente.
  3. Aggiungi uno schema per le tabelle che abbiamo nel database di esempio.
In questo modo impareremo come lavorare con Flyway. Perché un progetto separato e non immediatamente nel nostro JRTB? Perché più tardi, chiunque voglia capire come farlo avrà un progetto con un esempio e un articolo che descrive come lavorarci. Bene, andiamo!

Cos'è la flyway

Per usare qualcosa, devi prima capire di cosa si tratta e perché. Flyway è uno strumento di controllo della versione del database. Le parole sono ben note, ma in qualche modo la comprensione non è stata aggiunta, giusto? Proviamo a descrivere il problema risolto da Flyway. Diciamo che abbiamo un progetto. Come ogni cosa nel nostro mondo, non è perfetta, quindi non è stato possibile pianificare e redigere la versione finale del progetto. Ogni volta appaiono alcune sfumature inesplicabili. Il progetto utilizza un database nel suo lavoro. Naturalmente, se cambia il progetto, può cambiare anche la struttura del database. Diciamo che aggiungiamo un nuovo campo per una delle entità nel nostro progetto. Come farlo?
  1. Aggiungi questo campo alla nostra entità, aggiorna tutto in modo che la logica aziendale funzioni.
  2. Aggiorna il database. L'unico modo possibile è farlo manualmente. Per fare ciò, devi entrare e registrare lo script SQL necessario.
Il secondo punto solleva molte domande:
  1. Ma se abbiamo più di un luogo in cui implementiamo il nostro progetto, allora è necessario farlo in ciascuno di essi?
  2. e se vogliamo tornare indietro, come facciamo a sapere esattamente in quale stato si trova la struttura del database adesso?
  3. Come possiamo essere sicuri che la modifica del database abbia avuto successo?
  4. Come posso avere l'opportunità di tenere traccia di tutte le modifiche al database avvenute nel progetto?
Se lo fai manualmente, le risposte non saranno delle migliori... Per evitare tutte queste difficoltà, puoi utilizzare uno strumento di migrazione del database. Uno di questi è Flyway. Qual'è il suo lavoro? Nell'ambito del progetto memorizziamo file SQL separati (le cosiddette migrazioni), che memorizzano contemporaneamente tutto ciò che facciamo con il database. Tutte le migrazioni avvengono rigorosamente in un certo ordine, il che consente di tenere traccia dei cambiamenti nella struttura e nei dati del database (spesso, utilizzando la migrazione, i dati di test vengono aggiunti al progetto in modo che quando vengono distribuiti su un server, ne abbiano già alcuni valori​​con cui è possibile testare il progetto). Una volta superati i test, le migrazioni vengono avviate una volta creato il progetto. Si connettono al database ed eseguono migrazioni. Se le migrazioni sono già state eseguite su questo database, flyway le salterà semplicemente (memorizza i dati sulle migrazioni e il loro stato in una tabella separata nel database, che aiuta a gestirle), e se alcune migrazioni non hanno avuto successo, il progetto build e il suo montaggio (distribuzione) sul server verrà interrotto. Ho cercato di descriverlo nel modo più dettagliato possibile. Se ancora non è tutto del tutto chiaro, non importa: con la pratica arriverà la comprensione.

Avvia SpringBoot + Flyway

Cos'è lo Spring Boot

Cosa stiamo lanciando?... Per capire cosa e perché stiamo facendo, devi decidere cos'è SpringBoot. Per prima cosa parliamo velocemente (beh, molto velocemente) della Primavera . Al momento, è di fatto lo standard industriale nello sviluppo di applicazioni server in Java. Standard di cosa? Come posso spiegartelo? Spring è lo scheletro dell'applicazione, sul quale poi gettiamo la “carne”: la nostra logica aziendale. Con l'aiuto di Spring (d'ora in poi utilizzerò questo lucido per non perdere tempo a cambiare lingua :D)) Spring ci dà uno spunto da cui iniziamo a fare tutto. È multiforme, multimodulare:
  1. Vuoi lavorare con un database? Vuoi relazionale? Vuoi non relazionale? Eccoci con Spring Data.
  2. Vuoi lavorare con le richieste http? Ecco qua, Spring web (Spring MVC).
  3. Hai bisogno di un contenitore per tutti i tuoi oggetti in un unico posto? Ecco Spring Core.
  4. Hai bisogno di impostare la sicurezza su un progetto in modo che ci siano ruoli e catene di comando diversi? Sicurezza primaverile.
  5. Proprio quando pensavi che sarebbe stato bello avere una cosa del genere, si scopre che Spring ha già ciò di cui hai bisogno e si integra rapidamente e facilmente.
Pertanto, possiamo dire che questo non è solo un framework (una biblioteca così enorme), ma un intero ecosistema che si sta sviluppando a un ritmo vertiginoso. Per capire cos'è Spring Core, cioè la base a cui sono collegati i moduli, ti consiglio di guardare una demo live sulla creazione del tuo framework. È ospitato da Evgeny Borisov, un ragazzo molto simpatico nel campo di Java e Spring. Fai tutto ciò che ha fatto e il lavoro della primavera ti diventerà più chiaro. SpringBoot, a sua volta, è l'apice di tutto ciò che hanno. La magia dell'acqua pura. Impostazioni minime per effettuare il primo avvio dell'applicazione. Naturalmente, questo non ti darà una comprensione di come usarlo e cosa fare. Ma prima di precipitarti nelle profondità dello sviluppo, devi guardare tutto da una prospettiva a volo d'uccello.

Avvio di SpringBoot

Dato che abbiamo già capito cos'è Maven, creiamo un nuovo progetto per le nostre esigenze. Per fare ciò, devi solo visitare un sito Web creato appositamente per questa materia. Si chiama Spring Inizializr . "Progetto Java dalla A alla Z": SpringBoot + Flyway - 2Qui devi compilare e selezionare ciò di cui hai bisogno:
  1. Lo strumento di creazione del progetto è Gradle o Maven. Come puoi vedere, Ant non viene nemmeno più menzionata. Questo è un buon suggerimento su quali strumenti di creazione valgono il tuo tempo.
  2. La lingua in cui puoi scrivere è Java, Kotlin, Groovy. Qui tutto è semplice: sono tutti simili a JVM ed eseguono facilmente il codice Java. A proposito, vale la pena dare un'occhiata a Kotlin. Groovy è francamente diventato poco interessante (c'è stato un tempo in cui sono passati al groove, ma è passato rapidamente).
  3. Versione Spring... Qui devi capire che le versioni della parte principale di Spring e dei suoi moduli sono coerenti.
  4. Dati del progetto. Ho già descritto queste cose.
  5. Scegliamo quale archivio verrà raccolto: Jar o War.
  6. Bene, la versione Java del nostro preferito. E recentemente ce ne sono state molte di queste versioni... Hanno aspettato anni, e ora ce ne sono due all'anno.
Nel nostro caso, pubblicheremo questo progetto nell'organizzazione della comunità JavaRush , quindi le informazioni sul progetto saranno appropriate:
  1. Maven, non per niente te ne abbiamo parlato prima.
  2. Java è il nostro tesoro: D
  3. Prendiamo la versione 2.2.11. Perché non quello più recente? Perché più è nuovo, maggiore è la possibilità che ci siano dei bug lì. Per noi non importa quale versione, ma quella più vecchia sarà più affidabile. Pertanto, scegliamo 2.2.11.
  4. Gruppo: com.github.javarushcommunity
  5. Artefatto: demo di springboot-flyway
  6. Nome: SpringBoot + Demo Flyway
  7. Descrizione: il progetto dimostra l'integrazione tra SpringBoot e Flyway . (Sì, la capacità di scrivere documentazione è una parte importante dello sviluppo :))
  8. Nome del pacchetto: com.github.javarushcommunity.springbootflywaydemo . Qui creeranno subito per noi un pacchetto base con una classe che lancerà la nostra applicazione.
  9. Confezione: barattolo
  10. Java: 8. Non andiamo avanti alla locomotiva e prendiamo il buon vecchio otto. Perché non 11? Per che cosa? Per il nostro esempio, non vedo il punto.
"Progetto Java dalla A alla Z": SpringBoot + Flyway - 3Ora aggiungiamo i moduli. Dobbiamo trovare l'integrazione con Flyway. Puoi anche aggiungere qualcosa relativo a MySQL e Spring Data. Aggiungiamo un altro lombok (questa è una cosa davvero necessaria, per ora fidati di me :D)) Per fare ciò, fai clic su AGGIUNGI DIPENDENZE ... e seleziona tutto ciò di cui hai bisogno: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 4ecco come aggiungiamo Flyway. "Progetto Java dalla A alla Z": SpringBoot + Flyway - 5Lombok... E così via. Di conseguenza, otteniamo: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 6Eh... abbiamo compilato tutto)) Ora fai clic su GENERA... e il gioco è fatto: l'archivio con il progetto generato è pronto :) C'è anche una cosa interessante come CONDIVIDI... , che ti dà un collegamento alla pagina che hai appena compilato. Cioè, ecco quello che ho generato . E anche se qualcosa va storto, puoi sempre verificare utilizzando il collegamento. Successivamente, dobbiamo collegare il progetto creato al repository Git, quindi cloniamo il progetto springboot-flyway-demo creato e lo scarichiamo tramite IDEA. Per fare ciò, devi aprire l'idea e selezionare File -> Nuovo -> Progetto da fonti esistenti... : "Progetto Java dalla A alla Z": SpringBoot + Flyway - 7ora aggiungi l'URL e fai clic su Clone . Il passo successivo è trasferire le parti interne del progetto generato all'interno di quello che abbiamo clonato. Confuso? Te lo mostrerò adesso. L'ho decompresso e ho ricevuto la seguente serie di file: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 8Questi devono essere trasferiti al progetto clonato. Come nell'articolo precedente, aggiungiamo pom.xml come progetto Maven: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 9ora ci interessa vedere cosa è stato generato per noi. Se apri tutte le cartelle in src e oltre, vedrai la solita gerarchia nei progetti Maven, di cui abbiamo discusso nell'articolo precedente . Per chi non l'ha letto, leggetelo! "Progetto Java dalla A alla Z": SpringBoot + Flyway - 10Si può vedere che abbiamo una classe Application e la nostra applicazione SpringBoot verrà avviata utilizzandola. Grazie al plugin Maven per SpringBoot, ora abbiamo il compito di cui abbiamo bisogno per Maven, ovvero spring-boot:run. Dove possiamo trovare queste informazioni? A destra, aprendo la piastra Maven e il nostro progetto: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 11Ci sarà un errore e non saremo in grado di leggerlo, vedremo qualcosa del genere: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 12Per ottenere maggiori informazioni, per velocità possiamo eseguire il metodo principale della classe Application: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 13E poi vedremo il vero motivo: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 14Qui già ci sono più informazioni e puoi farci qualcosa. Cosa c'è che non va? Abbiamo dipendenze associate al database e pertanto dobbiamo fornire le impostazioni per connetterci ad esso. Per fare ciò, cerchiamo su Google e scopriamo che dobbiamo aggiungere le seguenti configurazioni a application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Eseguiamo nuovamente il metodo main e otteniamo: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 15Ora dobbiamo aggiungere almeno una migrazione. Per creare correttamente una migrazione, è necessario prendere il seguente modello: V<VERSION>__<NAME>.sql Utilizzando questo modello, creeremo un file di migrazione denominato V00001__Create_country_table.sql nella cartella appropriata: /src/main/resources/ db.migrazione/ . Creiamo una tabella country al suo interno. Prendiamo lo script dal secondo articolo sul database . "Progetto Java dalla A alla Z": SpringBoot + Flyway - 16Prima di iniziare entriamo e creiamo un database per il lavoro: flyway_demo_db. Facciamolo tramite MysqlWorkbench: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 17ora possiamo eseguire nuovamente il metodo principale: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 18tutto ha funzionato, ma poiché non abbiamo ancora nulla nel progetto, ha finito di funzionare. Tuttavia, dai log risulta chiaro ( leggi cosa sono i log ) che:
  1. Connessione al database riuscita.
  2. La migrazione è stata convalidata e tutto è ok.
  3. Flyway ha creato una tabella per gestire le migrazioni.
  4. E ciò che è iniziato con la migrazione 00001: la creazione del paese ha avuto successo.
Per verificarlo, puoi andare a vedere cosa viene fatto nel database. Andiamo quindi sul nostro server MySQL e vediamo cosa succede con le tabelle nel database flyway_demo_db: $ USE flyway_demo_db; $MOSTRA TABELLE; "Progetto Java dalla A alla Z": SpringBoot + Flyway - 19Come mi aspettavo, è avvenuta una migrazione, durante la quale è stata creata la tabella country ed è apparsa la tabella flyway_schema_history, che memorizza le informazioni sulle migrazioni. Andiamo oltre e vediamo quali record ci sono (e se ce ne sono). $SELECT * FROM flyway_schema_history; "Progetto Java dalla A alla Z": SpringBoot + Flyway - 20Ecco la registrazione, l'unica. Contiene molti dati interessanti. Versione, descrizione della migrazione, che tipo di SQL (e forse anche XML), il nome dello script stesso, checksum ( si tratta di qualcosa come un codice hash, che viene utilizzato per verificare se la migrazione è cambiata o meno. Questo viene fatto nel caso in cui abbiamo effettuato una migrazione nel database e poi è stato corretto: questo non può essere fatto, tutte le modifiche vengono apportate solo attraverso una nuova migrazione e per evitare che ciò accada, l'importo dell'assegno monitora questo) , nome SQL dell'utente, elaborazione della migrazione data, ora di esecuzione e esito (riuscito o meno) . Una migrazione scritta una volta non dovrebbe essere modificata in futuro. Anche se c'è un difetto. Tutte le modifiche avvengono solo attraverso una nuova migrazione. È molto importante. Per mostrare cosa accadrà, cambiamo leggermente il nostro script e proviamo a eseguirlo di nuovo. Aggiungiamo una voce alla tabella dei paesi nella nostra migrazione: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 21ed eseguiamo il metodo main e questo è ciò che otteniamo: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 22Come mi aspettavo, Flyway ha riconosciuto che lo script era stato modificato e non ha eseguito la migrazione. In alcuni casi, potrebbe essere effettivamente necessario eseguire una migrazione aggiornata e, affinché flyway possa ignorarla, è necessario eliminare la voce nella tabella flyway_schema_history e quindi eseguire la migrazione aggiornata. Questo non è un comportamento normale e non dovrebbe essere così, ma è necessario conoscere anche questo metodo per risolvere il problema. Ci siamo occupati della prima migrazione. Ora vorrei aggiungere un'altra migrazione, con i dati sui paesi, come nell'articolo sul database: file V00002__Add_test_data_to_country.sql"Progetto Java dalla A alla Z": SpringBoot + Flyway - 23 Ed eseguiamo nuovamente il metodo principale: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 24Dai log è chiaro che prima che iniziasse la migrazione, il database era nella versione 00001, quindi tutte le migrazioni successive a questa versione. Successivamente è stata lanciata la versione 00002 che ha avuto successo. Controlliamo, o mi credi già che tre record per paese saranno già nel database?)) Vorrei controllare, quindi prova: "Progetto Java dalla A alla Z": SpringBoot + Flyway - 25qualcosa del genere. Se esegui nuovamente il progetto, Flyway salterà semplicemente l'implementazione delle migrazioni, poiché il database è completamente conforme alla versione richiesta.

Conclusione

Questa volta abbiamo imparato a comprendere e utilizzare uno strumento di migrazione del database insieme a SpringBoot. Queste informazioni sono necessarie per comprendere cos'è uno strumento di controllo della versione del database, utilizzando Flyway come esempio. Amici, il codice sorgente del progetto che vi ho mostrato è pubblicato nella nostra organizzazione su Github . Se l'esempio ti piace, dagli una stella , e capirò che il mio lavoro è utile e vale davvero la pena continuare. Tradizionalmente, suggerisco di iscrivermi al mio account Github . Attraverso di lui conduco tutto il mio lavoro sull'open source e tutti quei progetti dimostrativi che invariabilmente accompagnano i miei articoli. Grazie a tutti per aver letto. La prossima volta scriveremo la nostra candidatura. Ci sarà qualche teoria necessaria su Docker in futuro, ma la diluiremo pesantemente con la pratica.

link utili

Oggi non ci sono molti link utili. Fate attenzione al video di Evgeniy, ne vale davvero la pena!
  1. Sito web per la creazione di progetti in primavera
  2. Evgeniy Borisov — Costruttore di molle
  3. Documentazione in primavera per Flyway

Un elenco di tutti i materiali della serie si trova all'inizio di questo articolo.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION