96SEO 2026-02-19 20:14 6
前言确定前端路由CatalogController.listDetail()ServiceManager总结

前文我们分析了Nacos中客户端注册时数据分发的设计链路#xff0c;本文根据Nacos前端页面请求#xff0c;看下前端页面中的服务列表的数据源于哪里。
前言确定前端路由CatalogController.listDetail()ServiceManager总结
前文我们分析了Nacos中客户端注册时数据分发的设计链路本文根据Nacos前端页面请求看下前端页面中的服务列表的数据源于哪里。
我们已经向Nacos中注册了一个服务现在去前端确定查询的路由是什么
确定前端请求路由/nacos/v1/ns/catalog/services
com.alibaba.nacos.naming.controllers;
CatalogController.listDetail()CatalogController.listDetail()
listDetail(RequestParam(required
withInstances,RequestParam(defaultValue
Constants.DEFAULT_NAMESPACE_ID)
namespaceId,RequestParam(required
containedInstance,RequestParam(required
{//前端withInstances传的是false,不走这个分支if
judgeCatalogService().pageListServiceDetail(namespaceId,
pageSize);}//确定是走的这里获取的服务列表return
judgeCatalogService().pageListService(namespaceId,
}查看judgeCatalogService().pageListService(namespaceId,
JacksonUtils.createEmptyJsonNode();ListServiceView
LinkedList();//获取服务列表CollectionService
serviceStorage.getData(each).ipCount()).collect(Collectors.toList());}result.put(FieldsConstants.COUNT,
metadataManager.getServiceMetadata(each).orElseGet(ServiceMetadata::new);ServiceView
ServiceView();serviceView.setName(each.getName());serviceView.setGroupName(each.getGroup());serviceView.setClusterCount(serviceStorage.getClusters(each).size());serviceView.setIpCount(serviceStorage.getData(each).ipCount());serviceView.setHealthyInstanceCount(countHealthyInstance(serviceStorage.getData(each)));serviceView.setTriggerFlag(isProtectThreshold(serviceView,
false);serviceViews.add(serviceView);}result.set(FieldsConstants.SERVICE_LIST,
JacksonUtils.transferToJsonNode(serviceViews));return
StringUtils.isBlank(serviceName)
{//我们前端默认传的这两个参数都是空所以会走这里的逻辑return
ServiceManager.getInstance().getSingletons(namespaceId);}CollectionService
StringJoiner(Constants.SERVICE_INFO_SPLITER);regex.add(getRegexString(group));regex.add(getRegexString(serviceName));String
ServiceManager.getInstance().getSingletons(namespaceId))
(each.getGroupedServiceName().matches(regexString))
}ServiceManager.getInstance()这里一看就是一个经典的单例写法那我们接下来把精力放到getSingletons这个方法上。
namespaceSingletonMaps.getOrDefault(namespace,
}通过代码我们发现获取制定namespace下的服务是从一个map中获取的。
}我们可以发现ServiceManager这个类是一个单例模式的实现其中维护了两个map其中一个namespaceSingletonMaps用于存放制定namespace下的服务那么这个map中的数据是在什么时机存放进去的呢
{singletonRepository.computeIfAbsent(service,
MetadataEvent.ServiceMetadataEvent(service,
singletonRepository.get(service);namespaceSingletonMaps.computeIfAbsent(result.getNamespace(),
ConcurrentHashSet());namespaceSingletonMaps.get(result.getNamespace()).add(result);return
}观察代码我们发现往map中写数据的只有这一个方法那么这个方法是在什么时机被调用的呢
InstanceRequestHandler接收所有实例注册、注销相关的请求InstanceRequestHandler处理注册请求时会调用EphemeralClientOperationServiceImpl中的registerInstance方法registerInstance方法中除了我们之前讲的发布客户端服务注册事件ClientOperationEvent.ClientRegisterServiceEvent之外还会往ServiceManager中的map添加数据
registerInstance方法对ServiceManager的处理逻辑如下
ServiceManager.getInstance().getSingleton(service);总结
通过以上梳理我们知道了前端服务列表中获取的数据是源于ServiceManager类中一个map的缓存缓存中的数据是在客户端服务注册时添加进去的。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback