新需求上线,灰度测? 限流测?

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;
}

 

posted @ 2018-07-29 00:07  六度僧人  阅读(758)  评论(0编辑  收藏  举报