功能开关最佳实践

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

前提条件

  • 功能开关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原始配置内容。

历史记录

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

相关文章
|
Oracle 关系型数据库 数据库
0丢失之谜:解决Oracle中0开头小数被截断的问题
0丢失之谜:解决Oracle中0开头小数被截断的问题
1393 0
|
机器学习/深度学习 人工智能 Cloud Native
高性能深度学习推理平台 OpenPPL 正式开源!
高性能深度学习推理平台 OpenPPL 正式开源!
2394 0
|
开发工具 git 测试技术
Feature Toggle 实践总结
Feature Toggle 实践总结
14130 0
|
云安全 缓存 监控
什么是CC攻击,有什么办法防御CC攻击
CC攻击的前身是一个名为Fatboy的攻击程序,而之所以后来人们会称之为CC,是因为DDoS攻击发展的初期阶段,绝大部分DDoS攻击都能被业界熟知的“黑洞”(Collapsar,一种安全防护产品)所抵挡,CC攻击的诞生就是为了直面挑战黑洞,所以Challenge Collapsar(挑战黑洞).
什么是CC攻击,有什么办法防御CC攻击
|
SQL 缓存 监控
技术方案到底怎么写?7步完美搞定!
总结了作者多年编写技术方案的经验,介绍了如何通过七个步骤来编写技术方案,包括系统用例、功能链路、核心业务流程、数据库设计、接口设计、非功能设计和系统风险点评估,帮助开发人员更高效地进行系统设计和需求分析。
技术方案到底怎么写?7步完美搞定!
|
12月前
|
小程序
uniapp实现微信小程序隐私协议组件封装
uniapp实现微信小程序隐私协议组件封装
224 0
|
监控 安全 网络安全
EAP:无线网络安全的强大卫士
EAP:无线网络安全的强大卫士
517 0
|
缓存 监控 中间件
构建高效的Go语言Web服务器:基于Fiber框架的性能优化实践
在追求极致性能的Web开发领域,Go语言(Golang)凭借其高效的并发处理能力、垃圾回收机制及简洁的语法赢得了广泛的青睐。本文不同于传统的性能优化教程,将深入剖析如何在Go语言环境下,利用Fiber这一高性能Web框架,通过精细化配置、并发策略调整及代码层面的微优化,构建出既快速又稳定的Web服务器。通过实际案例与性能测试数据对比,揭示一系列非直觉但极为有效的优化技巧,助力开发者在快节奏的互联网环境中抢占先机。
|
存储 搜索推荐
【七大排序】堆排序详解
【七大排序】堆排序详解
487 3
|
Kubernetes Cloud Native 安全
基于阿里云服务网格流量泳道的全链路流量管理(一)严格模式流量泳道
灰度发布是一种常见的对新版本应用服务的发布手段,其特点在于能够将流量在服务的稳定版本和灰度版本之间时刻切换,以帮助我们用更加可靠的方式实现服务的升级。
30183 99