功能开关最佳实践

简介: 功能开关是一个轻量级的动态配置框架,通过功能开关可以动态管理代码中的配置项,根据需求为某个应用开启或关闭部分功能,或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能等场景。本文介绍最佳实践。

前提条件

  • 功能开关Agent方式接入,与流量防护共用Agent,配置-Dahas.switch.agent.plugin.group.enabled=true
  • 功能开关SDK方式接入,参考使用 SDK 接入
  • 功能开关Spring Boot Starter 方式接入,参考使用 Spring Boot Starter 接入

版本:1.1.11起


Spring Demo 文件

@Value 配置

UserController类对象,用于测试@PostConstruct注解,此阶段可识别持久化值,部分内容如下

@RestController

public class UserController {


   @Value("${project.name}")

   public String name;


   @Value("${user.ahas}")

   public boolean ahas;


   @Value("${user.number}")

   public int num;


   @Value("${destination}")

   public String destinationStr;



   @Autowired

   private Destination destination;


   @PostConstruct

   private void init(){

       System.out.println("[UserController] init()  value: "+ destinationStr +" , " + num + " , "+ ahas + " , " + name);

       System.out.println("[UserController] init()  configuration: "+destination.getAvg()+" , " + destination.getMax() + " , "+ destination.getMin());

   }

DemoConfig类对象,用于测试InitializingBean,afterPropertiesSet函数初始化阶段可读取到持久化值

@Configuration

public class DemoConfig implements InitializingBean {

   @Autowired

   private RequestProperties requestProperties;


   @Override

   public void afterPropertiesSet() {

       System.out.println("[DemoConfig] init()  port: " + requestProperties.getPort() + " ,interface: " + requestProperties.getInter());

   }


}

RequestProperties类对象,@ConfigurationProperties 配置,value模式

@Component

@ConfigurationProperties(value = "request")

public class RequestProperties {

   private int port;


   private String inter;


   public int getPort() {

       return port;

   }


   public void setPort(int port) {

       this.port = port;

   }


   public String getInter() {

       return inter;

   }


   public void setInter(String inter) {

       this.inter = inter;

   }

}

Destination类对象,@ConfigurationProperties 配置,prefix模式

@Component

@ConfigurationProperties(prefix = "property.destination")

public class Destination {

   private int max;

   private int min;

   private int avg;


   public int getMax() {

       return max;

   }


   public void setMax(int max) {

       this.max = max;

   }


   public int getMin() {

       return min;

   }


   public void setMin(int min) {

       this.min = min;

   }


   public int getAvg() {

       return avg;

   }


   public void setAvg(int avg) {

       this.avg = avg;

   }

}

application.properties 配置内容

user.ahas=false

user.number=123


request.port=8081

request.inter=/hello


destination=sun


property.destination.max=300

property.destination.min=10

property.destination.avg=100


配置注册

微服务启动后可在 ‘微服务治理中心>应用配置’菜单看到接入的应用。

点击应用进入后可看到开关配置项,对应的配置项可以分组方式展示,分组名为识别出的类名。

开关名为类中字段名,描述内容在@Value 方式为注解中内容,@ConfigurationProperties方式为Spring配置文件中配置项。


配置修改

分为单机推送与全局推送两种方式,单机推送的值不会持久化,仅当前微服务实例生命周期有效,全局推送方式会进行值持久化,微服务实例再次启动后可看到持久化值。

单机推送

对RequestProperties,port字段执行单机推送

此时应用中port字段即被修改为'8083',可在控制台查看

类似的可对UserController中num字段进行单机推送

可在推送记录中查看历史操作


全局推送

对Destination,max字段执行全局推送

推送后可见修改后的值,同时数据已经持久化。

类似的可对UserController中destinationStr字段进行全局推送,

推送后内存值变更可在控制台查看,同时开关值已持久化。

配置持久化

初始化阶段

重启应用,在InitializingBean,afterPropertiesSet函数初始化阶段与@PostConstruct初始化阶段均可被读取到已持久化的值。

可通过测试demo中的启动日志查看,内容如下

@ConfigurationProperties 配置

在控制台观察 RequestProperties 可看到全局推送方式推送的‘inter’配置项为持久化值,而单机推送的‘port’配置项仍为Spring原始配置内容。

@Value 配置

在控制台观察 UserController 可看到全局推送方式推送的‘destinationStr’配置项为持久化值,而单机推送的‘num’配置项仍为Spring原始配置内容。

历史记录

可在‘历史记录’菜单查看推送记录。

相关文章
|
6月前
|
Web App开发 容灾 安全
非功能关键知识总结
【2月更文挑战第4天】非功能关键知识总结
272 2
|
4天前
|
JavaScript 搜索推荐 前端开发
DevDocs有哪些功能?
DevDocs有哪些功能?
11 4
|
1月前
|
SQL Oracle 关系型数据库
|
6月前
|
C++
BugProfiler功能使用介绍
BugProfiler功能使用介绍
49 0
|
11月前
楼中楼回复评论功能的实现
@(真棒)装就完事了. 今天给写的评论系统增加了楼中楼功能,众所周知,楼中楼评论实现是有困难的,我的确也踩进了很多坑。 这里跟大家讲述我是如何实现的.
146 0
|
数据安全/隐私保护
主要功能
5.1.1 PowerPoint 2010的主要功能 PowerPoint 2010的主要功能是将各种文字、图形图表、音频、视频等多媒体信息以图片的形式展示出来。 在PowerPoint 2010中,将这种制作出的图片叫做幻灯片,而一张张幻灯片组成的文件叫做演示文稿文件。 其默认扩展名为.pptx 模板文件扩展名: potx 放映文件扩展名:ppsx 5.1.2 新建和打开演示文稿 启动PowerPoint 2010后,显示的窗口被称为演示文稿的工作窗口,该窗口主要由快速访问工具栏、选项卡、“幻灯片/大纲”窗格、幻灯片编辑窗格、备注窗功能区、格、任务窗格、状态栏、视图切换按钮和显示比
BXA
|
Web App开发 算法 安全
C++11:必须关注的一个功能
C++11是C++语言的一次重大更新,旨在解决一些C++03语言存在的问题,从而提高其可靠性和可用性
BXA
100 0
|
运维 安全 Java
AHAS-功能开关 解决方案
功能开关是一个轻量级的动态配置框架,通过功能开关可以动态管理代码中的配置项,根据需求为某个应用开启或关闭部分功能,或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能等场景。
287 0
|
安全 Java 测试技术
给你的项目添加一个灵活的“开关”
  年后项目提测了两次,每次提测都是通宵达旦完成~第二次通宵的原因主要可以用一个字来形容:等。   项目中对接了一个代付通道,每次测试代付功能都是发起代付请求之后,需要等十几到二十几分钟才能返回代付结果,甚至期间通道偶尔会出现一些问题,更尴尬的是等了好长时间,返回的结果是代付失败(代付通道测试环境返回的代付结果都是随机的)。
|
Python Serverless 容器
Funfile 功能介绍
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。
5109 0