带你读《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