1. 新需求场景
新需求即将上线,虽然已经经历了,开发自测,测试环境测试,堡垒环境测试。
但是还是不敢直接发布到生产环境,全量接入生产流量投入运行,新的功能牵扯到了N多个场景。
而测试覆盖率也不竟然全部,如果漏掉一个场景,恰巧生产环境命中,可能就会带来很多损失
那么如何避免? 有没有好的方案来解决?
2. 灰度测试 , 缓慢接入生产流量
2.1:灰度测试场景
有些场景,在测试环境无法测试,必须要到生产环境验证。这个时候就需要给新功能做好开关,只有配置过的用户才能进入到新的功能逻辑中。从而进行灰度测试。
2.2 :缓慢接入生产流量
灰度测试通过,但是需要开少量流量,来进行观察新功能是否有异常, 比如先开5%的流量,在开10%的流量,在开20%的流量 来验证新功能。
3. 技术实现
3.1: 分析下来,其实就是一个开关,需要兼容如上场景,比如按配置的userid,及userid 尾号来进行灰度测试和限流。
具体code 如下:
/** * 限流检查 * * @param baseEntity * @param checkValue * @return */ public static boolean limitCheck(LimitflowBaseEntity baseEntity, String checkValue) { if (baseEntity == null || baseEntity.isOpen == false || StringHelper.isEmpty(checkValue)) return false; return limitCheck(baseEntity.isOpen, baseEntity.limitNums, checkValue); } /** * 限流检测 * * @param isOpen * @param limitNums * @param checkValue * @return */ public static boolean limitCheck(boolean isOpen, String limitNums, String checkValue) { try { if (isOpen == false || StringHelper.isEmpty(checkValue)) return false; if (StringHelper.isEmpty(limitNums)) return true; String[] nums = limitNums.split(","); boolean checkResult = false; for (String num : nums) { // 灰度 if (num.equals(checkValue)) { checkResult = true; break; } // 比对尾号是否相等 => 限流 if (checkValue.length() >= num.length() && num.equals(checkValue.substring(checkValue.length() - num.length()))) { checkResult = true; break; } } return checkResult; } catch (Exception e) { CLogger.Warn("limitCheck", e.getMessage(), LogType.Business); } return false; } // 配置实体 public class LimitflowBaseEntity { /// <summary> /// 是否打开 /// </summary> public boolean isOpen; /// <summary> /// 尾号配置 /// </summary> public String limitNums; }