带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(5)

简介: 带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(5)

带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(4)https://developer.aliyun.com/article/1339608?groupCode=taobaotech


例如批量查询门店列表,可以这么合并,核心实现如下:

public <T> List<T> queryList(List<Long> ids, Function<T, Long> idMapping) { if (CollectionUtils.isEmpty(ids)) {
return Collections.emptyList();
}

 

7

 

// 1. 查询老数据

8

 

Supplier<List<T>> oldSupplier = () -> targetRepository.queryList(ids);

9

 

// 2. 查询新数据

10

 

Supplier<List<T>> newSupplier = () -> proxyRepository.queryList(ids);

11

 

// 3. 根据合并规则合并,依赖合并工具(对合并逻辑进行抽象后的工具类)

12

 

return ProxyHelper.mergeWithSupplier(oldSupplier, newSupplier, idMapping);

13

}

 

合并工具类实现如下:

public class ProxyHelper {
/**
*核心去重逻辑,判断是否采用新表数据
*
*@param existOldData 是否存在老数据
*@param existNewData 是否存在新数据
* @param id 门店id
* @return 是否采用新表数据
*/
public static boolean useNewData(Boolean existOldData, Boolean existNewData, Long id) { if (!existOldData && !existNewData) {
//两张表都没有return true;
} else if (!existNewData) {
//新表没有return false;
} else if (!existOldData) {
//老表没有return true;
} else {
//新表老表都有,判断开关和灰度开关return 总开关打开 or 在灰度列表内
}
}
/**
*合并新/老表数据
*
*@param oldSupplier 老表数据
*@param newSupplier 新表数据
  * @return 合并去重后的数据34  */
public static <T> List<T> mergeWithSupplier(
Supplier<List<T>> oldSupplier, Supplier<List<T>> newSupplier, Function<T, Long> idMapping) { 
  List<T> old = Collections.emptyList(); 
if (总开关未打开) {
// 未完成切换,需要查询老的数据源
old = oldSupplier.get();
  }
    return merge(idMapping, old, newSupplier.get()); 
    }
  /**
  * 去重并合并新老数据
  *
* @param idMapping  门店id映射函数
* @param oldData  老数据
* @param newData  新数据
* @return 合并结果
  */
public static <T> List<T> merge(Function<T, Long> idMapping, List<T> oldData, List<T> newData) {
if (CollectionUtils.isEmpty(oldData) && CollectionUtils.isEmpty(newData)) {
return Collections.emptyList();
  }
if (CollectionUtils.isEmpty(oldData)) {
return newData;
  }
if (CollectionUtils.isEmpty(newData)) {
return oldData;
  }
Map<Long/*门店id*/, T> oldMap = oldData.stream().collect(
Collectors.toMap(idMapping, Function.identity(), (a, b) -> a)); 
  Map<Long/*门店id*/, T> newMap = newData.stream().collect(
Collectors.toMap(idMapping, Function.identity(), (a, b) -> a));
return ListUtils.union(oldData, newData)


 

77

 

 

.stream()

78

 

 

.map(idMapping)

79

 

 

.distinct()

80

 

 

.map(id -> {

81

 

 

boolean existOldData = oldMap.containsKey(id);

82

 

 

boolean existNewData = newMap.containsKey(id);

83

 

 

boolean useNewData = useNewData(existOldData, existNewData, id);

84

 

 

return useNewData ? newMap.get(id) : oldMap.get(id);

85

 

 

})

86

 

 

.filter(Objects::nonNull)

87

 

 

.collect(Collectors.toList());

88

 

}

 

89

}

 

 

 

 


带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(6)https://developer.aliyun.com/article/1339606?groupCode=taobaotech

相关文章
|
9月前
|
Java
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(1)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(1)
|
9月前
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(3)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(3)
|
9月前
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(2)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(2)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(2)
|
9月前
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(4)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(4)
|
9月前
|
安全
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(6)
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(6)
|
9月前
|
API Android开发 UED
带你读《2022技术人的百宝黑皮书》——移动域全链路可观测架构和关键技术(11)
带你读《2022技术人的百宝黑皮书》——移动域全链路可观测架构和关键技术(11)
|
监控 前端开发 安全
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(1)
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(1)
123 0
|
监控 前端开发 JavaScript
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(4)
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(4)
|
监控 前端开发 JavaScript
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(2)
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(2)
|
监控 前端开发 JavaScript
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(5)
带你读《2022技术人的百宝黑皮书》——前端质量之灰度监控的有效实践(5)