A Go library for dynamic configuration management with support for seeding from multiple sources and live monitoring via Consul/Redis.
Harvester is a Go library for dynamic configuration management that allows applications to load and monitor configuration values from multiple sources like environment variables, Consul, Redis, and CLI flags. It solves the problem of static configuration by enabling live updates without application restarts.
Go developers building microservices or distributed systems that require flexible, runtime-configurable settings and integration with external configuration stores like Consul or Redis.
Developers choose Harvester for its seamless multi-source support, thread-safe concurrent access, and real-time monitoring capabilities, which simplify configuration management and enhance application adaptability in dynamic environments.
Harvest configuration, watch and notify subscriber
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Supports configuration seeding from hard-coded values, environment variables, CLI flags, local files, Consul, and Redis, with a clear priority order as shown in the README's struct example.
Monitors Consul and Redis for changes and applies updates in real-time without application restart, enabling live reconfiguration for microservices.
Provides concurrent-safe types like sync.String and sync.Int64, ensuring safe manipulation in multi-threaded Go environments, as detailed in the supported types section.
Includes a Secret type that automatically masks values (showing '***') in logs, protecting sensitive data like passwords and tokens from exposure.
Only supports plain text files for configuration, not structured formats like YAML or JSON, which are commonly used in modern applications, limiting flexibility.
Full dynamic monitoring requires Consul or Redis, adding infrastructure complexity and potential vendor lock-in for teams not already using these services.
The builder pattern and need to configure seeders and monitors for each source can lead to verbose and error-prone initialization code, as illustrated in the setup snippet.