Aspekt Spring Boot a Togglz

1. Prehľad

V tomto výučbe sa pozrieme na to, ako Togglz knižnicu je možné použiť s aplikáciou Spring Boot.

2. Togglz

The Togglz knižnica poskytuje implementáciu Prepína funkciu dizajnový vzor. Tento vzorec označuje mechanizmus, ktorý umožňuje na základe prepínania určovať počas behu aplikácie, či je určitá funkcia povolená alebo nie.

Zakázanie funkcie za behu programu môže byť užitočné v rôznych situáciách, ako je napríklad práca na novej funkcii, ktorá ešte nie je dokončená, chcieť povoliť prístup k funkcii iba podmnožine používateľov alebo spustiť testovanie A / B.

V nasledujúcich častiach vytvoríme aspekt, ktorý zachytáva metódy s anotáciou, ktorá poskytuje názov prvku, a podľa toho, či je alebo nie je funkcia povolená, určíme, či bude pokračovať v vykonávaní metód.

3. Závislosti Maven

Spolu so závislosťami Spring Boot, Togglz knižnica poskytuje jar Spring Boot Starter:

 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 

Najnovšie verzie togglz-spring-boot-starter, togglz-spring-security, spring-boot-starter-web, spring-boot-starter-data-jpa, spring-boot-starter-test, h2 si môžete stiahnuť z Maven Centrálne.

4. Konfigurácia Togglz

The togglz-spring-boot-starter knižnica obsahuje automatickú konfiguráciu pre vytvorenie potrebných bôbov ako napr FeatureManager. Jedinou fazuľou, ktorú musíme poskytnúť, je featureProvider fazuľa.

Najskôr vytvorme enumeráciu, ktorá implementuje Funkcia rozhranie a obsahuje zoznam názvov funkcií:

public enum MyFeatures implementuje funkciu {@Label („funkcia správy zamestnancov“) EMPLOYEE_MANAGEMENT_FEATURE; public boolean isActive () {return FeatureContext.getFeatureManager (). isActive (this); }}

Výpočet tiež definuje metódu nazvanú isActive () ktorá overuje, či je povolená určitá funkcia.

Potom môžeme definovať fazuľu typu EnumBasedFeatureProvider v konfiguračnej triede Spring Boot:

@Configuration public class ToggleConfiguration {@Bean public FeatureProvider featureProvider () {return new EnumBasedFeatureProvider (MyFeatures.class); }}

5. Vytvorenie Aspektu

Ďalej vytvoríme aspekt, ktorý zachytáva zvyk AssociatedFeature anotácia a skontroluje funkciu uvedenú v parametri anotácie, aby určila, či je alebo nie je aktívna:

@Aspect @Component verejná trieda FeaturesAspect {private static final Logger LOG = Logger.getLogger (FeaturesAspect.class); @Around ("@within (featureAssociation) || @annotation (featureAssociation)") public Object checkAspect (ProceedingJoinPoint joinPoint, FeatureAssociation featureAssociation) hodí Throwable {if (featureAssociation.value (). IsActive ()) {return joinPoint.proceed () ; } else {LOG.info ("Funkcia" + featureAssociation.value (). name () + "nie je povolená!"); návrat null; }}}

Definujme tiež vlastnú anotáciu s názvom FeatureAssociation to bude mať hodnota () parameter typu MyFeatures enum:

@Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.METHOD, ElementType.TYPE}) public @interface FeatureAssociation {MyFeatures value (); }

Ak je funkcia aktívna, aspekt bude pokračovať vo vykonávaní metódy; ak nie, zaznamená správu bez spustenia kódu metódy.

6. Aktivácia funkcií

Funkcia v Togglz môže byť aktívny alebo neaktívny. Toto správanie je riadené pomocou povolené príznak a voliteľne aktivačná stratégia.

Ak chcete nastaviť povolené príznak na true, môžeme použiť @EnabledByDefault anotácia k definícii hodnoty enum.

Togglz Knižnica tiež poskytuje rôzne aktivačné stratégie, pomocou ktorých je možné určiť, či je funkcia povolená na základe určitých podmienok.

V našom príklade použijeme znak SystemPropertyActivationStrategy pre našu EMPLOYEE_MANAGEMENT_FEATURE, ktorá hodnotí stav prvku na základe hodnoty vlastnosti systému. Požadovaný názov vlastnosti a hodnotu je možné určiť pomocou @ActivationParameter anotácia:

public enum MyFeatures implements Feature {@Label ("Employee Management Feature") @EnabledByDefault @DefaultActivationStrategy (id = SystemPropertyActivationStrategy.ID, parameters = {@ActivationParameter (name = SystemPropertyActivationStrategy.PARAM_PROPERTY_NAME, value = @ "User") name = SystemPropertyActivationStrategy.PARAM_PROPERTY_VALUE, value = "true")}) EMPLOYEE_MANAGEMENT_FEATURE; // ...}

Nastavili sme našu funkciu tak, aby bola povolená, iba ak zamestnanec.funkcia vlastnosť má hodnotu pravda.

Ďalšie typy aktivačných stratégií poskytované Togglz knižnice sú:

  • UsernameActivationStrategy - umožňuje, aby bola funkcia aktívna pre zadaný zoznam používateľov
  • UserRoleActivationStrategy - rola aktuálneho používateľa sa používa na zistenie stavu prvku
  • ReleaseDateActivationStrategy - automaticky aktivuje funkciu v určitý dátum a čas
  • GradualActivationStrategy - povolí funkciu pre určené percento používateľov
  • ScriptEngineActivationStrategy - umožňuje použitie vlastného skriptu napísaného v jazyku podporovanom ScriptEngine JVM určiť, či je funkcia aktívna alebo nie
  • ServerIpActivationStrategy - funkcia je povolená na základe adries IP servera

7. Testovanie aspektu

7.1. Príklad aplikácie

Aby sme videli náš aspekt v akcii, vytvorme si jednoduchý príklad, ktorý obsahuje funkciu správy zamestnancov organizácie.

Pretože bude táto funkcia vyvíjaná, môžeme pridávať metódy a triedy anotované s našou @AssociatedFeature anotácia s hodnotou EMPLOYEE_MANAGEMENT_FEATURE. To zaisťuje, že budú prístupné, iba ak je funkcia aktívna.

Najskôr definujme Zamestnanec trieda entít a úložisko založené na Spring Data:

@Entity public class Employee {@Id private long id; dvojitý súkromný plat; // štandardný konštruktor, getre, setre}
verejné rozhranie EmployeeRepository rozširuje CrudRepository {}

Ďalej pridajme EmployeeService metódou zvyšovania platu zamestnanca. Pridáme @AssociatedFeature anotácia metódy s parametrom EMPLOYEE_MANAGEMENT_FEATURE:

@ Verejná trieda služieb SalaryService {@Autowired EmployeeRepository employeeRepository; @FeatureAssociation (value = MyFeatures.EMPLOYEE_MANAGEMENT_FEATURE) public void increaseSalary (dlhé id) {Employee employee = employeeRepository.findById (id) .orElse (null); employee.setSalary (employee.getSalary () + employee.getSalary () * 0,1); employeeRepository.save (zamestnanec); }} 

Metóda sa bude volať z / zvýšiťMzda koncový bod, ktorý budeme volať na testovanie:

@Controller verejná trieda SalaryController {@Autowired SalaryService platService; @PostMapping ("/ increaseSalary") @ResponseBody public void increaseSalary (@RequestParam dlhé ID) {platService.increaseSalary (id); }}

7.2. JUnit Test

Najskôr pridajme test, v ktorom po nastavení voláme naše POST mapovanie zamestnanec.funkcia majetok do nepravdivé. V takom prípade by táto funkcia nemala byť aktívna a hodnota platu zamestnanca by sa nemala meniť:

@ Test public void givenFeaturePropertyFalse_whenIncreaseSalary_thenNoIncrease () vyvolá Výnimku {Zamestnanec emp = nový Zamestnanec (1, 2000); employeeRepository.save (emp); System.setProperty ("employee.feature", "false"); mockMvc.perform (post ("/ increaseSalary") .param ("id", emp.getId () + "")) .andExpect (status (). je (200)); emp = employeeRepository.findOne (1L); assertEquals ("nesprávny plat", 2000, emp.getSalary (), 0,5); }

Ďalej pridajme test, kde hovor vykonáme po nastavení vlastnosti na pravda. V takom prípade by sa hodnota platu mala zvýšiť:

@ Test public void givenFeaturePropertyTrue_whenIncreaseSalary_thenIncrease () vyvolá Výnimku {Zamestnanec emp = nový Zamestnanec (1, 2000); employeeRepository.save (emp); System.setProperty ("employee.feature", "true"); mockMvc.perform (post ("/ increaseSalary") .param ("id", emp.getId () + "")) .andExpect (status (). je (200)); emp = employeeRepository.findById (1L) .orElse (null); assertEquals ("nesprávny plat", 2200, emp.getSalary (), 0,5); }

8. Závery

V tomto tutoriáli sme si ukázali, ako sa môžeme integrovať Togglz knižnica s Spring Boot pomocou aspektu.

Celý zdrojový kód príkladu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found