一个业务通常由多个系统、多个功能模块组成,为保证某些业务的动态性,后端程序通常会用开关来控制程序的逻辑,以达到在系统运行时切换运行逻辑的目的。本文介绍如何新增功能开关。

前提条件

您已接入新应用,详情请参见使用 SDK 接入使用 Spring Boot Starter 接入

通过 Java SDK 接入

通过 Java SDK 接入的应用请参见以下步骤新增功能开关。

  1. 定义功能开关。

    在字段上加上 com.taobao.csp.switchcenter.annotation.AppSwitch 注解,字段修饰符必须为 public static

    例如以下代码:

    public class CommonTypeSwitch {
    
        @AppSwitch(des = "String 类型开关", level = Level.p2)
        public static String stringSwitch = "string";
    
        @AppSwitch(des = "Integer 类型开关", level = Level.p1)
        public static Integer integerSwitch = 2;
    
        @AppSwitch(des = "Boolean 类型开关", level = Level.p4)
        public static Boolean booleanSwitch = true;
    
        @AppSwitch(des = "AtomicInteger 类型开关", level = Level.p1)
        public static AtomicInteger atomicIntegerSwitch = new AtomicInteger(21);
    
        @AppSwitch(des = "AtomicBoolean 类型开关", level = Level.p1)
        public static AtomicBoolean atomicBooleanSwitch = new AtomicBoolean(true);
    
        @AppSwitch(des = "AtomicLong 类型开关", level = Level.p1)
        public static AtomicLong atomicLongSwitch = new AtomicLong(4L);
    
        @AppSwitch(des = "泛型为 String List 类型开关", level = Level.p1)
        public static List<String> stringListSwitch = new ArrayList<String>();
    
        @AppSwitch(des = "泛型是<Integer, String> Map 开关", level = Level.p4)
        public static Map<Integer, String> INT_STRING_MAP = new HashMap<Integer, String>();
    
        @SuppressWarnings("deprecation")
        @AppSwitch(des = "Date类型开关", level = Level.p1)
        public static Date dateTypeSwitch = new Date(114, 6, 3);
    
        @AppSwitch(des = "BigInteger类型开关", level = Level.p1)
        public static BigInteger bigIntegerTypeSwitch = BigInteger.valueOf(38888);
    
        @AppSwitch(des = "BigDecimal类型开关", level = Level.p1)
        public static BigDecimal bigDecimalTypeSwitch = BigDecimal.valueOf(3.00000000001);
    
        @AppSwitch(des = "枚举类型开关", level = Level.p1)
        public static EnumType enumTypeSwitch = EnumType.ITEM1;
    
        @AppSwitch(des = "泛型为List<Integer>的LinkedList", level = Level.p1)
        public static List<List<Integer>> LIST_INT_LINKEDLIST = new LinkedList<List<Integer>>();
    
        @AppSwitch(des = "泛型为<Map<String, Integer>, Map<String, Integer>>的HashMap", level = Level.p1)
        public static Map<Integer, Map<String, Map<String, Integer>>> MAP_MAP_HASHMAP = new HashMap<Integer, Map<String, Map<String, Integer>>>();
    }
  2. 调用注册方法进行注册。
    /*
     应用调用此方法完成注册, 同时请保证应用在启动的时候, 调用过且知道用过一次此方法,多次调用会抛出异常。
     应用名称可不填,不填取 project.name 启动参数的值其中,常量类参数是可变参数,可注册多个常量类。
     如常量类未添加 com.taobao.csp.switchcenter.annotation.NameSpace 注解,默认使用完整类路径名作为 namespace。
    */
    SwitchManager.init("appName", CommonTypeSwitch.class);
  3. 配置启动参数。
    • 非公网
      //将 AppName 替换为自定义的应用名称。
      ahas.namespace=default
      project.name=AppName
    • 公网
      //将 AppName 替换为自定义的应用名称,将 <license> 替换为真实值。
      ahas.namespace=default
      project.name=AppName
      ahas.license=<license>
      说明 仅公网环境接入需要 License,您可在新应用接入页面查看并保存 License,详情请参见查看并保存 license
  4. 重新部署您的应用。

通过 Spring Boot 接入

通过 Spring Boot 接入的应用请参见以下步骤新增功能开关。

  1. 定义功能开关。
    • 在相关开关类上加上 @Switch 注解。
    • 在相关常量类上加 com.alibaba.csp.ahas.switchcenter.anotation.Switch 注解,同时在对应字段上加com.taobao.csp.switchcenter.annotation.AppSwitch 注解,字段修饰符必须为 public static
    @Switch
    public class SwitchConfig {
    
        @AppSwitch(des = "Boolean 类型开关", level = Level.p2, callback = TestCallback.class)
        public static boolean test_switch = false;
    }
  2. 配置启动参数。

    在 application.properties 中添加以下配置项。

    • 非公网
      #指定您要接入的特定的 AHAS 环境。
      ahas.namespace=default
      #自定义您的应用名称。
      project.name=AppName
    • 公网
      #指定您要接入的特定的 AHAS 环境。
      ahas.namespace=default
      #自定义您的应用名称。
      project.name=AppName
      #配置 License 信息。
      ahas.license=<license>
      说明 仅公网环境接入需要 License,您可在新应用接入页面查看并保存 License,详情请参见查看并保存 license
  3. 重新启动您的应用。

执行结果

添加完成后,在功能开关页面单击目标应用的资源卡片,进入目标应用的开关列表页面,可查看到新增开关的相关信息。

add_swtich

更多信息

如果您需要自定义功能开关的分组,可在代码中添加 com.taobao.csp.switchcenter.annotation.NameSpace 注解;如果没有自定义,分组类别默认取 class 后面的类名,请参见以下示例。

package com.taobao.csp.switchcenter.example;

import com.taobao.csp.switchcenter.annotation.AppSwitch;
import com.taobao.csp.switchcenter.annotation.NameSpace;
import com.taobao.csp.switchcenter.bean.Switch.Level;

  @NameSpace(nameSpace = "customNamespace") //customNamespace为自定义分组名。
  public class PrimitiveTypeSwitch {       //PrimitiveTypeSwitch为默认分组名。

  @AppSwitch(des = "int 类型开关", level = Level.p1)
  public static int primitiveIntSwitch = 1;

  @AppSwitch(des = "doubel 类型开关", level = Level.p1)
  public static double primitiveDoubleSwitch = 1.121;
}