实现跨微服务分页查询的条件混合处理,需采用条件前置筛选与联合分页策略。以下是关键实现步骤:
-
条件分离与预处理
解析请求参数中的两类条件:
Map<String, Object> localConditions = extractLocalConditions(pageReqVO); // 主服务条件
Map<String, Object> projectConditions = extractProjectConditions(pageReqVO); // 项目服务条件
-
跨服务条件查询
调用项目服务获取满足条件的 ID 集合:
CommonResult projectResult = projectInfoApi.queryProjectIds(projectConditions);
Set<String> validXmids = new HashSet<>(projectResult.getData());
-
联合条件分页查询
将项目服务的 ID 集合注入主查询条件:
pageReqVO.setXmids(validXmids); // 添加ID过滤条件
PageResult<InfoDO> basePage = infoMapper.selectUnionPage(pageReqVO);
-
分页结果二次增强
对分页结果进行数据补全时,需保持原有分页结构:
List<JSONObject> mergedData = basePage.getList().stream()
.map(infoDO -> {
JSONObject obj = JSONUtil.parseObj(infoDO);
obj.putAll(getProjectDetails(infoDO.getXmid()));
return obj;
}).collect(Collectors.toList());
-
分页元数据修正
当存在跨服务过滤时,需重新计算总数:
long actualTotal = infoMapper.countUnionConditions(pageReqVO);
return new PageResult<>(mergedData, actualTotal);
注意事项
-
数据库层面应建立 xmid 的索引优化联合查询性能
-
采用 Hystrix 熔断机制处理项目服务不可用情况
-
对分页参数做边界校验(max=1000 条 / 页)
-
使用 Redis 缓存高频查询的项目条件结果
该方法通过前置过滤实现条件混合,保证分页准确性,同时通过异步调用优化跨服务查询性能。适用于中等数据规模(万级以下)的关联查询场景。