Nacos client library for dynamic service discovery and configuration management in cloud native applications and microservices platforms
—
Service registration, discovery, and health monitoring with support for weighted load balancing, cluster management, and real-time instance updates. Includes batch operations and event-driven programming model.
Register and deregister service instances with comprehensive metadata support.
public interface NamingService {
// Register instance with service name, IP, and port
void registerInstance(String serviceName, String ip, int port) throws NacosException;
// Register instance with group specification
void registerInstance(String serviceName, String groupName, String ip, int port) throws NacosException;
// Register instance object with full configuration
void registerInstance(String serviceName, Instance instance) throws NacosException;
// Register instance with group and instance object
void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException;
// Batch register multiple instances
void batchRegisterInstance(String serviceName, String groupName, List<Instance> instances) throws NacosException;
// Deregister instance by IP and port
void deregisterInstance(String serviceName, String ip, int port) throws NacosException;
// Deregister instance with group specification
void deregisterInstance(String serviceName, String groupName, String ip, int port) throws NacosException;
// Deregister instance object
void deregisterInstance(String serviceName, Instance instance) throws NacosException;
// Deregister instance with group and instance object
void deregisterInstance(String serviceName, String groupName, Instance instance) throws NacosException;
// Batch deregister multiple instances
void batchDeregisterInstance(String serviceName, String groupName, List<Instance> instances) throws NacosException;
}import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.pojo.Instance;
// Create naming service
Properties props = new Properties();
props.setProperty("serverAddr", "localhost:8848");
NamingService namingService = NamingFactory.createNamingService(props);
// Simple registration
namingService.registerInstance("user-service", "192.168.1.100", 8080);
// Register with metadata
Instance instance = new Instance();
instance.setIp("192.168.1.100");
instance.setPort(8080);
instance.setWeight(2.0);
instance.setClusterName("beijing");
instance.setHealthy(true);
instance.setEnabled(true);
instance.setEphemeral(true);
// Add custom metadata
Map<String, String> metadata = new HashMap<>();
metadata.put("version", "1.0.0");
metadata.put("region", "us-west");
instance.setMetadata(metadata);
namingService.registerInstance("user-service", "PROD_GROUP", instance);
// Batch registration
List<Instance> instances = Arrays.asList(instance1, instance2, instance3);
namingService.batchRegisterInstance("user-service", "PROD_GROUP", instances);
// Batch deregistration
namingService.batchDeregisterInstance("user-service", "PROD_GROUP", instances);Discover service instances with filtering and selection capabilities.
public interface NamingService {
// Get all instances of a service
List<Instance> getAllInstances(String serviceName) throws NacosException;
// Get all instances with group specification
List<Instance> getAllInstances(String serviceName, String groupName) throws NacosException;
// Get healthy or unhealthy instances
List<Instance> getAllInstances(String serviceName, boolean healthy) throws NacosException;
// Get instances from specific clusters
List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;
// Get all instances with full options
List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe) throws NacosException;
// Select healthy instances only
List<Instance> selectInstances(String serviceName, boolean healthy) throws NacosException;
// Select instances with group and health filter
List<Instance> selectInstances(String serviceName, String groupName, boolean healthy) throws NacosException;
// Select instances with cluster filter
List<Instance> selectInstances(String serviceName, String groupName, List<String> clusters, boolean healthy) throws NacosException;
// Select one healthy instance (load balancing)
Instance selectOneHealthyInstance(String serviceName) throws NacosException;
// Select one healthy instance with group
Instance selectOneHealthyInstance(String serviceName, String groupName) throws NacosException;
// Select one healthy instance from specific clusters
Instance selectOneHealthyInstance(String serviceName, String groupName, List<String> clusters) throws NacosException;
}// Get all instances
List<Instance> allInstances = namingService.getAllInstances("user-service");
// Get healthy instances only
List<Instance> healthyInstances = namingService.selectInstances("user-service", true);
// Get instances from specific clusters
List<String> clusters = Arrays.asList("beijing", "shanghai");
List<Instance> clusterInstances = namingService.getAllInstances("user-service", clusters);
// Load balancing - select one healthy instance
Instance instance = namingService.selectOneHealthyInstance("user-service");
if (instance != null) {
String serviceUrl = "http://" + instance.getIp() + ":" + instance.getPort();
// Make HTTP call to service
}
// Advanced filtering with group and clusters
List<Instance> prodInstances = namingService.selectInstances(
"user-service",
"PROD_GROUP",
Arrays.asList("us-west", "us-east"),
true // healthy only
);Real-time notifications of service instance changes through event listeners.
public interface NamingService {
// Subscribe to service instance changes
void subscribe(String serviceName, EventListener listener) throws NacosException;
// Subscribe with group specification
void subscribe(String serviceName, String groupName, EventListener listener) throws NacosException;
// Subscribe with cluster filter
void subscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;
// Subscribe with full options
void subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener) throws NacosException;
// Unsubscribe from service changes
void unsubscribe(String serviceName, EventListener listener) throws NacosException;
// Unsubscribe with group
void unsubscribe(String serviceName, String groupName, EventListener listener) throws NacosException;
// Unsubscribe with clusters
void unsubscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;
// Unsubscribe with full options
void unsubscribe(String serviceName, String groupName, List<String> clusters, EventListener listener) throws NacosException;
}
// Event listener interface
public interface EventListener {
void onEvent(Event event);
}
// Naming event containing service changes
public class NamingEvent extends Event {
private String serviceName;
private String groupName;
private String clusters;
private List<Instance> instances;
public String getServiceName();
public String getGroupName();
public String getClusters();
public List<Instance> getInstances();
}import com.alibaba.nacos.api.naming.listener.EventListener;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
// Create event listener
EventListener listener = new EventListener() {
@Override
public void onEvent(Event event) {
if (event instanceof NamingEvent) {
NamingEvent namingEvent = (NamingEvent) event;
System.out.println("Service changed: " + namingEvent.getServiceName());
List<Instance> instances = namingEvent.getInstances();
System.out.println("Current instances: " + instances.size());
// Update local service registry
updateLocalRegistry(namingEvent.getServiceName(), instances);
}
}
};
// Subscribe to service changes
namingService.subscribe("user-service", listener);
// Subscribe with cluster filter
namingService.subscribe("user-service", "PROD_GROUP",
Arrays.asList("beijing", "shanghai"), listener);Pattern-based service watching for monitoring multiple services with wildcards.
public interface NamingService {
// Start fuzzy watching with group pattern only
void fuzzyWatch(String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException;
// Start fuzzy watching with both service and group patterns
void fuzzyWatch(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException;
// Start fuzzy watching and return matching service keys
Future<ListView<String>> fuzzyWatchWithServiceKeys(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException;
// Cancel fuzzy watching
void cancelFuzzyWatch(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException;
}
// Fuzzy watch event watcher interface
public interface FuzzyWatchEventWatcher {
// Handle set of naming events
void onEvent(Set<NamingEvent> events);
}import com.alibaba.nacos.api.naming.listener.FuzzyWatchEventWatcher;
// Watch all microservices with pattern
FuzzyWatchEventWatcher watcher = new FuzzyWatchEventWatcher() {
@Override
public void onEvent(Set<NamingEvent> events) {
for (NamingEvent event : events) {
System.out.println("Service changed: " + event.getServiceName());
updateServiceRegistry(event.getServiceName(), event.getInstances());
}
}
};
// Watch all services ending with "-service" in DEFAULT_GROUP
namingService.fuzzyWatch("*-service", "DEFAULT_GROUP", watcher);
// Watch all services in production group (group pattern only)
namingService.fuzzyWatch("PROD_GROUP", watcher);
// Watch all services in groups matching pattern
namingService.fuzzyWatch("*", "PROD_*", watcher);Service listing and metadata management operations.
public interface NamingService {
// Get paginated list of services
ListView<String> getServicesOfServer(int pageNo, int pageSize) throws NacosException;
// Get services with group filter
ListView<String> getServicesOfServer(int pageNo, int pageSize, String groupName) throws NacosException;
// Get services with selector
ListView<String> getServicesOfServer(int pageNo, int pageSize, AbstractSelector selector) throws NacosException;
// Get services with full options
ListView<String> getServicesOfServer(int pageNo, int pageSize, String groupName, AbstractSelector selector) throws NacosException;
// Get all subscribed services of current client
List<ServiceInfo> getSubscribeServices() throws NacosException;
// Get server status
String getServerStatus();
// Shutdown service
void shutDown() throws NacosException;
}public class Instance {
private String instanceId;
private String ip;
private int port;
private double weight;
private boolean healthy;
private boolean enabled;
private boolean ephemeral;
private String clusterName;
private String serviceName;
private Map<String, String> metadata;
// Constructors
public Instance();
// Core properties
public String getInstanceId();
public void setInstanceId(String instanceId);
public String getIp();
public void setIp(String ip);
public int getPort();
public void setPort(int port);
// Load balancing weight
public double getWeight();
public void setWeight(double weight);
// Health and availability
public boolean isHealthy();
public void setHealthy(boolean healthy);
public boolean isEnabled();
public void setEnabled(boolean enabled);
// Persistence mode
public boolean isEphemeral();
public void setEphemeral(boolean ephemeral);
// Cluster assignment
public String getClusterName();
public void setClusterName(String clusterName);
// Service association
public String getServiceName();
public void setServiceName(String serviceName);
// Custom attributes
public Map<String, String> getMetadata();
public void setMetadata(Map<String, String> metadata);
// Utility methods
public String toInetAddr();
public boolean containsMetadata(String key, String value);
}public class ServiceInfo {
private String name;
private String groupName;
private String clusters;
private List<Instance> hosts;
private long cacheMillis;
private long lastRefTime;
private String checksum;
private boolean allIPs;
private boolean reachProtectionThreshold;
// Service identification
public String getName();
public void setName(String name);
public String getGroupName();
public void setGroupName(String groupName);
// Cluster information
public String getClusters();
public void setClusters(String clusters);
// Instance list
public List<Instance> getHosts();
public void setHosts(List<Instance> hosts);
// Caching and refresh
public long getCacheMillis();
public void setCacheMillis(long cacheMillis);
public long getLastRefTime();
public void setLastRefTime(long lastRefTime);
// Validation and protection
public String getChecksum();
public boolean isReachProtectionThreshold();
// Utility methods
public String getKey();
public String getKeyEncoded();
public boolean validate();
}public class Service {
private String name;
private String groupName;
private String appName;
private float protectThreshold;
private Map<String, String> metadata;
public String getName();
public void setName(String name);
public String getGroupName();
public void setGroupName(String groupName);
public String getAppName();
public void setAppName(String appName);
public float getProtectThreshold();
public void setProtectThreshold(float protectThreshold);
public Map<String, String> getMetadata();
public void setMetadata(Map<String, String> metadata);
}
public class Cluster {
private String name;
private AbstractHealthChecker healthChecker;
private int defaultPort;
private int defaultCheckPort;
private boolean useIPPort4Check;
private Map<String, String> metadata;
public String getName();
public void setName(String name);
public AbstractHealthChecker getHealthChecker();
public void setHealthChecker(AbstractHealthChecker healthChecker);
public int getDefaultPort();
public void setDefaultPort(int defaultPort);
public Map<String, String> getMetadata();
public void setMetadata(Map<String, String> metadata);
}public class ListView<T> {
private int count;
private List<T> data;
public int getCount();
public void setCount(int count);
public List<T> getData();
public void setData(List<T> data);
}
// Abstract selector for filtering
public abstract class AbstractSelector {
private String type;
public String getType();
public void setType(String type);
public abstract String toJsonString();
}
// Expression-based selector
public class ExpressionSelector extends AbstractSelector {
private String expression;
public String getExpression();
public void setExpression(String expression);
@Override
public String toJsonString();
}public class NamingUtils {
public static final String NAMING_INSTANCE_ID_SPLITTER = "#";
public static final String DEFAULT_GROUP = "DEFAULT_GROUP";
// Service name parsing
public static String getServiceName(String serviceNameWithGroup);
public static String getGroupName(String serviceNameWithGroup);
public static String getGroupedName(String serviceName, String groupName);
// Instance utilities
public static String getInstanceId(Instance instance);
// Validation
public static void checkServiceName(String serviceName);
public static void checkInstanceIsLegal(Instance instance);
}Install with Tessl CLI
npx tessl i tessl/maven-com-alibaba-nacos--nacos-client