Značajke zastave s proljećem

1. Pregled

U ovom ćemo članku ukratko definirati značajke značajki i predložiti pouzdan i pragmatičan pristup za njihovu primjenu u Spring Boot aplikacijama. Zatim ćemo istražiti sofisticiranije iteracije koristeći prednosti različitih značajki Spring Boot.

Razgovarat ćemo o različitim scenarijima koji mogu zahtijevati označavanje značajki i razgovarat ćemo o mogućim rješenjima. To ćemo učiniti pomoću primjera aplikacije Bitcoin Miner.

2. Oznake značajki

Oznake značajki - koje se ponekad nazivaju prebacivanjima značajki - mehanizam su koji nam omogućava da omogućimo ili onemogućimo određenu funkcionalnost naše aplikacije bez potrebe za izmjenom koda ili, u idealnom slučaju, ponovnom rasporedu naše aplikacije.

Ovisno o dinamici koju zahtijeva određena zastava značajke, možda ćemo ih trebati konfigurirati globalno, po instanci aplikacije ili detaljnije - možda po korisniku ili zahtjevu.

Kao i u mnogim situacijama u softverskom inženjerstvu, važno je pokušati koristiti najjednostavniji pristup koji rješava problem bez dodavanja nepotrebne složenosti.

Oznake značajki moćan su alat koji, kada se pametno koristi, može našem sustavu donijeti pouzdanost i stabilnost. Međutim, kada ih se zloupotrijebi ili nedovoljno održava, mogu brzo postati izvori složenosti i glavobolje.

Postoje mnogi scenariji u kojima bi zastavice značajki mogle dobro doći:

Razvoj zasnovan na trupu i netrivijalne značajke

U razvoju temeljenom na trunk-u, posebno kada se želimo nastaviti često integrirati, mogli bismo se naći nespremni za objavljivanje određenog dijela funkcionalnosti. Oznake značajki mogu nam dobro doći kako bi nam omogućile da nastavimo s objavljivanjem, a da promjene ne učinimo dostupnima do završetka.

Konfiguracija specifična za okoliš

Mogli bismo se naći kao da nam je potrebna određena funkcionalnost za resetiranje našeg DB-a za E2E okruženje za testiranje.

Alternativno, možda ćemo morati koristiti drugačiju sigurnosnu konfiguraciju za neproizvodna okruženja od one koja se koristi u proizvodnom okruženju.

Stoga bismo mogli iskoristiti zastavice značajki za prebacivanje ispravnih postavki u pravom okruženju.

A / B testiranje

Oslobađanje više rješenja za isti problem i mjerenje utjecaja uvjerljiva je tehnika koju bismo mogli primijeniti pomoću zastavica značajki.

Kanarski puštajući

Prilikom uvođenja novih značajki, mogli bismo se odlučiti za to postupno, počevši od male grupe korisnika i proširujući njegovo usvajanje dok provjeravamo ispravnost njegovog ponašanja. Zastave značajki omogućuju nam da to postignemo.

U sljedećim odjeljcima pokušat ćemo pružiti praktičan pristup rješavanju gore spomenutih scenarija.

Razdvojimo različite strategije za obilježavanje, počevši od najjednostavnijeg scenarija, a zatim prijeđite na zrnatiju i složeniju postavku.

3. Oznake značajki na razini aplikacije

Ako se moramo pozabaviti bilo kojim od prva dva slučaja korištenja, zastavice značajki na razini aplikacije jednostavan su način da se stvari pokrenu.

Jednostavna zastava značajke obično uključuje svojstvo i neku konfiguraciju na temelju vrijednosti tog svojstva.

3.1. Oznake značajki pomoću proljetnih profila

U proljeće možemo iskoristiti profile. Prikladno, profili nam omogućuju selektivno konfiguriranje određenih grahova. S nekoliko konstrukcija oko njih, možemo brzo stvoriti jednostavno i elegantno rješenje za zastavice značajki na razini aplikacije.

Pretvarajmo se da gradimo BitCoin rudarski sustav. Naš se softver već proizvodi, a mi imamo zadatak stvoriti eksperimentalni, poboljšani algoritam za rudarstvo.

U našem JavaConfig mogli bismo profilirati naše komponente:

@Configuration javna klasa ProfiledMiningConfig {@Bean @Profile ("! Experimental-rudar") javni BitcoinMiner defaultMiner () {return new DefaultBitcoinMiner (); } @Bean @Profile ("Experimental-rudar") javni BitcoinMiner ExperimentalMiner () {vratiti novi ExperimentalBitcoinMiner (); }}

Zatim, s prethodnom konfiguracijom, jednostavno moramo uključiti svoj profil da bismo se prijavili za našu novu funkcionalnost. Postoji mnoštvo načina za konfiguriranje naše aplikacije općenito, a posebno za omogućavanje profila. Isto tako, postoje uslužni programi za testiranje koji će nam olakšati život.

Sve dok je naš sustav dovoljno jednostavan, tada bismo mogli stvoriti konfiguraciju zasnovanu na okruženju kako bismo odredili koje zastavice značajki ćemo primijeniti, a koje zanemariti.

Zamislimo da imamo novo korisničko sučelje temeljeno na karticama umjesto na tablicama, zajedno s prethodnim eksperimentalnim minerom.

Željeli bismo omogućiti obje značajke u našem okruženju prihvaćanja (UAT). Mogli bismo stvoriti prijava-uat.yml datoteka:

proljeće: profili: uključuju: eksperimentalni rudar, ui-kartice # Ovdje više konfiguracije

S prethodnom datotekom na mjestu, samo bismo trebali omogućiti UAT profil u UAT okruženju da bismo dobili željeni skup značajki.

Također je važno razumjeti kako to iskoristiti proljeće.profili.uključuju. U usporedbi sa spring.profiles.active, prva nam omogućuje dodavanje profila na aditivan način.

U našem slučaju želimo uat profil također uključuje eksperimentalne rudare i ui-kartice.

3.2. Oznake značajki pomoću prilagođenih svojstava

Profili su sjajan i jednostavan način za obavljanje posla. Međutim, možda ćemo trebati profile za druge svrhe. Ili bismo možda htjeli izgraditi strukturiraniju infrastrukturu zastavica značajki.

Za ove scenarije prilagođena svojstva mogu biti poželjna opcija.

Prepišimo naš prethodni primjer koristeći @ConditionalOnProperty i naš prostor imena:

@Configuration javna klasa CustomPropsMiningConfig {@Bean @ConditionalOnProperty (name = "features.miner.experimental", matchIfMissing = true) javni BitcoinMiner defaultMiner () {return new DefaultBitcoinMiner (); } @Bean @ConditionalOnProperty (name = "features.miner.experimental") javni BitcoinMiner ExperimentalMiner () {vratiti novi ExperimentalBitcoinMiner (); }}

Prethodni se primjer nadovezuje na uvjetnu konfiguraciju Spring Boota i konfigurira jednu ili drugu komponentu, ovisno o tome je li svojstvo postavljeno na pravi ili lažno (ili uopće izostavljeno).

Rezultat je vrlo sličan onome iz 3.1, ali sada imamo svoj prostor imena. Posedovanje našeg prostora imena omogućuje nam stvaranje značajnih YAML / svojstava datoteka:

# [...] Neke značajke konfiguracije Spring: rudar: eksperimentalno: istina ui: cards: true # [...] Ostale značajke značajki

Također, ova nova postavka omogućuje nam dodavanje zastavica značajki - u našem slučaju, pomoću značajke prefiks.

To bi se moglo činiti kao mali detalj, ali kako naša aplikacija raste, a složenost raste, ova jednostavna iteracija pomoći će nam da zastave naših značajki držimo pod nadzorom.

Razgovarajmo o drugim prednostima ovog pristupa.

3.3. Korištenje @ConfigurationProperties

Čim dobijemo prefiksni skup svojstava, možemo stvoriti POJO ukrašen @ConfigurationProperties da bismo dobili programsku ručku u našem kodu.

Slijedeći naš kontinuirani primjer:

@Component @ConfigurationProperties (prefix = "features") javna klasa ConfigProperties {private MinerProperties miner; privatne UIPproperties ui; // standardni getteri i postavljači javna statička klasa MinerProperties {privatni logički eksperimentalni; // standardni getteri i postavljači} javna statička klasa UIProperties {privatne logičke kartice; // standardni geteri i postavljači}}

Stavljanjem stanja naših zastava značajki u kohezivnu jedinicu, otvaramo nove mogućnosti, omogućujući nam da te podatke lako izložimo drugim dijelovima našeg sustava, poput korisničkog sučelja, ili nizvodnim sustavima.

3.4. Izlaganje konfiguracije značajke

Naš sustav za iskopavanje bitcoina dobio je nadogradnju korisničkog sučelja koja još nije u potpunosti spremna. Iz tog razloga odlučili smo ga označiti. Možda imamo aplikaciju na jednoj stranici koja koristi React, Angular ili Vue.

Bez obzira na tehnologiju, moramo znati koje su značajke omogućene kako bismo u skladu s tim mogli prikazati našu stranicu.

Stvorimo jednostavnu krajnju točku koja će služiti našoj konfiguraciji tako da naše korisničko sučelje može upitati pozadinu kada je to potrebno:

@RestController javna klasa FeaturesConfigController {privatna svojstva ConfigProperties; // konstruktor @GetMapping ("/ feature-flags") javni ConfigProperties getProperties () {return svojstva; }}

Možda postoje sofisticiraniji načini posluživanja ovih podataka, poput stvaranja prilagođenih krajnjih točaka aktuatora. Ali radi ovog vodiča, krajnja točka kontrolera osjeća se kao dovoljno dobro rješenje.

3.5. Održavanje kampa čistim

Iako bi moglo zvučati očito, nakon što zamišljeno implementiramo naše značajke, podjednako je važno ostati disciplinirani u njihovom rješavanju nakon što više ne trebaju.

Oznake značajki za prvi slučaj - razvoj temeljen na trupku i netrivijalne značajke - obično su kratkog vijeka. To znači da ćemo morati osigurati da naša ConfigProperties, naša Java konfiguracija i naša YAML datoteke ostaju čiste i ažurne.

4. Više granuliranih zastavica

Ponekad se nađemo u složenijim scenarijima. Za A / B testiranje ili puštanje kanarinaca, naš prethodni pristup jednostavno nije dovoljan.

Da bismo zastavice značajki dobili na detaljnijoj razini, možda ćemo trebati stvoriti naše rješenje. To bi moglo uključivati ​​prilagođavanje našeg korisničkog entiteta tako da uključuje informacije specifične za značajku ili možda proširivanje našeg web okvira.

Međutim, onečišćenje naših korisnika zastavicama značajki možda neće biti privlačna ideja za svakoga, a postoje i druga rješenja.

Kao alternativu mogli bismo iskoristiti neke ugrađene alate poput Togglza. Ovaj alat dodaje određenu složenost, ali nudi lijepo rješenje i pruža prvoklasnu integraciju s Spring Bootom.

Togglz podržava različite strategije aktivacije:

  1. Korisničko ime: Zastave povezane s određenim korisnicima
  2. Postupno uvođenje: Omogućene oznake za postotak korisničke baze. To je korisno za Canary izdanja, na primjer, kada želimo provjeriti ponašanje naših značajki
  3. Datum izlaska: Mogli bismo zakazati omogućavanje zastavica u određeni datum i vrijeme. To bi moglo biti korisno za predstavljanje proizvoda, koordinirano izdanje ili ponude i popuste
  4. IP klijenta: Označene značajke na temelju IP-a klijenata. Oni bi mogli dobro doći prilikom primjene određene konfiguracije na određene kupce, s obzirom na to da imaju statičke IP adrese
  5. IP poslužitelja: U ovom se slučaju IP poslužitelja koristi za određivanje treba li značajku omogućiti ili ne. Ovo bi moglo biti korisno i za puštanje kanarinaca, s malo drugačijim pristupom od postupnog uvođenja - kao kad želimo procijeniti učinak izvedbe u našim slučajevima
  6. ScriptEngine: Mogli bismo omogućiti zastavice značajki na temelju proizvoljnih skripti. Ovo je vjerojatno najfleksibilnija opcija
  7. Svojstva sustava: Mogli bismo postaviti određena svojstva sustava kako bismo odredili stanje zastave značajke. To bi bilo prilično slično onome što smo postigli svojim najneposrednijim pristupom

5. Sažetak

U ovom smo članku imali priliku razgovarati o značajkama zastava. Uz to, razgovarali smo o tome kako nam Spring može pomoći da postignemo neke od ovih funkcija bez dodavanja novih knjižnica.

Počeli smo s definiranjem kako nam ovaj obrazac može pomoći u nekoliko uobičajenih slučajeva upotrebe.

Dalje, izgradili smo nekoliko jednostavnih rješenja koristeći out-of-the-box alate Spring i Spring Boot. Uz to smo smislili jednostavan, ali moćan konstrukt za označavanje značajki.

Dolje smo usporedili nekoliko alternativa. Prelazak s jednostavnijeg i manje fleksibilnog rješenja na sofisticiraniji, iako složeniji obrazac.

Na kraju smo ukratko dali nekoliko smjernica za izgradnju robusnijih rješenja. To je korisno kada trebamo viši stupanj granularnosti.