AHAS-功能开关 最佳实践

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

前提条件

AHAS-功能开关 最佳实践

  • 功能开关Agent方式接入,与流量防护共用Agent,

配置-Dahas.switch.agent.plugin.group.enabled=true


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原始配置内容。

历史记录

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

日志动态调整

测试样例

private static final Random RANDOM = new Random();

private static final Logger logger = LoggerFactory.getLogger("xx");

 

   @GetMapping("/hello")

   public ResponseEntity<String> hello(){

       int random = RANDOM.nextInt(100);

       logger.info("[SystemLog] ------------------- info : {} ",random);

       logger.debug("[SystemLog] ------------------- debug : {} ",random);

       logger.error("[SystemLog] ------------------- error : {} ",random);

       if(random < 30) {

           return new ResponseEntity<String>("BAD", HttpStatus.BAD_REQUEST);

       } else if(random > 50) {

           return new ResponseEntity<String>("BAD", HttpStatus.SERVICE_UNAVAILABLE);

       } else {

           return new ResponseEntity<String>("OK", HttpStatus.OK);

       }

   }

Step1:设置日志级别

Step2:日志级别生效

可选择单机或全局方式,以全局方式为例。

Step3:查看日志打印情况

若设为"DEBUG"级别,日志打印如下:


灰度推送

Step1:选择'全局推送'

Step2:选择'灰度推送'

Step3:设置灰度模式

Step4:检查无问题后,继续推送

Step5:推送中

Step6:推送完成

目录
相关文章
|
运维 安全 Java
AHAS-功能开关 解决方案
功能开关是一个轻量级的动态配置框架,通过功能开关可以动态管理代码中的配置项,根据需求为某个应用开启或关闭部分功能,或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能等场景。
334 0
|
SQL 监控 Java
AHAS+ACK流量防护最佳实践
AHAS应用防护以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障业务的稳定性,提供更专业稳定的流量防护手段、秒级的流量水位分布分析功能,是阿里巴巴双十一技术体系中的核心组件,同时也是开源框架Sentinel的商业化产品。 本文通过流量防护最佳实践介绍打开方式。
AHAS+ACK流量防护最佳实践
|
安全 应用服务中间件 双11
AHAS-流量防护应用权限管理 最佳实践
流量防护子账号权限细粒度控制:不同子账号 只可见对其授权的应用。 AHAS应用防护以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障业务的稳定性,提供更专业稳定的流量防护手段、秒级的流量水位分布分析功能,是阿里巴巴双十一技术体系中的核心组件,同时也是开源框架Sentinel的商业化产品。
395 0
|
运维 安全 Java
AHAS-功能开关 解决方案
功能开关是一个轻量级的动态配置框架,通过功能开关可以动态管理代码中的配置项,根据需求为某个应用开启或关闭部分功能,或设置某个性能指标的阈值。功能开关通常用于设置黑白名单、运行时动态调整日志级别、降级业务功能等场景。
287 0
|
安全 Java 应用服务中间件
AHAS+ACK流量防护最佳实践
AHAS应用防护以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障业务的稳定性,提供更专业稳定的流量防护手段、秒级的流量水位分布分析功能,是阿里巴巴双十一技术体系中的核心组件,同时也是开源框架Sentinel的商业化产品。 AHAS应用防护广泛用于秒杀场景、消息削峰填谷、集群流量控制、实时熔断等场景中,从多个维度保障您的业务稳定性。
|
SQL 应用服务中间件 AHAS
阿里云应用高可用服务 AHAS 流控降级实现 SQL 自动防护功能
在影响系统稳定性的各种因素中,慢 SQL 是相对比较致命的,可能会导致 CPU、LOAD 异常、系统资源耗尽。线上生产环境出现慢 SQL 往往有很多原因: 硬件问题。如网络速度慢,内存不足,I/O 吞吐量小,磁盘空间满等。
3912 11
|
6月前
|
Java Serverless 应用服务中间件
Serverless 应用引擎产品使用之在Serverless 应用引擎中跳过AHAS创建如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
141 3
|
消息中间件 安全 应用服务中间件
消息队列和应用工具产品体系 - AHAS 产品概述
消息队列和应用工具产品体系 - AHAS 产品概述
消息队列和应用工具产品体系 - AHAS  产品概述
|
SQL 运维 监控
|
测试技术 应用服务中间件 AHAS
冬季实战营第四期:基于PTS&AHAS完成线上应用最佳状态的实践,直播学习笔记
冬季实战营第四期:基于PTS&AHAS完成线上应用最佳状态的实践
148 0
冬季实战营第四期:基于PTS&AHAS完成线上应用最佳状态的实践,直播学习笔记