מגף האביב והיבט Togglz

1. סקירה כללית

במדריך זה, אנו נסתכל כיצד טוגגלז ניתן להשתמש בספרייה עם יישום Spring Boot.

2. טוגגלז

ה טוגגלז הספרייה מספקת יישום של תכונה מתחלפת דפוס עיצוב. דפוס זה מתייחס לכך שיש מנגנון המאפשר לקבוע במהלך זמן הריצה של יישום אם תכונה מסוימת מופעלת או לא מבוססת על מתג.

השבתה של תכונה בזמן ריצה עשויה להיות שימושית במגוון מצבים כמו עבודה על תכונה חדשה שעדיין לא הושלמה, רצון לאפשר גישה לתכונה רק לקבוצת משנה של משתמשים או להריץ בדיקות A / B.

בחלקים הבאים ניצור היבט המיירט שיטות עם ביאור המספק שם תכונה, ונקבע אם להמשיך לבצע את השיטות תלוי אם התכונה מופעלת או לא.

3. תלות Maven

יחד עם תלות האביב של האביב, ה- טוגגלז הספרייה מספקת צנצנת Starter Spring Spring:

 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 

את הגרסאות העדכניות ביותר של togglz-spring-boot-starter, togglz-spring-security, spring-boot-starter-web, spring-boot-starter-data-jpa, spring-boot-starter-test, h2 ניתן להוריד מ Maven מֶרכָּזִי.

4. תצורת Togglz

ה togglz-spring-boot-starter הספרייה מכילה תצורה אוטומטית ליצירת השעועית הדרושה כגון FeatureManager. השעועית היחידה שאנחנו צריכים לספק היא תכונה ספקית אפונה.

ראשית, בואו ליצור ספירה שמיישמת את תכונה ממשק ומכיל רשימה של שמות תכונות:

enum ציבורי MyFeatures מיישמת את התכונה {@Label ("תכונת ניהול עובדים") EMPLOYEE_MANAGEMENT_FEATURE; ציבור בוליאני isActive () {return FeatureContext.getFeatureManager (). isActive (זה); }}

המניין מגדיר גם שיטה הנקראת isActive () המאמת אם תכונה מסוימת מופעלת.

אז נוכל להגדיר שעועית מסוג EnumBasedFeatureProvider בשיעור תצורה של Spring Boot:

@Configuration public class ToggleConfiguration {@Bean public FeatureProvider featureProvider () {להחזיר EnumBasedFeatureProvider חדש (MyFeatures.class); }}

5. יצירת היבט

לאחר מכן, ניצור היבט המיירט מותאם אישית AssociatedFeature ביאור ובודק את התכונה המסופקת בפרמטר ההערות כדי לקבוע אם היא פעילה או לא:

@Aspect @Component class class FeaturesAspect {לוגר סופי סטטי פרטי LOG = Logger.getLogger (FeaturesAspect.class); @Around ("@within (featureAssociation) || @annotation (featureAssociation)") checkAspect אובייקט ציבורי (ProceedingJoinPoint joinPoint, FeatureAssociation featureAssociation) זורק Throwable {if (featureAssociation.value (). IsActive ()) {return joinPoint.proceed () ; } אחר {LOG.info ("Feature" + featureAssociation.value (). name () + "אינו מופעל!"); החזר אפס; }}}

בואו נגדיר גם את ההערה המותאמת אישית שנקראת FeatureAssociation שיהיה לו ערך() פרמטר מסוג MyFeatures enum:

@Retention (RetentionPolicy.RUNTIME) @Target ({ElementType.METHOD, ElementType.TYPE}) ציבורי @interface FeatureAssociation {ערך MyFeatures (); }

אם התכונה פעילה, ההיבט ימשיך בביצוע השיטה; אם לא, זה יירשם הודעה מבלי להריץ את קוד השיטה.

6. הפעלת תכונה

תכונה ב טוגגלז יכול להיות פעיל או לא פעיל. התנהגות זו נשלטת על ידי מופעלת דגל ואופציית אסטרטגיית הפעלה.

כדי להגדיר את מופעלת דגל נכון, אנחנו יכולים להשתמש ב- @EnabledByDefault ביאור על הגדרת ערך enum.

טוגגלז הספרייה מספקת גם מגוון אסטרטגיות הפעלה בהן ניתן להשתמש כדי לקבוע אם תכונה מופעלת על סמך תנאי מסוים.

בדוגמה שלנו, בואו נשתמש ב- SystemPropertyActivationStrategy עבור EMPLOYEE_MANAGEMENT_FEATURE שלנו שמעריך את מצב התכונה בהתבסס על הערך של מאפיין מערכת. ניתן לציין את שם הנכס והערך הנדרשים באמצעות @ ActivationParameter ביאור:

פומבי enum MyFeatures מיישם את התכונה {@Label ("תכונת ניהול עובדים") @EnabledByDefault @DefaultActivationStrategy (id = SystemPropertyActivationStrategy.ID, parameters = {@ActivationParameter (name = SystemPropertyActivationStrategy.PERTAM_Proam_Proam_Peram_Peram_Proamter_Param_Peram_Param_Peram_Param_Param_Param_Proam) = שם = SystemPropertyActivationStrategy.PARAM_PROPERTY_VALUE, value = "true")}) EMPLOYEE_MANAGEMENT_FEATURE; // ...}

הגדרנו את התכונה שלנו להיות מופעלת רק אם עובד. תכונה לנכס יש ערך נָכוֹן.

סוגים אחרים של אסטרטגיות הפעלה הניתנות על ידי טוגגלז הספרייה הן:

  • UsernameActivationStrategy - מאפשר לתכונה להיות פעילה עבור רשימה מוגדרת של משתמשים
  • UserRoleActivationStrategy - תפקיד המשתמש הנוכחי משמש לקביעת מצב התכונה
  • ReleaseDateActivationStrategy - מפעיל תכונה אוטומטית בתאריך ובשעה מסוימים
  • GradualActivationStrategy - מאפשר תכונה עבור אחוז מוגדר של משתמשים
  • ScriptEngineActivationStrategy - מאפשר שימוש בתסריט מותאם אישית שנכתב בשפה הנתמכת על ידי ScriptEngine של ה- JVM כדי לקבוע אם תכונה פעילה או לא
  • ServerIpActivationStrategy - תכונה מופעלת על סמך כתובות IP של השרת

7. בדיקת ההיבט

7.1. יישום לדוגמא

כדי לראות את ההיבט שלנו בפעולה, בואו ליצור דוגמה פשוטה המכילה תכונה לניהול עובדי הארגון.

מאחר ותכונה זו תפותח, אנו יכולים להוסיף שיטות ושיעורים המוערים על ידי שלנו @AssociatedFeature ביאור עם ערך EMPLOYEE_MANAGEMENT_FEATURE. זה מבטיח שהם יהיו נגישים רק אם התכונה פעילה.

ראשית, בואו נגדיר עוֹבֵד מחלקת ישות ומאגר המבוסס על נתוני אביב:

עובד בכיתה ציבורית @Entity {@ Id מזהה פרטי ארוך; משכורת כפולה פרטית; // קונסטרוקטור סטנדרטי, גטרים, סטרים}
ממשק ציבורי EmployeeRepository מרחיב את CrudRepository {}

לאחר מכן, בואו להוסיף שירות עובדים בשיטה להגדלת שכר העובד. נוסיף את @AssociatedFeature ביאור לשיטה עם פרמטר של EMPLOYEE_MANAGEMENT_FEATURE:

מעמד ציבורי @Service SalaryService {@ מאגר עובדים עובד מאגר; @FeatureAssociation (value = MyFeatures.EMPLOYEE_MANAGEMENT_FEATURE) ריבוי חלל ציבוריסאלרי (מזהה ארוך) {עובד שכיר = עובדRepository.findById (id) .orElse (null); employee.setSalary (employee.getSalary () + עובד.getSalary () * 0.1); workerRepository.save (עובד); }} 

השיטה תיקרא מ- /העלאת שכר נקודת קצה שנקרא לבדיקה:

@Controller שכבה ציבורית SalaryController {@Autowired SalaryService salaryService; @PostMapping ("/ increaseSalary") @ResponseBody public void increaseSalary (@RequestParam מזהה ארוך) {salaryService.increaseSalary (id); }}

7.2. מבחן JUnit

ראשית, נוסיף מבחן בו אנו מכנים את מיפוי ה- POST לאחר הגדרת ה- עובד. תכונה נכס ל שֶׁקֶר. במקרה זה, התכונה לא צריכה להיות פעילה ושווי המשכורת של העובד לא אמור להשתנות:

@Test הציבור בטל givenFeaturePropertyFalse_whenIncreaseSalary_thenNoIncrease () זורק חריג {עובד עובד = עובד חדש (1, 2000); employeeRepository.save (emp); System.setProperty ("עובד.feature", "שקר"); mockMvc.perform (post ("/ increaseSalary") .param ("id", emp.getId () + "")). andExpect (status (). is (200)); emp = workerRepository.findOne (1L); assertEquals ("שכר שגוי", 2000, emp.getSalary (), 0.5); }

לאחר מכן, נוסיף בדיקה שבה אנו מבצעים את השיחה לאחר הגדרת המאפיין ל- נָכוֹן. במקרה זה, יש להעלות את שכר השכר:

@Test הציבור בטל givenFeaturePropertyTrue_whenIncreaseSalary_thenIncrease () זורק חריג {עובד emp = עובד חדש (1, 2000); employeeRepository.save (emp); System.setProperty ("עובד.feature", "נכון"); mockMvc.perform (post ("/ increaseSalary") .param ("id", emp.getId () + "")). andExpect (status (). is (200)); emp = workerRepository.findById (1L) .orElse (null); assertEquals ("שכר שגוי", 2200, emp.getSalary (), 0.5); }

8. מסקנות

במדריך זה הראינו כיצד אנו יכולים להשתלב טוגגלז ספרייה עם Spring Boot על ידי שימוש בהיבט.

קוד המקור המלא של הדוגמה נמצא ב- GitHub.


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