前言
在程序员的系统开发中,有些开发是从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; }