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.