Nacos client library for dynamic service discovery and configuration management in cloud native applications and microservices platforms
—
Centralized configuration management with real-time updates, change listeners, atomic CAS operations, and pattern-based watching. Supports multiple configuration formats with filtering mechanisms for request/response processing.
Basic configuration retrieval, publishing, and removal operations for managing application configurations.
public interface ConfigService {
// Get configuration content
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
// Get configuration and register listener simultaneously
String getConfigAndSignListener(String dataId, String group, long timeoutMs, Listener listener) throws NacosException;
// Publish configuration
boolean publishConfig(String dataId, String group, String content) throws NacosException;
// Publish configuration with type specification
boolean publishConfig(String dataId, String group, String content, String type) throws NacosException;
// Atomic compare-and-swap publish operation
boolean publishConfigCas(String dataId, String group, String content, String casMd5) throws NacosException;
// Remove configuration
boolean removeConfig(String dataId, String group) throws NacosException;
// Get server status
String getServerStatus();
// Shutdown service
void shutDown() throws NacosException;
}import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.ConfigFactory;
import com.alibaba.nacos.api.exception.NacosException;
// Create config service
Properties props = new Properties();
props.setProperty("serverAddr", "localhost:8848");
ConfigService configService = ConfigFactory.createConfigService(props);
// Get configuration with timeout
String config = configService.getConfig("database.properties", "DEFAULT_GROUP", 5000);
// Publish configuration
boolean success = configService.publishConfig(
"database.properties",
"DEFAULT_GROUP",
"url=jdbc:mysql://localhost:3306/mydb\nusername=admin"
);
// CAS operation for atomic updates
String currentMd5 = "abc123"; // MD5 of current config
boolean updated = configService.publishConfigCas(
"database.properties",
"DEFAULT_GROUP",
"url=jdbc:mysql://newhost:3306/mydb\nusername=admin",
currentMd5
);Real-time configuration change notifications through listener pattern.
public interface ConfigService {
// Add configuration change listener
void addListener(String dataId, String group, Listener listener) throws NacosException;
// Remove configuration change listener
void removeListener(String dataId, String group, Listener listener);
}
// Base listener interface
public interface Listener {
// Receive configuration updates
void receiveConfigInfo(String configInfo);
// Get executor for async processing (optional)
Executor getExecutor();
}
// Abstract base class for listeners
public abstract class AbstractListener implements Listener {
public abstract void receiveConfigInfo(String configInfo);
@Override
public Executor getExecutor() {
return null; // Use default executor
}
}import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.config.listener.AbstractListener;
// Simple listener implementation
Listener listener = new AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("Configuration updated: " + configInfo);
// Reload application configuration
reloadConfig(configInfo);
}
};
// Register listener
configService.addListener("database.properties", "DEFAULT_GROUP", listener);
// Custom executor listener
Listener asyncListener = new AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
// Handle configuration change
handleConfigChange(configInfo);
}
@Override
public Executor getExecutor() {
return Executors.newSingleThreadExecutor();
}
};Pattern-based configuration watching for monitoring multiple configurations with wildcards.
public interface ConfigService {
// Start fuzzy watching with group pattern only
void fuzzyWatch(String groupNamePattern, FuzzyWatchEventWatcher watcher) throws NacosException;
// Start fuzzy watching with both dataId and group patterns
void fuzzyWatch(String dataIdPattern, String groupNamePattern, FuzzyWatchEventWatcher watcher) throws NacosException;
// Start fuzzy watching and return matching group keys
Future<Set<String>> fuzzyWatchWithGroupKeys(String groupNamePattern, FuzzyWatchEventWatcher watcher) throws NacosException;
// Cancel fuzzy watching
void cancelFuzzyWatch(String dataIdPattern, String groupNamePattern, FuzzyWatchEventWatcher watcher) throws NacosException;
}
// Fuzzy watch event watcher interface
public interface FuzzyWatchEventWatcher {
// Handle set of configuration change events
void onEvent(Set<ConfigChangeEvent> events);
}import com.alibaba.nacos.api.config.listener.FuzzyWatchEventWatcher;
import com.alibaba.nacos.api.config.ConfigChangeEvent;
// Watch all database-related configurations
FuzzyWatchEventWatcher watcher = new FuzzyWatchEventWatcher() {
@Override
public void onEvent(Set<ConfigChangeEvent> events) {
for (ConfigChangeEvent event : events) {
System.out.println("Config changed: " + event.getDataId() +
" in group: " + event.getGroup());
if (event.getChangeType() == PropertyChangeType.MODIFIED) {
System.out.println("Old: " + event.getOldContent());
System.out.println("New: " + event.getContent());
}
}
}
};
// Watch pattern: all .properties files in DATABASE_GROUP
configService.fuzzyWatch("*.properties", "DATABASE_GROUP", watcher);
// Watch all configurations in a group (group pattern only)
configService.fuzzyWatch("CACHE_GROUP", watcher);
// Watch with both patterns - all configs in groups matching pattern
configService.fuzzyWatch("*", "CACHE_*", watcher);Request and response filtering for configuration operations.
// Configuration filter interface
public interface IConfigFilter {
void init(FilterConfig filterConfig);
void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain) throws NacosException;
}
// Abstract filter base class
public abstract class AbstractConfigFilter implements IConfigFilter {
@Override
public void init(FilterConfig filterConfig) {
// Default implementation
}
public abstract void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain) throws NacosException;
}
// Filter request interface
public interface IConfigRequest {
String getDataId();
String getGroup();
String getContent();
IConfigContext getConfigContext();
}
// Filter response interface
public interface IConfigResponse {
String getContent();
void setContent(String content);
IConfigContext getConfigContext();
}// Configuration change event
public class ConfigChangeEvent {
private String dataId;
private String group;
private String namespace;
private String content;
private String oldContent;
private PropertyChangeType changeType;
public String getDataId();
public String getGroup();
public String getNamespace();
public String getContent();
public String getOldContent();
public PropertyChangeType getChangeType();
}
// Individual configuration item change
public class ConfigChangeItem {
private String key;
private String oldValue;
private String newValue;
private PropertyChangeType type;
public String getKey();
public String getOldValue();
public String getNewValue();
public PropertyChangeType getType();
}// Configuration content types
public enum ConfigType {
PROPERTIES("properties"),
XML("xml"),
JSON("json"),
TEXT("text"),
HTML("html"),
YAML("yaml"),
TOML("toml"),
UNSET("unset");
public String getType();
}
// Property change types
public enum PropertyChangeType {
ADDED, // Property was added
MODIFIED, // Property was changed
DELETED // Property was removed
}
// Configuration property keys
public class PropertyKeyConst {
// Server configuration
public static final String SERVER_ADDR = "serverAddr";
public static final String CONTEXT_PATH = "contextPath";
public static final String CLUSTER_NAME = "clusterName";
public static final String ENCODE = "encode";
// Authentication
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String ACCESS_KEY = "accessKey";
public static final String SECRET_KEY = "secretKey";
// Configuration specific
public static final String CONFIG_LONG_POLL_TIMEOUT = "configLongPollTimeout";
public static final String CONFIG_RETRY_TIME = "configRetryTime";
public static final String MAX_RETRY = "maxRetry";
public static final String ENABLE_REMOTE_SYNC_CONFIG = "enableRemoteSyncConfig";
}// Configuration value injection
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface NacosValue {
String value();
boolean autoRefreshed() default false;
}
// Configuration properties binding
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NacosConfigurationProperties {
String dataId();
String groupId() default "DEFAULT_GROUP";
boolean autoRefreshed() default false;
String type() default "properties";
}
// Configuration change listener
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NacosConfigListener {
String dataId();
String groupId() default "DEFAULT_GROUP";
}
// Ignore field during configuration binding
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NacosIgnore {
}// Configuration content converter interface
public interface NacosConfigConverter<T> {
// Check if can convert to target type
boolean canConvert(Class<T> targetType);
// Convert configuration content to target type
T convert(String config);
}Install with Tessl CLI
npx tessl i tessl/maven-com-alibaba-nacos--nacos-client