Dalam pembangunan perisian moden, bendera ciri memainkan peranan penting dalam mengurus keluaran ciri. Dengan menggunakan bendera ciri (juga dikenali sebagai togol ciri), pembangun boleh mendayakan atau melumpuhkan ciri secara dinamik tanpa menggunakan semula aplikasi. Pendekatan ini membolehkan keluaran tambahan, percubaan terkawal dan penggunaan yang lebih lancar, terutamanya dalam sistem yang kompleks dan berskala besar.
Dalam blog ini, kami akan meneroka cara melaksanakan bendera ciri dalam aplikasi Spring Boot menggunakan Pengaturcaraan Berorientasikan Aspek (AOP). AOP membolehkan kami memodulasi kebimbangan silang seperti pembalakan, keselamatan dan togol ciri, memisahkannya daripada logik perniagaan teras. Dengan memanfaatkan AOP, kami boleh mereka bentuk pelaksanaan bendera ciri yang fleksibel dan boleh digunakan semula yang boleh menyesuaikan diri dengan pelbagai keperluan.
Kami akan menunjukkan cara AOP boleh memintas panggilan kaedah, menyemak bendera ciri dan melaksanakan fungsi secara bersyarat berdasarkan status bendera. Ini menjadikan pelaksanaan lebih bersih, lebih boleh diselenggara dan lebih mudah untuk diubah suai. Pemahaman asas tentang AOP, Spring Boot dan bendera ciri disyorkan untuk diikuti.
Anda boleh menemui kod yang dirujuk dalam artikel ini di sini: Bendera Ciri dengan But Spring.
public interface FeatureFlagValidator { boolean validate(Object... args); }
Kaedah pengesahan mengambil bilangan argumen yang berubah-ubah (Objek... args), yang memberikan fleksibiliti untuk lulus sebarang parameter yang diperlukan untuk logik pengesahan. Kaedah ini akan kembali benar jika ciri harus didayakan, atau palsu jika ia kekal dilumpuhkan. Reka bentuk ini membolehkan logik pengesahan bendera ciri yang boleh digunakan semula dan mudah dikonfigurasikan.
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface FeatureFlag { Class<? extends FeatureFlagValidator>[] validators(); }
Anotasi ini menerima pelbagai kelas FeatureFlagValidator, membenarkan logik boleh dikonfigurasikan untuk menentukan sama ada ciri harus didayakan atau dilumpuhkan.
@Aspect @Component public class FeatureFlagAspect { @Autowired private ApplicationContext applicationContext; @Around(value = "@annotation(featureFlag)", argNames = "featureFlag") public Object checkFeatureFlag(ProceedingJoinPoint joinPoint, FeatureFlag featureFlag) throws Throwable { Object[] args = joinPoint.getArgs(); for (Class<? extends FeatureFlagValidator> validatorClass : featureFlag.validators()) { FeatureFlagValidator validator = applicationContext.getBean(validatorClass); if (!validator.validate(args)) { throw new RuntimeException(ErrorConstants.FEATURE_NOT_ENABLED.getMessage()); } } return joinPoint.proceed(); } }
Kelas ini termasuk kaedah yang
public interface FeatureFlagValidator { boolean validate(Object... args); }
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface FeatureFlag { Class<? extends FeatureFlagValidator>[] validators(); }
@Aspect @Component public class FeatureFlagAspect { @Autowired private ApplicationContext applicationContext; @Around(value = "@annotation(featureFlag)", argNames = "featureFlag") public Object checkFeatureFlag(ProceedingJoinPoint joinPoint, FeatureFlag featureFlag) throws Throwable { Object[] args = joinPoint.getArgs(); for (Class<? extends FeatureFlagValidator> validatorClass : featureFlag.validators()) { FeatureFlagValidator validator = applicationContext.getBean(validatorClass); if (!validator.validate(args)) { throw new RuntimeException(ErrorConstants.FEATURE_NOT_ENABLED.getMessage()); } } return joinPoint.proceed(); } }
@Component @RequiredArgsConstructor public class FeatureAFeatureFlag implements FeatureFlagValidator { private final FeatureFlagConfigs featureFlagConfigs; private final Logger logger = LoggerFactory.getLogger(FeatureAFeatureFlag.class); @Override public boolean validate(Object... args) { boolean result = featureFlagConfigs.getFeatureAEnabled(); if (!result) { logger.error("Feature A is not enabled!"); } return result; } }
Oleh kerana, kami telah menganotasi kaedah kami dengan anotasi FeatureFlag dan menggunakan kelas FeatureAFeatureFlag di dalamnya, jadi sebelum melaksanakan kaedah featureA, FeatureAFeatureFlag akan dilaksanakan dan ia akan menyemak sama ada ciri itu didayakan atau tidak.
Perhatikan di sini, medan pengesah ialah tatasusunan dalam anotasi FeatureFlag, oleh itu kita boleh menghantar berbilang pengesah kepadanya.
Untuk melaksanakan bendera ciri untuk Ciri B, kami perlu mengemas kini fail FeatureFlagConfigsand application.properties dengan sewajarnya.
public interface FeatureFlagValidator { boolean validate(Object... args); }
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface FeatureFlag { Class<? extends FeatureFlagValidator>[] validators(); }
@Aspect @Component public class FeatureFlagAspect { @Autowired private ApplicationContext applicationContext; @Around(value = "@annotation(featureFlag)", argNames = "featureFlag") public Object checkFeatureFlag(ProceedingJoinPoint joinPoint, FeatureFlag featureFlag) throws Throwable { Object[] args = joinPoint.getArgs(); for (Class<? extends FeatureFlagValidator> validatorClass : featureFlag.validators()) { FeatureFlagValidator validator = applicationContext.getBean(validatorClass); if (!validator.validate(args)) { throw new RuntimeException(ErrorConstants.FEATURE_NOT_ENABLED.getMessage()); } } return joinPoint.proceed(); } }
Kami akan menggunakan bendera ciri di atas dengan pengawal seperti ini:
@Component @RequiredArgsConstructor public class FeatureAFeatureFlag implements FeatureFlagValidator { private final FeatureFlagConfigs featureFlagConfigs; private final Logger logger = LoggerFactory.getLogger(FeatureAFeatureFlag.class); @Override public boolean validate(Object... args) { boolean result = featureFlagConfigs.getFeatureAEnabled(); if (!result) { logger.error("Feature A is not enabled!"); } return result; } }
Dengan cara ini, kami boleh mencipta bendera ciri tersuai kami dalam Spring Boot. Kami telah mencipta bendera ciri dengan cara yang boleh dilanjutkan dan kami boleh menambah pelbagai cara untuk menogol ciri. Pendekatan di atas juga boleh diubah suai dan di dalam pengesah bendera ciri, kita boleh menggunakan jadual pangkalan data juga untuk menogol ciri. Jadual ini boleh diurus menggunakan Panel Pentadbiran.
Sekiranya anda telah berjaya sejauh ini, saya sepenuh hati berterima kasih atas masa anda. Saya harap anda mendapati artikel ini bernilai pelaburan. Maklum balas anda amat dihargai. terima kasih! Selamat belajar!
Atas ialah kandungan terperinci Bendera Ciri dalam But Spring menggunakan Pengaturcaraan Berorientasikan Aspek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!