O lenei tusiga o loʻo faʻamatalaina auiliili pe faʻafefea ona foia faʻafitauli fesoʻotaʻiga faʻamaumauga i le faʻapipiʻiina. Matou te taʻuina atu ia te oe le mea e mafai ona tupu i au gaosiga o talosaga pe afai e te taumafai e faʻapipiʻi e aunoa ma se sauniuniga muamua. Ona matou uia lea i laasaga o le olaga o le talosaga e manaʻomia ina ia leai se taimi faʻaletonu (tusa. laina: toe - leai se taimi malolo). O le taunuuga oa tatou gaioiga o le a faʻaaogaina le suiga o faʻamaumauga tuʻufaʻatasiga i tua i se auala e fetaui i tua.
Afai e te manaʻo e malamalama i faʻataʻitaʻiga code mai le tusiga, e mafai ona e mauaina i latou i GitHub.
Faatomuaga
Le fa'atinoina ole taimi fa'aletonu
Oka se mea lilo leai se taimi malolo fa'agaioiina? E mafai ona e fai atu o le taimi lea e faʻapipiʻiina ai lau talosaga i se auala e mafai ai ona e faʻafeiloaʻi ma le manuia se faʻamatalaga fou o le talosaga i le gaosiga, ae e le o iloa e le tagata faʻaoga lona le avanoa. Mai se tagata faʻaoga ma le kamupani, o le faʻataʻitaʻiga sili lea ona mafai ona tuʻuina atu aua e mafai ai ona faʻaalia foliga fou ma faʻapipiʻi faʻamau e aunoa ma le faʻalavelave.
E faapefea ona ausia lenei mea? E tele auala, o se tasi lenei:
fa'atino le numera 1 o lau 'au'aunaga
faia se femalaga'iga fa'amaumauga
Fa'atu le fa'asologa #2 o lau 'au'aunaga fa'atasi ma le version #1
o le taimi lava e te vaʻai ai o loʻo galue le numera Nu. 2 e pei ona tatau ai, aveese le numera Nu. 1
sauni!
Faigofie, a ea? Ae paga lea, e le faigofie tele, ma o le a tatou tilotilo i ai i se auiliiliga mulimuli ane. Ia se'i o tatou siaki le isi faiga masani fa'apipi'i - blue green deployment.
Na e faʻalogo ile fa'apipi'i lanu meamata lanumoana? Cloud Foundry e matua faigofie lava. Na'o le vaai lenei tusitusiga, lea matou te faʻamatalaina atili ai lenei mea. Ina ia otootoina faapuupuu, sei matou faamanatu atu ia te oe le auala e fai ai le faʻapipiʻiina o lanu meamata lanumoana:
fa'amautinoa e lua kopi o lau fa'ailoga ("lanumoana" ma le "lanumeamata") e galue;
faʻatonu auala uma i le siosiomaga lanumoana, i.e. ina ia fa'asino i ai URL o le gaosiga;
fa'apipi'i ma fa'ata'ita'i suiga uma o talosaga i se si'osi'omaga lanu meamata;
sui urls mai le lanumoana ile si'osi'omaga lanu meamata
Blue green deployment o se auala e mafai ai ona faigofie ona faʻaalia foliga fou e aunoa ma le popole e uiga i le gau o gaosiga. E mafua ona o le mea moni e tusa lava pe tupu se mea, e faigofie lava ona e toe foʻi i tua i le siʻosiʻomaga talu ai i le na o le "faʻafefe o se ki."
A maeʻa ona e faitauina mea uma o loʻo i luga, e mafai ona e fesiligia le fesili: O le a le mea e fai e leai se taimi e faʻaogaina ai le Blue green deployment?
Ia, e tele naua mea e tutusa ai, talu ai o le tausia o kopi e lua o le siosiomaga e tasi e manaʻomia ai le faaluaina o taumafaiga e tausia ai. O le mea lea e fai mai ai nisi 'au Matini Fowler, mulimuli i se fesuiaiga o lenei auala:
O le isi filifiliga o le faʻaogaina lea o faʻamaumauga e tasi, fatuina o lanu lanumoana-lanumeamata mo le upega tafaʻilagi ma faʻasalalauga. I lenei faiga, o le database e masani ona avea ma faʻafitauli, aemaise lava pe a manaʻomia le suia o lana fuafuaga e lagolago ai se faʻamatalaga fou o le polokalama.
Ma o iinei tatou te oʻo mai i le faʻafitauli autu i lenei tusiga. Faʻamaumauga. Se'i toe va'ai i le fasifuaitau lea.
faia se femalaga'iga fa'amaumauga.
O lea la e tatau ona e fesili ifo ia te oe lava i le fesili - fa'afefea pe afai e le fetaui i tua le suiga o le database? E le malepe la'u lomiga muamua o le app? O le mea moni, o le mea tonu lava lea o le a tupu ...
O lea la, e ui lava i le tele o faʻamanuiaga o le zero downtime / blue green deployment, e masani ona mulimulitaʻi kamupani i le auala sili atu ona saogalemu mo le faʻaogaina oa latou talosaga:
saunia se afifi ma se lomiga fou o le talosaga
tapuni se tusi talosaga
fa'agasolo tusitusiga e fa'asolo ai le fa'amaumauga
fa'apipi'i ma fa'alauiloa se lomiga fou o le talosaga
I totonu o lenei tusiga, matou te faʻamatalaina pe faʻafefea ona e galue ma lau faʻamaumauga ma faʻailoga e faʻaoga lelei ai le faʻaogaina o le taimi e leai se taimi.
Fa'afitauli fa'amaumauga
Afai ei ai sau talosaga e leai ni setete e le teuina ni faʻamatalaga i totonu o faʻamaumauga, e mafai ona e maua le leai o se taimi faʻapipiʻi vave. Ae paga lea, o le tele o polokalama e manaʻomia le teuina o faʻamatalaga i se mea. Ole mea lea e tatau ai ona e mafaufau faalua aʻo leʻi faia ni suiga ile matagaluega. Ae tatou te le'i o'o i fa'amatalaga i le auala e sui ai le fuafuaga ina ia leai se taimi malolo deployment e mafai, se'i o tatou taula'i muamua i le fa'aliliuga schema.
Faiga fa'aliliuga
I lenei tusiga o le a matou faʻaaogaina Auala lele e fai ma meafaigaluega e pulea fa'aliliuga (tusa. Fa'aliliuga: o lo'o matou talanoa e uiga i femalagaiga fa'amaumauga). E masani lava, o le a matou tusia foi se talosaga Spring Boot lea ua fausia i totonu o le Flyway lagolago ma o le a fa'atinoina le schema migration a'o fa'atūina le fa'asologa o talosaga. A faʻaaogaina Flyway, e mafai ona e teuina faʻamaumauga o femalagaiga i totonu o lau faila o galuega (e ala i le faaletonu ile classpath:db/migration). O iinei e mafai ona e vaʻai i se faʻataʻitaʻiga o ia faila femalagaiga
I lenei faʻataʻitaʻiga tatou te vaʻai i 4 migration scripts, afai e leʻi faia muamua, o le a faʻataunuʻuina le tasi ma le isi pe a amata le talosaga. Sei o tatou tilotilo i se tasi o faila (V1__init.sql) e fai ma fa'ata'ita'iga.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
O mea uma lava e fa'amalamalama lelei: e mafai ona e fa'aogaina le SQL e fa'amatala ai pe fa'afefea ona suia lau fa'amaumauga. Mo nisi fa'amatalaga e uiga i Spring Boot ma Flyway, siaki Spring Boot Docs.
I le faʻaaogaina o se mea e faʻatonutonu ai punaoa ma Spring Boot, e te maua ai ni faʻamanuiaga tetele se 2:
e te tu'u'ese'ese suiga fa'amaumauga mai suiga fa'ailoga
O femalaga'iga fa'amaumauga e tupu fa'atasi ma le fa'agasolo atu o lau talosaga, i.e. ua fa'afaigofieina lou fa'agaioiina
Fa'afitauli fa'afitauli fa'amaumauga
I le isi vaega o le tusiga, o le a tatou taulai atu i le vaʻavaʻai i auala e lua i suiga o faʻamaumauga.
le fetaui i tua
fetaui i tua
O le mea muamua o le a manatu o se lapataiga e le tatau ona e faia le zero downtime deployment e aunoa ma le sauniuni muamua ... O le lona lua e ofoina atu se fofo ile auala e mafai ai ona e faia se faʻapipiʻi e aunoa ma le faʻalavelave ma i le taimi lava e tasi e faʻatumauina le fetaui i tua.
O la matou poloketi o le a matou galulue ai o se talosaga faigofie Spring Boot Flyway lea e iai Person с first_name и last_name i totonu o fa'amaumauga (tusa. fa'aliliuga: Person o se laulau ma first_name и last_name - o fanua ia i totonu). Matou te fia toe faaigoa last_name в surname.
Mafaufauga
Ae tatou te leʻi oʻo i faʻamatalaga, e iai ni manatu se lua e manaʻomia ona tatou faia e uiga ia tatou talosaga. O le taunuuga autu tatou te mananao e ausia o le a fai lava si faigofie faiga.
Zametka. Pisinisi PRO-TIP. O le fa'afaigofieina o faiga e mafai ona fa'asaoina ai oe i le tele o tupe i le lagolago (o le tele o tagata o lo'o e faigaluega mo lau kamupani, o le tele foi lea o le tupe e mafai ona e fa'asaoina)!
Leai se mana'omia e toe fa'afo'i le fa'amaumauga
E fa'afaigofieina le fa'agaioiina o le fa'agaioiga (o nisi fa'amaumauga fa'amaumauga e toetoe a le mafai, e pei o le tapeina o le solomuli). Matou te fiafia e toe fa'afo'i na'o talosaga. I lenei auala, e tusa lava pe i ai au faʻamaumauga eseese (mo se faʻataʻitaʻiga, SQL ma NoSQL), o lau paipa faʻapipiʻi o le a foliga tutusa.
E tatau ona mafai pea ona toe fa'afo'i le talosaga ile tasi fa'asologa i tua (leai se toe)
E tatau ona toe fa'afo'i pe a mana'omia. Afai ei ai se pusa i le lomiga o loʻo i ai nei e le faigofie ona faʻaleleia, e tatau ona mafai ona tatou toe foʻi i le lomiga fou o galuega. Matou te manatu o lenei faʻamatalaga galue fou o le mea muamua lea. O le fa'atumauina o le fa'aogaina o fa'amaumauga ma fa'amaumauga mo le sili atu ma le tasi le fa'asalalauga o le a matua faigata ma taugata.
O le tusi. Mo le sili atu le faigofie ona faitau, i lenei tusiga o le a tatou suia le tele o faʻamatalaga o le talosaga.
Laasaga 1: Tulaga Muamua
Fa'asologa o polokalame: 1.0.0
DB version: v1
manatu
Ole tulaga muamua lea ole talosaga.
Suiga fa'amaumauga
DB e iai last_name.
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Suiga code
O lo'o teuina e le talosaga fa'amaumauga a Tagata i totonu last_name:
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastname) {
this.lastName = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
+ "]";
}
}
Toe fa'aigoaina koluma e le fetaui i tua
Se'i o tatou va'ai i se fa'ata'ita'iga pe fa'afefea ona sui se igoa koluma:
Faalogo O le faʻataʻitaʻiga o loʻo mulimuli mai o le a malepe ma le loto i ai. Matou te faʻaalia lenei mea e faʻaalia ai le faʻafitauli o fesoʻotaʻiga faʻamaumauga.
Fa'asologa o polokalame: 2.0.0.BAD
DB version: v2bad
manatu
O suiga o lo'o iai nei e LE fa'atagaina i matou e fa'atino ni fa'ata'ita'iga se lua (tua ma fou) i le taimi e tasi. O le mea lea, o le leai o se downtime deployment o le a faigata ona ausia (afai e amanaia manatu, e matua le mafai lava).
Su'ega A/B
O le tulaga o loʻo i ai nei o loʻo i ai le matou faʻaoga talosaga 1.0.0, deployed i le gaosiga, ma database v1. Matou te manaʻomia le faʻaogaina o se faʻataʻitaʻiga lona lua o le talosaga, version 2.0.0.BAD, ma fa'afou le fa'amaumauga i v2bad.
Laasaga:
o se fa'ata'ita'iga fou o le fa'asologa o talosaga o lo'o fa'apipi'iina 2.0.0.BADlea e faafou ai le database i v2bad
i totonu o le database v2bad koluma last_name ua le toe i ai - ua suia i surname
Sa manuia le fa'amaumauga ma le fa'afouga o talosaga ma o lo'o fa'agasolo nisi taimi 1.0.0, isi - i 2.0.0.BAD. E fesoʻotaʻi mea uma i le database v2bad
tulaga uma o le lomiga 1.0.0 o le a amata lafo mea sese ona o le a latou taumafai e faʻaofi faʻamatalaga i totonu o le koluma last_nameo lē ua lē toe iai
tulaga uma o le lomiga 2.0.0.BAD o le a galue e aunoa ma ni faafitauli
E pei ona mafai ona e vaʻai, afai matou te faia i tua suiga le fetaui i le database ma le faʻaoga, e le mafai le suʻega A/B.
Toe fa'afo'i le talosaga
Seʻi tatou manatu pe a uma ona taumafai e fai le A/B deployment (tusa. per.: atonu o le uiga o le tusitala o le A/B suʻega iinei) na matou filifili e tatau ona matou toe faʻafoʻi le talosaga i le lomiga 1.0.0. Fa'apea tatou te le mana'o e toe fa'afo'i le fa'amaumauga.
Laasaga:
matou taofi le fa'ata'ita'iga o le fa'ata'ita'iga 2.0.0.BAD
o lo'o tumau pea le database v2bad
talu mai le lomiga 1.0.0 e le malamalama po o le a surname, o le a tatou vaaia mea sese
ua malepe seoli, e le mafai ona tatou toe foi i tua
E pei ona mafai ona e vaʻai, afai matou te faia i tua suiga le fetaui i le database ma le talosaga, e le mafai ona matou toe foʻi i tua i le lomiga muamua.
Fa'amaumauga o fa'atinoga
Backward incompatible scenario:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}
Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
curl: (22) The requested URL returned error: 500 Internal Server Error
Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:
{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}
Suiga fa'amaumauga
Fa'amatalaga femalaga'iga e toe fa'aigoa last_name в surname
Punavai Flyway script:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Mau e toe fa'aigoaina last_name.
-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;
Suiga code
Ua matou suia le igoa o le fanua lastName i surname.
Toe fa'aigoaina o se koluma i se auala e fetaui i tua
O le tulaga masani lea tatou te ono fetaiai. E tatau ona tatou faia ni suiga le fetaui i tua. Ua uma ona matou faʻamaonia e faʻapea mo le faʻaogaina o le leai o se taimi, e le tatau ona na o le faʻaogaina o le femalagaiga o faʻamaumauga e aunoa ma ni laasaga faaopoopo. I totonu o lenei vaega o le tusiga, o le a matou faia 3 faʻapipiʻiina o le talosaga faʻatasi ai ma femalagaiga faʻamaumauga e ausia ai le manaʻoga iʻuga aʻo tausisia le fetaui i tua.
Zametka. Manatua o loʻo i ai a matou faʻamaumauga faʻamaumauga v1. O lo'o i ai koluma first_name и last_name. E tatau ona tatou sui last_name i surname. E iai fo'i le matou app version 1.0.0, lea e lei faaaogaina surname.
Laasaga 2: Fa'aopoopo igoa
Fa'asologa o polokalame: 2.0.0
DB version: v2
manatu
E ala i le fa'aopoopoina o se koluma fou ma le kopiina o mea o lo'o i totonu, matou te faia ai suiga i tua e fetaui ma fa'amaumauga. I le taimi lava e tasi, afai tatou te toe faʻafoʻi le JAR pe fai se JAR tuai o loʻo tamoe, e le malepe i le taimi o le faʻatinoga.
O loʻo matou faʻasalalau se faʻamatalaga fou
Laasaga:
fai se femalaga'iga fa'amaumauga e fai ai se koluma fou surname. Lenei lau DB version v2
kopi faamatalaga mai last_name в surname. Faʻalogo leleiafai e tele au faʻamatalaga nei, e tatau ona e mafaufau i le femalagaiga o vaega!
tusi le fa'ailoga o lo'o fa'aoga ai LAUA и новыйma le tuai koluma. Lenei lau fa'aoga app 2.0.0
faitau le tau mai le koluma surname, afai e leai null, pe mai last_namepe afai surname e le o ta'ua. E mafai ona e tapeina getLastName() mai le code, talu ai o le a faʻaalia null pe a toe fa'afo'i lau talosaga mai 3.0.0 i 2.0.0.
Afai o loʻo e faʻaaogaina Spring Boot Flyway, o nei laʻasaga e lua o le a faia i le taimi o le amataga o le lomiga 2.0.0 talosaga. Afai e te fa'atautaia ma le lima le meafaigaluega fa'aliliuga fa'amaumauga, e tatau ona e faia ni mea 'ese'ese se lua e fai ai lenei mea (muamua fa'afouina le db version ma le lima ona fa'apipi'i lea o le talosaga fou).
E taua. Manatua o le koluma fou na faia E LE TATAU ia LE FAʻAALIGA. Afai e te faia se rollback, o le talosaga tuai e le iloa e uiga i le koluma fou ma o le a le faʻapipiʻiina i le taimi Insert. Ae afai e te faʻaopoopoina lenei faʻalavelave ma o lau db o le a v2, e mana'omia le setiina o le tau o le koluma fou. Le mea o le a taʻitaʻia ai le solia o tapulaʻa.
E taua. E tatau ona e aveese le auala getLastName(), aua i le lomiga 3.0.0 E leai se manatu o se koluma i le code last_name. O lona uiga o le null o le a seti iina. E mafai ona e tu'ua le metotia ma fa'aopoopo siaki mo null, ae o se fofo e sili atu ona lelei o le faʻamautinoa lea i totonu o le manatu getSurname() na e filifilia le tau sa'o e le-zero.
Su'ega A/B
O le tulaga o loʻo i ai nei o loʻo i ai le matou faʻaoga talosaga 1.0.0, fa'apipi'iina i le gaosiga, ma le fa'amaumauga i totonu v1. Matou te manaʻomia le faʻapipiʻiina o se faʻataʻitaʻiga lona lua o le faʻasologa o talosaga 2.0.0lea o le a faafou le database i v2.
Laasaga:
o se fa'ata'ita'iga fou o le fa'asologa o talosaga o lo'o fa'apipi'iina 2.0.0lea e faafou ai le database i v2
i le taimi nei o nisi o talosaga sa fa'agasolo e ala i fa'ata'ita'iga 1.0.0
na manuia le fa'afouga ma e tele au fa'ata'ita'iga o lo'o fa'agasolo ai le fa'asologa o talosaga 1.0.0 ma isi fa'aliliuga 2.0.0. E feso'ota'i tagata uma ma fa'amaumauga i totonu v2
lomiga 1.0.0 e le fa'aogaina le koluma fa'aigoa i totonu o fa'amaumauga, ae o le fa'aliliuga 2.0.0 fa'aoga. Latou te le faalavelave le tasi i le isi, ma e le tatau ona i ai ni mea sese.
lomiga 2.0.0 teuina faʻamaumauga i le koluma tuai ma fou, faʻamautinoa le fetaui i tua
E taua. Afai ei ai ni au fesili e faitau ai mea e faʻatatau i tau mai le koluma tuai/fou, e tatau ona e manatua o loʻo i ai nei au faʻalua faʻatau (e foliga mai o loʻo latou faimalaga pea). Mo se faʻataʻitaʻiga, afai e te manaʻo e faitau le numera o tagata faʻaoga o latou igoa faʻauʻu (po o le a lava le igoa o le koluma) na amata i le mataitusi A, se'ia mae'a le femalaga'iga (old → new koluma) atonu e iai au fa'amatalaga e le fetaui pe a e fesiligia se koluma fou.
Toe fa'afo'i le talosaga
O lea la ua i ai le matou app version 2.0.0 ma fa'amaumauga i totonu v2.
Laasaga:
toe fa'afo'i lau talosaga ile fa'aliliuga 1.0.0.
lomiga 1.0.0 e le fa'aogaina se koluma i totonu o fa'amaumauga surname, o lea e tatau ona manuia le rollback
Suiga DB
O le database o lo'o i ai se koluma e igoa last_name.
Fa'amatalaga puna mai lele:
CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);
insert into PERSON (first_name, last_name) values ('Dave', 'Syer');
Fa'aopoopo tusitusiga surname.
Faalogo Manatua e le mafai ona e fa'aopoopoina ni fa'agata NOT NULL i le koluma o lo'o e fa'aopoopoina. Afai e te toe faʻafoʻi le JAR, o le a leai se manatu o le lomiga tuai e uiga i le koluma faaopoopo ma o le a otometi lava ona seti i le NULL. Afai ei ai se faʻagata, o le talosaga tuai o le a malepe.
-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name
Suiga code
Matou te teuina faʻamaumauga e pei o last_name, ma i totonu surname. I le taimi lava e tasi matou te faitau mai ai last_name, talu ai o lenei koluma e sili ona talafeagai. A'o fa'agasolo le fa'atinoina, o nisi talosaga atonu na fa'agasolo e se fa'ata'ita'iga e le'i fa'afouina.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Reading from the new column if it's set. If not the from the old one.
*
* When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
* the surname column is not up to date (during the migration process lastName could have been updated).
* In this case one can run yet another migration script after all applications have been deployed in the
* new version to ensure that the surname field is updated.
*
* However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
* have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
* would be reading from lastName, then we would have very old data (since not a single datum was inserted
* to lastName in version 3.0.0).
*/
public String getSurname() {
return this.surname != null ? this.surname : this.lastName;
}
/**
* Storing both FIRST_NAME and SURNAME entries
*/
public void setSurname(String surname) {
this.lastName = surname;
this.surname = surname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
+ "]";
}
}
Laasaga 3: Aveese le igoa mulimuli mai le code
Fa'asologa o polokalame: 3.0.0
DB version:v3
manatu
Manatua per .: E foliga mai, i le uluaʻi tusiga na kopi sese ai e le tusitala le tusitusiga o lenei poloka mai le laasaga 2. I lenei laasaga, e tatau ona faia suiga i le numera o talosaga e faʻatatau i le aveesea o galuega e faʻaogaina ai le koluma. last_name.
E ala i le fa'aopoopoina o se koluma fou ma le kopiina o mea o lo'o i totonu, na matou faia ai suiga i tua e fetaui ma fa'amaumauga. E le gata i lea, afai tatou te toe fa'afo'i le JAR pe fai se JAR tuai o lo'o tamo'e, e le malepe i le taimi o le fa'atinoga.
Toe fa'afo'i le talosaga
I le taimi nei o loʻo i ai a matou faʻamatalaga app 3.0.0 ma fa'amaumauga v3. Fa'aliliuga 3.0.0 e le fa'asaoina fa'amaumauga i last_name. O lona uiga o totonu surname o fa'amatalaga sili ona lata mai o lo'o teuina.
Laasaga:
toe fa'afo'i lau talosaga ile fa'aliliuga 2.0.0.
lomiga 2.0.0 fa'aoga ma last_name и surname.
lomiga 2.0.0 o le a ave surname, afai e le o se mea, a leai -last_name
Suiga fa'amaumauga
E leai ni suiga fa'avae i totonu o fa'amaumauga. O le faʻasologa o loʻo i lalo o loʻo faʻatinoina e faʻatino ai le femalagaiga mulimuli o faʻamaumauga tuai:
-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;
-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;
Suiga code
Manatua per .: O le faʻamatalaga o lenei poloka na kopiina sese foi e le tusitala mai le laasaga 2. E tusa ai ma le manatu o le tusiga, o suiga i le code i lenei laasaga e tatau ona faʻamoemoe e aveese mai ai elemene e galulue ma le koluma. last_name.
Matou te teuina faʻamaumauga e pei o last_name, ma i totonu surname. E le gata i lea, matou te faitau mai le koluma last_name, talu ai e sili ona talafeagai. A'o fa'agasolo le fa'agaioiga, o nisi talosaga e mafai ona fa'agasolo e se fa'ata'ita'iga e le'i fa'aleleia.
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.flyway;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String surname;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String lastname) {
this.surname = lastname;
}
@Override
public String toString() {
return "Person [firstName=" + this.firstName + ", surname=" + this.surname
+ "]";
}
}
Laasaga 4: Aveese le igoa mulimuli mai le faʻamaumauga
Fa'asologa o polokalame: 4.0.0
DB version: v4
manatu
Ona o le mea moni o le code version 3.0.0 e le'i fa'aogaina le koluma last_name, e leai se mea leaga e tupu i le taimi o le faʻasalaga pe a tatou toe foʻi i tua 3.0.0 ina ua uma ona aveese se koluma mai le database.
Fa'amaumauga o fa'atinoga
We will do it in the following way:
01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0
Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}
Starting app in version 2.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:
{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}
Killing app 1.0.0
Starting app in version 3.0.0
Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}
Killing app 2.0.0
Starting app in version 4.0.0
Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}
Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:
{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}
Suiga DB
Fuafua v3 na'o matou aveese le koluma last_name ma fa'aopoopo tapula'a o lo'o misi.
-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;
-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;
Suiga code
E leai ni suiga i le code.
iʻuga
Na manuia le matou fa'aogaina o se suiga o igoa koluma e le fetaui i tua e ala i le fa'atinoina o le tele o fa'agaioiga i tua. O lo'o i lalo se aotelega o gaioiga na faia:
fa'apipi'iina o fa'asologa o talosaga 1.0.0 с v1 fuafuaga fa'amaumauga (igoa koluma = last_name)
fa'apipi'iina o fa'asologa o talosaga 2.0.0, lea e teu ai faamatalaga i totonu last_name и surname. O le talosaga e faitau mai last_name. O lo'o iai le fa'amaumauga o fa'amaumauga v2o lo'o i ai koluma pei o last_name, ma surname. surname o se kopi o last_name. (FAAMANATU: o lenei koluma e le tatau ona i ai se faʻalavelave faʻafuaseʻi)
fa'apipi'iina o fa'asologa o talosaga 3.0.0, lea e na'o le teuina o fa'amaumauga i totonu surname ma faitau mai le igoa. Ae mo le database, o loʻo faʻataunuʻuina le femalagaiga mulimuli last_name в surname. Fa'agata fo'i LE FAʻAALIGA aveese mai last_name. O lo'o iai nei le fa'amaumauga v3
fa'apipi'iina o fa'asologa o talosaga 4.0.0 - e leai ni suiga e faia i le code. Fa'apipi'i fa'amaumauga v4, lea e aveesea last_name. O iinei e mafai ona e faʻaopoopoina soʻo se faʻalavelave misi i le database.
E ala i le mulimuli i lenei faiga, e mafai lava ona e toe fa'afo'i le tasi fa'asologa e aunoa ma le talepeina o fa'amaumauga/fa'aoga feso'ota'iga.
kote
O tulafono uma o loʻo faʻaaogaina i lenei tusiga o loʻo avanoa ile Github. Lalo ole fa'amatalaga fa'aopoopo.
Проекты
A maeʻa ona faʻapipiʻi le fale teu oloa, o le a e vaʻai i le fausaga o faila.
├── boot-flyway-v1 - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2 - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3 - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4 - 4.0.0 version of the app with v4 of the schema (app can be rolled back)
Tusitusiga
E mafai ona e fa'ata'ita'iina fa'amaumauga o lo'o fa'amatalaina i tusitusiga o lo'o i lalo, lea o le a fa'aalia ai suiga i tua-tutusa ma le le fetaui i le fa'amaumauga.
E vaai o le mataupu ma suiga talafeagai i tua, tamoe:
O faʻataʻitaʻiga uma e maua mai Spring Boot Sample Flyway.
E mafai ona e tilotilo i ai http://localhost:8080/flyway, o loʻo i ai se lisi o tusitusiga.
O lenei faʻataʻitaʻiga e aofia ai foi le H2 console (i http://localhost:8080/h2-console) ina ia mafai ona e vaʻai i le tulaga faʻamaumauga (default jdbc URL is jdbc:h2:mem:testdb).