需求是判断app高于某个版本,对接口返回的list做一些改动,
原代码简化后如下
@Data
@Component
@ConfigurationProperties(prefix = "grid.config")
public class GridConfig {
/**
* 生产未配置
*/
private List<String> MetricsTypeCodes ;
public List<String> getTypeCodes() {
if (MetricsTypeCodes == null || MetricsTypeCodes.isEmpty()) {
// 第一次走这里
MetricsTypeCodes = new ArrayList<>();
MetricsTypeCodes.add("a");
MetricsTypeCodes.add("b");
MetricsTypeCodes.add("c");
return MetricsTypeCodes;
}else {
// 第二次调用已有数据
return MetricsTypeCodes;
}
}
}
实现需求修改后伪代码如下:
@Data
@Component
@ConfigurationProperties(prefix = "grid.config")
public class GridConfig {
/**
* 生产未配置
*/
private List<String> MetricsTypeCodes ;
public List<String> getTypeCodes() {
if (MetricsTypeCodes == null || MetricsTypeCodes.isEmpty()) {
// 第一次走这里
MetricsTypeCodes = new ArrayList<>();
MetricsTypeCodes.add("a");
MetricsTypeCodes.add("b");
if (currentVersion >= appVersion) {
MetricsTypeCodes.add("d");
} else {
MetricsTypeCodes.add("c");
}
return MetricsTypeCodes;
}else {
// 第二次调用已有数据
return MetricsTypeCodes;
}
}
}
结果线上出现低版本的也返回了新的列表abd,新版本反而没出现abd,排查了版本判断逻辑没问题,问题原因在于Grid是单例的,而且成员变量全局共享,所以导致这个问题。
出现这中问题出现很难排查,如何避免这个问题
1. 改代码时需要注意原有写法有什么风险,我继续这样写会不会掉坑,使用成员变量做这种业务逻辑肯定有问题
2. if else处要加上详细日志,方便排查问题
3. 按用户灰度不可少,新逻辑出问题只会影响灰度用户