前提条件
AHAS-功能开关 最佳实践
- 功能开关Agent方式接入,与流量防护共用Agent,
配置-Dahas.switch.agent.plugin.group.enabled=true
- 应用配置SDK方式接入,参考使用 SDK 接入
- 应用配置Spring Boot Starter 方式接入,参考使用 Spring Boot Starter 接入
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:推送完成