A Python implementation of Nacos OpenAPI for service discovery, configuration management, and service management
—
Legacy synchronous API for Nacos configuration operations. This API provides basic configuration management functionality using HTTP requests with threading-based operations for backward compatibility.
Create a synchronous Nacos client for configuration operations.
class NacosClient:
def __init__(self, server_addresses=None, endpoint=None, namespace=None, ak=None, sk=None,
username=None, password=None, app_name=None, app_key=None, log_dir=None,
log_level=None, log_rotation_backup_count=None, **kwargs):
"""
Initialize Nacos client.
Args:
server_addresses (str): Comma-separated list of Nacos server addresses
endpoint (str): Address server endpoint for dynamic server discovery
namespace (str): Nacos namespace ID
ak (str): Access key for authentication
sk (str): Secret key for authentication
username (str): Username for authentication
password (str): Password for authentication
app_name (str): Application name
app_key (str): Application key
log_dir (str): Directory for log files
log_level: Logging level
log_rotation_backup_count (int): Number of backup log files
"""Usage example:
from nacos import NacosClient
# Basic client with server addresses
client = NacosClient(server_addresses="127.0.0.1:8848,127.0.0.1:8849")
# Client with authentication
client = NacosClient(
server_addresses="127.0.0.1:8848",
namespace="production",
username="nacos",
password="nacos"
)
# Client with access key authentication
client = NacosClient(
server_addresses="127.0.0.1:8848",
ak="your-access-key",
sk="your-secret-key"
)Retrieve configuration values from Nacos server.
def get_config(self, data_id: str, group: str, timeout=None, no_snapshot=None) -> str:
"""
Get configuration from Nacos server.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
timeout (int, optional): Request timeout in seconds
no_snapshot (bool, optional): Disable local snapshot fallback
Returns:
str: Configuration content
Raises:
NacosException: If data_id or group is invalid
NacosRequestException: If request fails
"""Usage example:
# Get configuration
config = client.get_config("database.config", "DEFAULT_GROUP")
print(config)
# Get with custom timeout
config = client.get_config("database.config", "DEFAULT_GROUP", timeout=10)
# Get with snapshot disabled
config = client.get_config("database.config", "DEFAULT_GROUP", no_snapshot=True)Publish or update configuration values on Nacos server.
def publish_config(self, data_id: str, group: str, content: str, app_name=None,
config_type=None, timeout=None) -> bool:
"""
Publish configuration to Nacos server.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
content (str): Configuration content
app_name (str, optional): Application name
config_type (str, optional): Configuration type (e.g., 'json', 'yaml', 'properties')
timeout (int, optional): Request timeout in seconds
Returns:
bool: True if successful
Raises:
NacosException: If data_id or group is invalid
NacosRequestException: If request fails
"""Usage example:
# Publish simple configuration
client.publish_config("database.config", "DEFAULT_GROUP", "host=localhost\nport=3306")
# Publish JSON configuration
config_content = '{"host": "localhost", "port": 3306}'
client.publish_config("database.config", "DEFAULT_GROUP", config_content, config_type="json")
# Publish with app name
client.publish_config("database.config", "DEFAULT_GROUP", config_content, app_name="my-app")Remove configuration from Nacos server.
def remove_config(self, data_id: str, group: str, timeout=None) -> bool:
"""
Remove configuration from Nacos server.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
timeout (int, optional): Request timeout in seconds
Returns:
bool: True if successful
Raises:
NacosException: If data_id or group is invalid
NacosRequestException: If request fails
"""Usage example:
# Remove configuration
success = client.remove_config("database.config", "DEFAULT_GROUP")
if success:
print("Configuration removed successfully")Add and manage configuration change listeners.
def add_config_watcher(self, data_id: str, group: str, cb, content=None):
"""
Add configuration change listener.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
cb (callable): Callback function to handle configuration changes
content (str, optional): Initial content for comparison
"""
def add_config_watchers(self, data_id: str, group: str, cb_list, content=None):
"""
Add multiple configuration change listeners.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
cb_list (list): List of callback functions
content (str, optional): Initial content for comparison
"""
def remove_config_watcher(self, data_id: str, group: str, cb, remove_all=False):
"""
Remove configuration change listener.
Args:
data_id (str): Configuration data ID
group (str): Configuration group
cb (callable): Callback function to remove
remove_all (bool): Remove all listeners for this config
"""Usage example:
def config_change_handler(args):
print(f"Configuration changed: {args}")
# Handle configuration change
# Add single listener
client.add_config_watcher("database.config", "DEFAULT_GROUP", config_change_handler)
# Add multiple listeners
def backup_handler(args):
print(f"Backup handler: {args}")
client.add_config_watchers("database.config", "DEFAULT_GROUP",
[config_change_handler, backup_handler])
# Remove specific listener
client.remove_config_watcher("database.config", "DEFAULT_GROUP", config_change_handler)
# Remove all listeners
client.remove_config_watcher("database.config", "DEFAULT_GROUP", None, remove_all=True)Retrieve multiple configurations in a single request.
def get_configs(self, timeout=None, no_snapshot=None, group="", page_no=1, page_size=1000) -> dict:
"""
Get multiple configurations with pagination.
Args:
timeout (int, optional): Request timeout in seconds
no_snapshot (bool, optional): Disable local snapshot fallback
group (str): Configuration group filter
page_no (int): Page number (1-based)
page_size (int): Number of configurations per page
Returns:
dict: Dictionary containing configurations and pagination info
"""Usage example:
# Get all configurations
configs = client.get_configs()
print(f"Total configs: {configs.get('totalCount', 0)}")
# Get configurations with pagination
configs = client.get_configs(page_no=1, page_size=50)
for config in configs.get('pageItems', []):
print(f"Config: {config['dataId']} = {config['content']}")
# Get configurations from specific group
configs = client.get_configs(group="DEFAULT_GROUP")class NacosException(Exception):
"""Base exception for Nacos operations."""
pass
class NacosRequestException(NacosException):
"""Exception for HTTP request failures."""
passCommon error scenarios:
from nacos import NacosClient, NacosException, NacosRequestException
try:
client = NacosClient(server_addresses="127.0.0.1:8848")
config = client.get_config("test-config", "DEFAULT_GROUP")
except NacosRequestException as e:
print(f"Request failed: {e}")
except NacosException as e:
print(f"Nacos error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")DEFAULT_GROUP_NAME = "DEFAULT_GROUP"
DEFAULTS = {
"APP_NAME": "Nacos-SDK-Python",
"TIMEOUT": 3,
"PULLING_TIMEOUT": 30,
"PULLING_CONFIG_SIZE": 3000,
"CALLBACK_THREAD_NUM": 10,
"FAILOVER_BASE": "nacos-data/data",
"SNAPSHOT_BASE": "nacos-data/snapshot"
}Install with Tessl CLI
npx tessl i tessl/pypi-nacos-sdk-python