Skip to main content

A decorator-based Python library for automatic Nacos service registration

Project description

NacosX

English | 中文

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-service to Nacos
  • ✓ Sends periodic heartbeats
  • ✓ Re-registers if heartbeats fail multiple times
  • ✓ Deregisters gracefully on Ctrl+C or 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:
    # Service is automatically registered here
    run_my_service()
    # 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

  1. Registration: When your decorated function starts, NacosX registers the service with Nacos
  2. Heartbeat: A background thread sends periodic heartbeats to keep the service alive
  3. Self-Healing: If heartbeats fail consecutively, NacosX attempts re-registration
  4. Graceful Shutdown: On SIGINT/SIGTERM, the service is deregistered before exit

📝 Requirements


📄 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.

GitHub: https://github.com/ProgrammerPlus1998/NacosX

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nacosx-0.1.dev0.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nacosx-0.1.dev0-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file nacosx-0.1.dev0.tar.gz.

File metadata

  • Download URL: nacosx-0.1.dev0.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for nacosx-0.1.dev0.tar.gz
Algorithm Hash digest
SHA256 410a2713c5f43b505569eba143ac929bcae266917d60a734f93c3b1540478d5c
MD5 6bc654c5a49e55c2bd180f3121e2d1db
BLAKE2b-256 750eb5d37e9a6600ed10c86ba3040cca78900af1157abaa8dcb0375c16d81379

See more details on using hashes here.

File details

Details for the file nacosx-0.1.dev0-py3-none-any.whl.

File metadata

  • Download URL: nacosx-0.1.dev0-py3-none-any.whl
  • Upload date:
  • Size: 8.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for nacosx-0.1.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 988cca13981eda1b11485f5f9e5f66651f1ee633c06ced33842833ecf1f620f9
MD5 9e8b4b0e7b778b8d7037e43e0bb2c96f
BLAKE2b-256 9830af806a3b0ed4342ca472c03a4caa5b21730c077c3a83d05917ac374a7e6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page