Nacos NamingService
NamingService 核心功能 2.x
NamingService
是Nacos提供的服务发现核心接口,主要功能包括服务注册、发现、订阅及健康管理等。以下是其核心功能分类:
1. 服务注册与注销
registerInstance(String serviceName, String ip, int port)
注册服务实例到指定服务名(默认集群DEFAULT
,分组DEFAULT_GROUP
)registerInstance(String serviceName, String groupName, Instance instance)
支持自定义分组、集群、元数据等参数的实例注册deregisterInstance(String serviceName, String ip, int port)
从服务中注销指定实例
2. 服务发现
selectInstances(String serviceName, boolean healthy)
查询服务实例列表(可筛选健康实例)selectInstances(String serviceName, String groupName, List<String> clusters, boolean healthy)
支持按分组、集群条件查询实例getAllInstances(String serviceName)
获取服务全部实例(包括不健康实例)
3. 订阅与监听
subscribe(String serviceName, EventListener listener)
订阅服务变更事件(默认分组和集群)subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener)
自定义条件的服务订阅unsubscribe(String serviceName, EventListener listener)
取消服务变更监听
4. 服务分组与集群
getServicesOfServer(int pageNo, int pageSize)
分页获取当前命名空间下的服务列表getServicesOfServer(int pageNo, int pageSize, String groupName)
按分组获取服务列表
发送元数据:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.context.event.ContextRefreshedEvent;
@Component
public class ServiceRegisterListener {
@Autowired
private Registration registration;
@Autowired
private PrintConfig printConfig;
@EventListener(ContextRefreshedEvent.class)
public void onApplicationEvent() {
// 将打印配置信息添加到服务元数据中
registration.getMetadata().put("branch", printConfig.getBranch());
registration.getMetadata().put("printer", printConfig.getPrinter());
}
}
订阅
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.EventListener;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
@Component
public class NacosServiceListener implements CommandLineRunner {
@Autowired
private NacosServiceManager nacosServiceManager;
@Autowired
private DiscoveryClient discoveryClient;
@Value("${spring.cloud.nacos.discovery.server-addr}")
private String serverAddr;
@Override
public void run(String... args) throws Exception {
// 注册对 print-service-b 的监听
subscribeServiceInstances("client");
}
private void subscribeServiceInstances(String serviceName) throws NacosException {
NamingService namingService = nacosServiceManager.getNamingService();
namingService.subscribe(serviceName, new EventListener() {
@Override
public void onEvent(Event event) {
if (event instanceof NamingEvent) {
NamingEvent namingEvent = (NamingEvent) event;
updateServiceConfig(namingEvent);
}
}
});
}
private void updateServiceConfig(NamingEvent event) {
// 清空现有配置
configManager.getAllConfigs().keySet().forEach(configManager::removeConfig);
// 更新所有实例信息
for (Instance instance : event.getInstances()) {
if (instance.isEnabled() && instance.isHealthy()) {
String branch = instance.getMetadata().get("branch");
String printer = instance.getMetadata().get("printer");
System.out.println("服务配置更新: 分行号=" + branch + ", 打印机=" + printer);
}
}
}
}
}