Rumah  >  Artikel  >  Java  >  Bendera Ciri dalam But Spring menggunakan Pengaturcaraan Berorientasikan Aspek

Bendera Ciri dalam But Spring menggunakan Pengaturcaraan Berorientasikan Aspek

DDD
DDDasal
2024-10-21 06:15:02808semak imbas

Feature Flags in Spring Boot using Aspect-Oriented Programming

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.

Menyediakan kelas asas Bendera Ciri

  • Dengan mengandaikan anda sudah menyediakan projek Spring Boot, langkah pertama ialah mentakrifkan antara muka FeatureFlagValidator. Antara muka ini akan bertanggungjawab untuk merangkum logik yang mengesahkan sama ada ciri harus didayakan atau dilumpuhkan berdasarkan syarat tersuai.
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.

  • Sekarang, setelah kami menyediakan antara muka pengesah kami, langkah seterusnya ialah membuat anotasi FeatureFlag tersuai. Anotasi ini akan digunakan pada kaedah yang perlu dihidupkan atau dimatikan berdasarkan syarat tertentu.
@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.

  • Selepas ini, kami akhirnya akan mencipta aspek kami. Kelas aspek ini akan mengurus pengesahan bendera ciri berdasarkan anotasi FeatureFlag.
@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

  • memintas panggilan ke kaedah yang dianotasi dengan @FeatureFlag, mengesahkan bendera ciri menggunakan
  • menyediakan pengesah dan membuang GenericException jika pengesahan tidak lulus.

Mencipta dan mengkonfigurasi kelas Bendera Ciri

  • Katakanlah kita mahu mengurus Ciri A menggunakan bendera ciri. Untuk melakukan ini, kami perlu melaksanakan antara muka FeatureFlagValidator dan menerapkannya menggunakan anotasi FeatureFlag di sekitar kaedah yang berkaitan.
public interface FeatureFlagValidator {
  boolean validate(Object... args);
}
  • FeatureAFeatureFlag: Kelas ini melaksanakan antara muka FeatureFlagValidator. Ia mengandungi logik yang menyemak sama ada Ciri A didayakan atau dilumpuhkan dengan merujuk kelas konfigurasi (FeatureFlagConfigs). Jika ciri dilumpuhkan, mesej amaran dilog, yang membantu dalam memantau dan menyahpepijat.
  • Sekarang, anda mesti tertanya-tanya apakah kelas FeatureFlagConfigs ini dalam kod di atas. Kelas FeatureFlagConfigs bertanggungjawab untuk mengurus bendera ciri melalui fail konfigurasi (seperti application.properties). Kelas ini mengikat nilai bendera ciri daripada konfigurasi, membolehkan anda mengawal ciri yang didayakan atau dilumpuhkan pada masa jalan.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FeatureFlag {
  Class<? extends FeatureFlagValidator>[] validators();
}
  • Contoh Konfigurasi (application.properties): Anda boleh mengawal keadaan Ciri A dengan menambahkan sifat dalam fail konfigurasi anda. Contohnya, menetapkan feature-flags.feature-a-enabled=true akan mendayakan ciri tersebut. Ini menjadikannya mudah untuk menogol ciri tanpa mengatur semula atau mengubah suai pangkalan kod.
@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();
  }
}

Menggunakan Bendera Ciri

  • Sekarang, katakan kami mempunyai DemoService yang mana kami ingin menggunakan FeatureAFeatureFlag yang baru kami buat. Kami akan menggunakannya 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;
  }
}

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.

Nota:

Perhatikan di sini, medan pengesah ialah tatasusunan dalam anotasi FeatureFlag, oleh itu kita boleh menghantar berbilang pengesah kepadanya.

Menggunakan Bendera Ciri dalam Pengawal

  • Dalam contoh sebelumnya, kami menggunakan FeatureAFeatureFlag di sekitar kaedah lapisan perkhidmatan. Walau bagaimanapun, bendera ciri juga boleh digunakan pada kaedah pengawal. Ini membolehkan kami memeriksa parameter input dan, berdasarkan keadaan tertentu, mengawal sama ada pengguna boleh meneruskan aliran yang diminta.
  • Mari pertimbangkan Ciri B, yang mempunyai kaedah pengawal yang menerima flowType parameter permintaan. Pada masa ini, Ciri B hanya menyokong aliran INWARD, manakala aliran lain sedang diuji untuk pelancaran masa hadapan. Dalam kes ini, kami akan membuat bendera ciri untuk Ciri B yang menyemak sama ada flowType adalah INWARD dan memastikan bahawa hanya aliran ini dibenarkan buat masa ini.

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();
}
  • Sekarang, kami akan mencipta kelas FeatureBFeatureFlag. Kelas FeatureBFeatureFlag akan mengesahkan jika Ciri B didayakan dan sama ada flowType sepadan dengan nilai yang dibenarkan (INWARD). Jika syarat ini tidak dipenuhi, ciri tersebut akan 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();
  }
}

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Prinsip PADATArtikel seterusnya:Prinsip PADAT