环境信息
Dubbo version: 2.7.12 Operating System version: win10 Java version: 8
步骤重现
dubbo-registry-nacos模块的NacosRegistry类下getAllServiceNames()方法,会按照nacos.service.names.pagination.size(默认100)大小进行分页查询nacos的/v1/ns/service/list ,并按照返回的count判断是否继续翻页。可看过nacos源码,count是小于等于一页行数的,也就是说getAllServiceNames()永远不会翻页,只会返回前100个服务。
期待结果
getAllServiceNames()能自动翻页
实际执行情况
dubbo:
private Set<String> getAllServiceNames() {
final Set<String> serviceNames = new LinkedHashSet<>();
execute(namingService -> {
int pageIndex = 1;
ListView<String> listView = namingService.getServicesOfServer(pageIndex, PAGINATION_SIZE,
getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));
// First page data
List<String> firstPageData = listView.getData();
// Append first page into list
serviceNames.addAll(firstPageData);
// the total count
int count = listView.getCount();
// the number of pages
int pageNumbers = count / PAGINATION_SIZE;
int remainder = count % PAGINATION_SIZE;
// remain
if (remainder > 0) {
pageNumbers += 1;
}
// If more than 1 page
while (pageIndex < pageNumbers) {
listView = namingService.getServicesOfServer(++pageIndex, PAGINATION_SIZE,
getUrl().getParameter(GROUP_KEY, Constants.DEFAULT_GROUP));
serviceNames.addAll(listView.getData());
}
});
return serviceNames;
}
nacos:
@GetMapping("/service/list")
@Secured(action = ActionTypes.READ)
public ObjectNode listService(@RequestParam(defaultValue = "v2", required = false) String ver,
HttpServletRequest request) throws Exception {
final int pageNo = NumberUtils.toInt(WebUtils.required(request, "pageNo"));
final int pageSize = NumberUtils.toInt(WebUtils.required(request, "pageSize"));
String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID);
String groupName = WebUtils.optional(request, CommonParams.GROUP_NAME, Constants.DEFAULT_GROUP);
String selectorString = WebUtils.optional(request, "selector", StringUtils.EMPTY);
ObjectNode result = JacksonUtils.createEmptyJsonNode();
Collection<String> serviceNameList = getServiceOperator(ver)
.listService(namespaceId, groupName, selectorString);
result.put("count", serviceNameList.size());
result.replace("doms",
JacksonUtils.transferToJsonNode(ServiceUtil.pageServiceName(pageNo, pageSize, serviceNameList)));
return result;
}
原提问者GitHub用户bjfrbjx
这里应该是 Nacos 的问题吧,Dubbo 只能依赖 Nacos 返回的 count 来判断总数。看起来是 2.0.4 修复的,你升级下版本呢。
原回答者GitHub用户AlbumenJ
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。