likes
comments
collection
share

Nacos注册中心4-Client端(获取所有服务请求)

作者站长头像
站长
· 阅读数 13

欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈

0. 环境

  • nacos版本:1.4.1
  • Spring Cloud : 2020.0.2
  • Spring Boot :2.4.4
  • Spring Cloud alibaba: 2.2.5.RELEASE

测试代码:github.com/hsfxuebao/s…

1. 获取所有服务

入口方法:org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator#health:

@Override
public Health health() {
   Health.Builder builder = new Health.Builder();

   if (this.discoveryInitialized.get()) {
      try {
         DiscoveryClient client = this.discoveryClient.getIfAvailable();
         String description = (this.properties.isIncludeDescription()) ? client.description() : "";

         if (properties.isUseServicesQuery()) {
            // todo
            List<String> services = client.getServices();
            builder.status(new Status("UP", description)).withDetail("services", services);
         }
         else {
            client.probe();
            builder.status(new Status("UP", description));
         }
      }
      catch (Exception e) {
         this.log.error("Error", e);
         builder.down(e);
      }
   }
   else {
      builder.status(new Status(Status.UNKNOWN.getCode(), "Discovery Client not initialized"));
   }
   return builder.build();
}

com.alibaba.cloud.nacos.discovery.NacosServiceDiscovery#getServices:

public List<String> getServices() throws NacosException {
   String group = discoveryProperties.getGroup();
   ListView<String> services = namingService().getServicesOfServer(1,
         Integer.MAX_VALUE, group);
   return services.getData();
}

com.alibaba.nacos.client.naming.net.NamingProxy#getServiceList(int, int, java.lang.String, com.alibaba.nacos.api.selector.AbstractSelector)

public ListView<String> getServiceList(int pageNo, int pageSize, String groupName, AbstractSelector selector)
        throws NacosException {
    
    Map<String, String> params = new HashMap<String, String>(4);
    params.put("pageNo", String.valueOf(pageNo));
    params.put("pageSize", String.valueOf(pageSize));
    params.put(CommonParams.NAMESPACE_ID, namespaceId);
    params.put(CommonParams.GROUP_NAME, groupName);
    
    if (selector != null) {
        switch (SelectorType.valueOf(selector.getType())) {
            case none:
                break;
            case label:
                ExpressionSelector expressionSelector = (ExpressionSelector) selector;
                params.put("selector", JacksonUtils.toJson(expressionSelector));
                break;
            default:
                break;
        }
    }
    // todo GET请求
    String result = reqApi(UtilAndComs.nacosUrlBase + "/service/list", params, HttpMethod.GET);
    
    JsonNode json = JacksonUtils.toObj(result);
    ListView<String> listView = new ListView<String>();
    listView.setCount(json.get("count").asInt());
    listView.setData(JacksonUtils.toObj(json.get("doms").toString(), new TypeReference<List<String>>() {
    }));
    
    return listView;
}

获取所有服务:GET请求 url:/nacos/v1/ns/service/list

2. 方法调用图

Nacos注册中心4-Client端(获取所有服务请求)

参考文章

nacos-1.4.1源码分析(注释) springcloud-source-study学习github地址 深度解析nacos注册中心 mac系统如何安装nacos