A decorator-based Python library for automatic Nacos service registration
Project description
NacosX
NacosX is a decorator-based Python library designed to make service registration and discovery with Nacos effortless.
It automates the entire lifecycle — registration, heartbeat maintenance, re-registration on failure, and graceful shutdown — with just one decorator.
Built on top of nacos-sdk-python, NacosX provides a higher-level, decorator-based abstraction for seamless integration.
🌟 Key Features
- 🚀 One-line decorator to register your gRPC or HTTP service with Nacos
- 💓 Automatic heartbeat with failure detection and self-healing
- 🔄 Retry mechanism for registration and reconnection
- 🧘 Graceful shutdown with SIGINT / SIGTERM handling
- 🧩 Thread-safe and async-compatible, supporting both sync and async functions
- 🔧 Custom metadata and namespace support
- 📦 Designed for Kubernetes/CCE environments where stability and self-healing matter
📦 Installation
pip install nacosx
🔧 Quick Start
Basic Example
import time
from nacosx import nacos_registry
@nacos_registry(
nacos_addr="127.0.0.1:8848",
namespace="dev",
service_name="example-service",
service_addr="192.168.0.101:50051",
)
def main():
print("Service running...")
while True:
time.sleep(1)
if __name__ == "__main__":
main()
✅ What Happens Automatically:
- ✓ Registers
example-serviceto Nacos - ✓ Sends periodic heartbeats
- ✓ Re-registers if heartbeats fail multiple times
- ✓ Deregisters gracefully on
Ctrl+Cor container termination
🎯 Advanced Usage
Custom Metadata
@nacos_registry(
nacos_addr="127.0.0.1:8848",
service_name="my-service",
service_addr="192.168.1.10:8080",
metadata={"version": "1.0.0", "env": "production"},
)
def run_service():
# Your service logic
pass
Async Function Support
import asyncio
from nacosx import nacos_registry
@nacos_registry(
nacos_addr="127.0.0.1:8848",
service_name="async-service",
service_addr="0.0.0.0:8080",
)
async def async_main():
print("Async service running...")
while True:
await asyncio.sleep(1)
if __name__ == "__main__":
asyncio.run(async_main())
Context Manager (Manual Control)
For manual lifecycle control, use NacosService as a context manager:
from nacosx import NacosService
import time
def run_my_service():
print("Service is running...")
time.sleep(10)
with NacosService(
nacos_addr="127.0.0.1:8848",
namespace="dev",
service_name="my-service",
service_ip="192.168.1.10",
service_port=8080,
metadata={"version": "1.0.0"},
) as svc:
run_my_service()
# Then register to Nacos when service is ready
svc.start()
# Service will be automatically deregistered when exiting the context
Or without context manager:
from nacosx import NacosService
svc = NacosService(
nacos_addr="127.0.0.1:8848",
service_name="my-service",
service_ip="192.168.1.10",
service_port=8080,
)
try:
svc.start() # Register and start heartbeat
# Your service logic here
while True:
time.sleep(1)
finally:
svc.stop() # Deregister and stop heartbeat
🛠️ Configuration Options
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
nacos_addr |
str |
✅ | - | Nacos server address (e.g., 127.0.0.1:8848) |
service_name |
str |
✅ | - | Service name to register |
service_addr |
str |
✅ | - | Service address (IP:PORT) |
namespace |
str |
❌ | public |
Nacos namespace |
group_name |
str |
❌ | DEFAULT_GROUP |
Service group name |
cluster_name |
str |
❌ | DEFAULT |
Cluster name |
metadata |
dict |
❌ | {} |
Custom metadata |
heartbeat_interval |
int |
❌ | 5 |
Heartbeat interval in seconds |
max_retry |
int |
❌ | 3 |
Max retry attempts for registration |
🔄 How It Works
- Registration: When your decorated function starts, NacosX registers the service with Nacos
- Heartbeat: A background thread sends periodic heartbeats to keep the service alive
- Self-Healing: If heartbeats fail consecutively, NacosX attempts re-registration
- Graceful Shutdown: On
SIGINT/SIGTERM, the service is deregistered before exit
📝 Requirements
- Python >= 3.7
- nacos-sdk-python >= 2.0.0, < 3.0.0
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Inspired by the need for simpler Nacos integration in Python microservices
- Built with ❤️ for the Python community
📮 Contact
If you have any questions or suggestions, please open an issue on GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nacosx-0.1.dev1.tar.gz.
File metadata
- Download URL: nacosx-0.1.dev1.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b31494ed2ac6b1df815a99532b1f08d2f2462cf4a8fe6d443aa1a15a32f2870
|
|
| MD5 |
b2928d359ad051bf1e65ac5a855fe9f4
|
|
| BLAKE2b-256 |
7b0253bf4b886c052bed795b11ff26ab43db8567675976f7b879addcf1d8c175
|
File details
Details for the file nacosx-0.1.dev1-py3-none-any.whl.
File metadata
- Download URL: nacosx-0.1.dev1-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2f1345ee4b83d560039c3cdb6135aace14d70e37d9ac6c469d145c3bd436875
|
|
| MD5 |
3f35b903cc0d1d2a9e29ec832185e688
|
|
| BLAKE2b-256 |
05322b592cab86c7edbfaa9b5c24d8c60e98d2080e4212c17ed6cacb0d8f9ab3
|