前言
在程序员的系统开发中,有些开发是从0到1的系统开发,有些开发是从1到100的系统开发,有些开发是为了保证系统更好、更稳定运行的优化。
从0到1的开发和从1到100的开发,是为了系统更好的实现功能,需要快速迭代,可以不断的优化、上线、再优化、再上线。
优化需求,是为了更好的使用系统,让系统更好、更稳定的运行,但是优化不能够影响到原有线上的功能,但是我们需要优化。为了防止优化过程中影响到其他代码,这里有几个总结的方案可供参考。
使用开关配置
目前我们项目中配置中心使用的是Apollo,其他配置中心或者配置文件也是同样的道理。
- 优点:①可配置化,②可以直接防止优化代码报异常影响到原来的逻辑
- 缺点:开关是一刀切,要么走优化逻辑,要么不走优化逻辑
public static void main(String[] args) {
// 这里可以使用开关配置,如果有问题可以使用开关及时关掉
String switchKey = ApolloUtil.getProperty("business_key", "false");
if (Boolean.TRUE.toString().equalsIgnoreCase(switchKey)){
// 优化逻辑
}
// 原来业务逻辑
}
使用 try-catch
- 优点:即使优化代码出现异常也会直接出现的异常吞掉
public static void main(String[] args) {
try {
// 优化逻辑
}catch (Throwable e){
// 这里可以把优化逻辑代码出现的异常吞下,防止系统异常之类的
log.error("the exception is {}", e.getMessage(), e);
}
// 原来业务逻辑
}
随机调整
- 优点:①类似于灰度发布,②可配置化,可以灵活调整比例
- 缺点:影响部分用户的使用
public static void main(String[] args) {
int limitNum = Integer.parseInt(ApolloUtil.getProperty("limitNum", "10"));
// 10%, 90% 类似于灰度发布,可以逐步放开
if (limitNum > Math.random() * 100){
// 优化逻辑
}
// 原来业务逻辑
}
联合使用
- 核心:结合
try-catch
和可配置化
public static void main(String[] args) {
String str = "";
boolean flag = optimizationLogic(str);
if (flag){
// 根据 flag 为 true 情况下的逻辑
}else {
// 根据 flag 为 false 情况下的逻辑
}
// 原来的逻辑
}
/**
* 优化逻辑,false 表示不走,true 表示走
* @param code
* @return
*/
private static boolean optimizationLogic(String code){
try {
if (null == code || code.isEmpty()){
return false;
}
String switchKey = ApolloUtil.getProperty("business_key", "false");
if (Boolean.FALSE.toString().equalsIgnoreCase(switchKey)){
return false;
}
// 优化逻辑
return true;
}catch (Throwable e){
// 这里可以把优化逻辑代码出现的异常吞下,防止系统异常之类的
log.error("the exception is {}", e.getMessage(), e);
}
return false;
}