开发者社区 > 云原生 > 正文

Nacos做dubbo注册中心,NacosRegistry#getAllServiceNames()

环境信息

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

展开
收起
大圣东游 2023-05-11 16:51:44 133 0
1 条回答
写回答
取消 提交回答
  • 这里应该是 Nacos 的问题吧,Dubbo 只能依赖 Nacos 返回的 count 来判断总数。看起来是 2.0.4 修复的,你升级下版本呢。

    原回答者GitHub用户AlbumenJ

    2023-05-12 10:36:10
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Nacos 启航,发布第一个版本, 云原生时代助力用户微服务平台建设 立即下载
Dubbo分布式服务治理实战 立即下载