Tavaszi csizma és Togglz szempont
1. Áttekintés
Ebben az oktatóanyagban megnézzük, hogyan Togglz könyvtár egy Spring Boot alkalmazással használható.
2. Togglz
A Togglz könyvtár biztosítja a Feature Toggles tervezési minta. Ez a minta arra utal, hogy van egy olyan mechanizmusunk, amely lehetővé teszi annak meghatározását az alkalmazás futása alatt, hogy egy bizonyos funkció engedélyezve van-e egy váltás alapján.
A szolgáltatás futás közbeni letiltása számos helyzetben hasznos lehet, például egy új, még nem teljes funkció használatakor, egy szolgáltatáshoz csak a felhasználók egy részének engedélyezéséhez, vagy A / B tesztelés futtatásához.
A következő szakaszokban létrehozunk egy szempontot, amely elfogja a módszereket egy olyan jegyzettel, amely megadja a szolgáltatás nevét, és meghatározzuk, hogy folytatjuk-e a módszerek végrehajtását attól függően, hogy a szolgáltatás engedélyezve van-e vagy sem.
3. Maven-függőségek
A Spring Boot függőségekkel együtt a Togglz könyvtárban található egy Spring Boot Starter jar:
org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE org.togglz togglz-spring-boot-starter 2.4.1 org.togglz togglz-spring-security 2.4.1 org.springframework.boot spring-boot- starter-web org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-test com.h2database h2 1.4.194
A togglz-spring-boot-starter, togglz-spring-security, spring-boot-starter-web, spring-boot-starter-data-jpa, spring-boot-starter-test, h2 legújabb verziói letölthetők a Maven oldaláról Központi.
4. Togglz konfiguráció
A togglz-spring-boot-starter könyvtár tartalmazza az automatikus konfigurációt a szükséges babok létrehozásához, mint pl FeatureManager. Az egyetlen bab, amelyet meg kell adnunk, a featureProvider bab.
Először hozzunk létre egy felsorolást, amely végrehajtja a Funkció felületet, és tartalmazza a szolgáltatásnevek listáját:
public enum A MyFeatures megvalósítja a {@Label ("Alkalmazottkezelési szolgáltatás") funkciót EMPLOYEE_MANAGEMENT_FEATURE; nyilvános logikai isActive () {return FeatureContext.getFeatureManager (). isActive (this); }}
A felsorolás meghatározza az úgynevezett módszert is aktív() amely ellenőrzi, hogy egy bizonyos funkció engedélyezve van-e.
Ezután definiálhatunk egy típusú babot EnumBasedFeatureProvider Spring Boot konfigurációs osztályban:
@Configuration public class ToggleConfiguration {@Bean public FeatureProvider featureProvider () {return new EnumBasedFeatureProvider (MyFeatures.class); }}
5. Az aspektus létrehozása
Ezután létrehozunk egy aspektust, amely elfog egy szokást AssociatedFeature kommentár és ellenőrzi az annotációs paraméterben biztosított szolgáltatást, hogy megállapítsa, aktív-e vagy sem:
@Aspect @Component nyilvános osztály FeaturesAspect {private static final Logger LOG = Logger.getLogger (FeaturesAspect.class); @Around ("@within (featureAssociation) || @annotation (featureAssociation)") public Object checkAspect (ProceedingJoinPoint joinPoint, FeatureAssociation featureAssociation) dobható {if (featureAssociation.value (). IsActive ()) {return joinPoint.proceed () ; } else {LOG.info ("Feature" + featureAssociation.value (). name () + "nincs engedélyezve!"); return null; }}}
Határozzuk meg az úgynevezett egyéni kommentárokat is FeatureAssociation hogy lesz egy érték() típusú paraméter MyFeatures enum:
@Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.METHOD, ElementType.TYPE}) public @interface FeatureAssociation {MyFeatures value (); }
Ha a szolgáltatás aktív, akkor az aspektus folytatja a módszer végrehajtását; ha nem, akkor a metódus futtatása nélkül naplóz egy üzenetet.
6. Funkció aktiválása
Egy szolgáltatás a Togglz lehet aktív vagy inaktív. Ezt a viselkedést egy engedélyezve jelző és opcionálisan aktiválási stratégia.
A engedélyezve zászló igaz, használhatjuk a @EnabledByDefault kommentár az enum érték meghatározásához.
Togglz A könyvtár különféle aktiválási stratégiákat is kínál, amelyek segítségével meghatározható, hogy egy szolgáltatás engedélyezve van-e egy bizonyos feltétel alapján.
Példánkban használjuk a SystemPropertyActivationStrategy az EMPLOYEE_MANAGEMENT_FEATURE elemünkhöz, amely egy rendszer tulajdonságának értéke alapján értékeli a szolgáltatás állapotát. A szükséges tulajdonságnév és érték a @ActivationParameter kommentár:
public enum A MyFeatures a (z) {@Label ("Alkalmazotti menedzsment szolgáltatás") @EnabledByDefault @DefaultActivationStrategy (id = SystemPropertyActivationStrategy.ID, parametri = {@ActivationParameter (name = SystemPropertyActivationStrategy.PARAM_PROPERTY_NAME), FeatureAptureParameter_PROPERTY_NAME) szolgáltatást hajtja végre. név = SystemPropertyActivationStrategy.PARAM_PROPERTY_VALUE, value = "true")}) EMPLOYEE_MANAGEMENT_FEATURE; // ...}
Funkciónkat csak akkor engedélyeztük engedélyezve, ha a alkalmazott.jellemző tulajdonság értéke van igaz.
Egyéb típusú aktivációs stratégiák, amelyeket a Togglz könyvtárak:
- FelhasználónévAktiválásStrategy - lehetővé teszi, hogy a szolgáltatás egy meghatározott felhasználói listán aktív legyen
- UserRoleActivationStrategy - az aktuális felhasználói szerepkörrel lehet meghatározni egy szolgáltatás állapotát
- ReleaseDateActivationStrategy - automatikusan aktivál egy funkciót egy bizonyos dátumon és időpontban
- GradualActivationStrategy - engedélyez egy funkciót a felhasználók meghatározott százalékában
- ScriptEngineActivationStrategy - lehetővé teszi az egyéni szkript használatát, amelyet a ScriptEngine meghatározza, hogy egy szolgáltatás aktív-e vagy sem
- ServerIpActivationStrategy - a szolgáltatás engedélyezve van a kiszolgáló IP-címei alapján
7. A szempont tesztelése
7.1. Példa alkalmazásra
Ahhoz, hogy az aspektusunkat működés közben lássuk, készítsünk egy egyszerű példát, amely tartalmaz egy funkciót a szervezet alkalmazottainak kezeléséhez.
Mivel ezt a funkciót fejleszteni fogjuk, hozzáadhatunk metódusokat és osztályokat a mi kommentárokkal @AssociatedFeature kommentár EMPLOYEE_MANAGEMENT_FEATURE értékkel. Ez biztosítja, hogy csak akkor lesznek hozzáférhetők, ha a szolgáltatás aktív.
Először definiáljunk egy Munkavállaló entitásosztály és adattár a Spring Data alapján:
@Entity public class Employee {@Id private long id; magán kettős fizetés; // szabványos kivitelező, mérőeszközök, beállítók}
nyilvános felület EmployeeRepository kiterjeszti a CrudRepository {}
Ezután adjunk hozzá egy EmployeeService a munkavállaló fizetésének emelésére szolgáló módszerrel. Hozzáadjuk a @AssociatedFeature paraméter metódusának kommentárja EMPLOYEE_MANAGEMENT_FEATURE:
@Service public class SalaryService {@Autowired EmployeeRepository workerRepository; @FeatureAssociation (value = MyFeatures.EMPLOYEE_MANAGEMENT_FEATURE) public void growthSalary (long id) {Employee alkalmazott = alkalmazottRepository.findById (id) .orElse (null); worker.setSalary (alkalmazott.getSalary () + alkalmazott.getSalary () * 0,1); workerRepository.save (alkalmazott); }}
A metódust egy / növekedésFizetés tesztelésre hívott végpont:
@Controller public class SalaryController {@Autowired SalaryService payService; @PostMapping ("/ growthSalary") @ResponseBody public void growthSalary (@RequestParam long id) {fizetésService.increaseSalary (id); }}
7.2. JUnit teszt
Először adjunk hozzá egy tesztet, amelyben a POST leképezésünket hívjuk meg a alkalmazott.jellemző tulajdonhoz hamis. Ebben az esetben a funkciónak nem szabad aktívnak lennie, és a munkavállaló fizetésének értéke nem változhat:
@Test public void givenFeaturePropertyFalse_whenIncreaseSalary_thenNoIncrease () dobja a Kivételt {Employee emp = new Employee (1, 2000); workerRepository.save (emp); System.setProperty ("alkalmazott.jellemző", "hamis"); mockMvc.perform (post ("/ növelésSalary") .param ("id", emp.getId () + "")) .andExpect (status (). is (200)); emp = alkalmazottRepository.findOne (1L); assertEquals ("helytelen fizetés", 2000, emp.getSalary (), 0,5); }
Ezután adjunk hozzá egy tesztet, ahol a tulajdonság beállítása után elvégezzük a hívást igaz. Ebben az esetben a fizetés értékét növelni kell:
@Test public void givenFeaturePropertyTrue_whenIncreaseSalary_thenIncrease () dobja a Kivételt {Employee emp = new Employee (2000, 1); workerRepository.save (emp); System.setProperty ("alkalmazott.jellemző", "igaz"); mockMvc.perform (post ("/ növelésSalary") .param ("id", emp.getId () + "")) .andExpect (status (). is (200)); emp = alkalmazottRepository.findById (1L) .orElse (null); assertEquals ("helytelen fizetés", 2200, emp.getSalary (), 0,5); }
8. Következtetések
Ebben az oktatóanyagban bemutattuk, hogyan lehet integrálni Togglz könyvtár a Spring Boot segítségével egy szempont használatával.
A példa teljes forráskódja megtalálható a GitHub oldalon.