Introduction to etcd3
etcd3 is a highly available and distributed key-value store that is used for configuration management, service discovery, and synchronization in distributed systems. It is known for its reliability, ease of use, and robustness, making it a popular choice among developers for managing distributed systems.
In this blog post, we will introduce you to dozens of useful APIs provided by etcd3, along with code snippets that demonstrate their usage. By the end of this post, you will have a solid understanding of how to interact with etcd3 for various operations.
API Examples
Connecting to etcd3
To start interacting with etcd3, you need to create a client connection.
from etcd3 import Etcd3Client client = Etcd3Client(host='localhost', port=2379)
Put Key-Value Pair
Store a key-value pair in etcd3:
client.put('key', 'value')
Get Value by Key
Retrieve the value associated with a key:
value, _ = client.get('key') print(value.decode('utf-8'))
Delete Key
Remove a key-value pair from etcd3:
client.delete('key')
List Keys
List all keys in etcd3:
keys = client.get_all_keys() for key in keys: print(key.decode('utf-8'))
Watch for Changes
Watch for changes to a specific key:
events_iterator, cancel = client.watch('key') for event in events_iterator: if event.event_type == 'put': print(f"Key {event.key.decode('utf-8')} changed to {event.value.decode('utf-8')}")
Lease
Create a lease to expire keys automatically:
lease = client.lease(5) # Lease for 5 seconds client.put('key', 'value', lease=lease)
Transactions
Perform conditional operations using transactions:
txn_response = client.transaction( compare=[ client.transactions.value('key') == 'old_value' ], success=[ client.transactions.put('key', 'new_value') ], failure=[], )
Application Example
Let’s create a simple application that uses these APIs for service registration and discovery.
Service Registration
def register_service(client, service_name, host, port, ttl): lease = client.lease(ttl) client.put(f'services/{service_name}/{host}:{port}', 'available', lease=lease) register_service(client, 'my-service', '192.168.1.100', 8080, 10)
Service Discovery
def discover_services(client, service_name): services = client.get_prefix(f'services/{service_name}') return [service for service in services] services = discover_services(client, 'my-service') for service in services: print(service[0].decode('utf-8'))
Main Application Loop
import time def main(): while True: print("Checking services...") services = discover_services(client, 'my-service') pprint.pprint(services) time.sleep(5) if __name__ == "__main__": main()
With this application, services register themselves in etcd3 and other parts of the system can discover these services dynamically.
We hope you find this guide on etcd3 APIs helpful in implementing your distributed systems. Whether you are storing configuration data, performing service discovery, or implementing distributed locks, etcd3 provides a comprehensive set of features to streamline your development.
Happy coding!