.consulting .solutions .partnership Für´s Karma: Konfiguration zur Laufzeit Alexander Schwartz, Principal IT Consultant JUG Saxony Day Dresden – 02. Oktober 2015 Konfiguration zur Laufzeit 1 Alltägliche Konfigurationsänderungen 2 Archaius: Zugriff auf sich ändernde Konfigurationen 3 etcd: Zentrale Konfigurationsdatenbank 4 Togglz: Aktivieren von neuen Funktionen steuern 5 Besser mit Konfiguration zur Laufzeit? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 2 Mein Sponsor und Arbeitgeber – msg systems ag 1980 gegründet in 13 Städten in Deutschland präsent 23 Länder mehr als 5.000 Kollegen 653 Mio € Umsatz 2014 © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 3 Wer ich bin – Alexander Schwartz 443 gefundene Geocaches 2 Kinder 12 Jahre Java 1 Frau 7 Jahre PL/SQL 3,5 Jahre Direktbank 7 Jahre Absatzfinanzierung © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 @ahus1de 4 Konfiguration zur Laufzeit 1 Alltägliche Konfigurationsänderungen 2 Archaius: Zugriff auf sich ändernde Konfigurationen 3 etcd: Zentrale Konfigurationsdatenbank 4 Togglz: Aktivieren von neuen Funktionen steuern 5 Besser mit Konfiguration zur Laufzeit? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 5 Alltägliche Konfigurationsänderungen Wenn eine Konfigurationsänderung einen Neustart erfordert, so kann dies nur im Wartungsfenster erfolgen Die Kundendatenbank hat eine neue IPAdresse, bitte passe die Konfiguration der Online-Registrierung an. Kein Problem, habe ich geändert, ich muss die Anwendung heute Nacht nur noch neu starten! Bin ich ein Held, weil ich mitten in der Nacht aufstehe, um die Anwendung neu zu starten? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 6 Alltägliche Konfigurationsänderungen Wenn neue Funktionen durch ein Deployment aktiviert werden, ist ein Fallback schwierig möglich Die neue Funktion in der Anwendung, könnt ihr die bitte freischalten? Ok, dann rollen wir die neue Anwendungsversion jetzt aus. Dann können alle Anwender darauf zugreifen. Sollte man das wirklich an einem Freitagabend tun? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 7 Alltägliche Konfigurationsänderungen Konfigurationen zur Laufzeit spart Zeit und Nerven – und vermeidet Wartungsfenster • Parameter der Anwendung zur Laufzeit ändern Ziel-Adressen für Server Verzeichnisnamen Timeouts und fachliche Parameter • Zentrale Konfigurationsdatenbank Konfigurationsparameter Service-Discovery • Aktivieren von neuen Funktionen steuern Für bestimmte Kunden oder Nutzer Für einen Teil der Kunden Zeitgesteuerte Aktivierung © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 8 Alltägliche Konfigurationsänderungen Karma: Jede unserer Handlungen hat eine Folge für uns selbst • Wir sind verantwortlich für unser Tun • Konfigurationsänderung soll zum gewünschten Ergebnis führen – ohne andere zu beeinträchtigen • Einsicht: Konfigurationen ändern sich regelmäßig • Güte: Wir sind freundlich zu den Nutzern und brauchen dafür kein Wartungsfenster • Bescheidenheit: Wir verzichten darauf, als „Helden“ die Konfiguration mitten in der Nacht zu ändern Quelle: unbekannt © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 9 Konfiguration zur Laufzeit 1 Alltägliche Konfigurationsänderungen 2 Archaius: Zugriff auf sich ändernde Konfigurationen 3 etcd: Zentrale Konfigurationsdatenbank 4 Togglz: Aktivieren von neuen Funktionen steuern 5 Besser mit Konfiguration zur Laufzeit? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 10 Netflix Archaius Netflix Archaius regelt den Zugriff auf Parameter für Java-Clients 1. Laden von Konfigurationdaten aus: Properties-Dateien, URLs, Datenbanken 2. Kaskadierte Konfigurationen für: Standardeinstellungen, verschiedene Umgebungen, einzelne Server 3. Typsicherer Zugriff auf den aktuellen Wert 4. Callbacks, wenn sich ein Wert ändert © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 Quelle: http://en.wikipedia.org/wiki/Archaius_tigris (CC) Hans Stieglitz 11 Netflix Archaius Beim Start kann zusätzlich eine Umgebung mitgegeben werden java -Darchaius.deployment.environment=test ... // Java Startup ConfigurationManager.loadCascadedPropertiesFromResources("database"); # database.properties db.url=jdbc:postgresql://localhost:5432/standard-db # database-test.properties db.url=jdbc:postgresql://localhost:5432/test-db © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 12 Netflix Archaius Die Java-Anwendung wird mit Angabe der Konfigurationsdatei gestartet java -Darchaius.configurationSource.additionalUrls=file:///.../archaius.properties -Darchaius.fixedDelayPollingScheduler.delayMills=1000 -Darchaius.fixedDelayPollingScheduler.initialDelayMills=1000 –jar application.jar # archaius.properties app.timeout=1000 app.url=http://myserver:3000/ © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 13 Netflix Archaius Archaius ermöglicht typsicheren Zugriff auf den aktuellen Wert Callbacks werden aufgerufen, wenn sich ein Parameterwert ändert. // construct type safe accessor for property DynamicStringProperty property = DynamicPropertyFactory.getInstance() .getStringProperty("db.url", "default value"); // access current value String url = property.get(); // get notified once the value changes property.addCallback(() -> { System.out.println("property has changed: " + property.get()); }); © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 14 Netflix Archaius Überlegungen Pro und Kontra Archaius Pro: • Konfigurationen können wie gehabt als Datei ausgerollt werden (z. B. mit Chef, Puppet, Ansible, Salt) • Verschiedene Ablagemöglichkeiten außer Dateien werden unterstützt • Hierarchische Struktur vereinfacht die Konfiguration • Erprobte Bibliothek basierend auf der Apache Commons Configuration API • Callback-Funktion ermöglicht komplexe Rekonfiguration Kontra: • Zeitgleiche konsistente Änderung mehrerer Parameter kann je nach Ablageart eine Herausforderung sein Weiterentwicklungen: Apache Commons Configuration 2.0 und Archaius 2.0, Apache Tamaya © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 15 Konfiguration zur Laufzeit 1 Alltägliche Konfigurationsänderungen 2 Archaius: Zugriff auf sich ändernde Konfigurationen 3 etcd: Zentrale Konfigurationsdatenbank 4 Togglz: Aktivieren von neuen Funktionen steuern 5 Besser mit Konfiguration zur Laufzeit? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 16 CoreOS etcd etcd ist eine zentrale Konfigurationsdatenbank Geeignet für Konfiguration und Service Discovery • Einfach: HTTP/REST mit JSON • Zuverlässig: hochverfügbar und konsistent • Sicher: optional mit SSL-Client-Zertifikaten • Schnell: mehrere Tausend Schreiboperationen pro Sekunde Operationen: GET/PUT/DELETE/CAS/WAIT/TTL # PUT curl -L -X PUT http://127.0.0.1:4001/v2/keys/foo-service/container1 –d value="localhost:1111" # GET curl -L http://127.0.0.1:4001/v2/keys/foo-service/container1 # WAIT curl -L http://127.0.0.1:4001/v2/keys/foo-service?wait=true\&recursive=true © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 17 CoreOS etcd + Hightower´s confd Wenn sich Werte in etcd ändern, aktualisiert confd die Konfiguration confd © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 18 CoreOS etcd + Hightower´s confd Wenn sich Werte in etcd ändern, aktualisiert confd die Konfiguration • Service-Beschreibung (*.toml) • Vorlage für die Konfigurationsdatei (*.tmpl) # nginx.toml [template] src = "nginx.tmpl" dest = "/etc/nginx/sites-enabled/app.conf" keys = [ "/foo-service" ] check_cmd = "/usr/sbin/nginx -t" reload_cmd = "/usr/sbin/service nginx reload" © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 confd # nginx.tmpl upstream app_pool { {{ range getvs "/foo-service/*" }} server {{ . }}; {{ end }} } 19 CoreOS etcd + Jurmous´ Java Client Jurmos Java Client spricht etcd über ein Java API angesprochen an • Java-API für alle etcd-Funktionen • Implementiert auf Basis von Netty (für asynchrones, non-blocking IO) // Simple put etcd.put("/foo-service/container1","localhost:1111").send(); // Wait for next change on foo EtcdResponsePromise<EtcdKeysResponse> promise = etcd.getDir("/foo-service/") .recursive().waitForChange().send(); // Java 8 lambda construction promise.addListener(promise -> { // do something with change }); © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 20 CoreOS etcd Überlegungen Pro und Kontra etcd Pro: • Einfacher Zugriff (REST), einfache Installation (Go-Binary), Transport-Sicherheit (SSL) • Änderungen werden sofort an die Clients weitergegeben • Generische Struktur für flexiblen Einsatz Kontra: • Keine Zugriffsbeschränkung für einzelne Clients • Junges Open-Source-Projekt Ergänzungen und Alternativen: • Vulcan (HTTP Load Balancer, Konfigurationsablage in etcd) • SkyDNS (Servicediscovery über DNS, Datenablage in etcd) • Apache Zookeeper (zentrale Konfigurationsdatenbank) • Hazelcast (Leader Election, Distributed Locks, Topics, In-Memory-Data-Grid) • Netflix Eureka (Servicediscovery) • Hashicorp Consul (Servicediscovery und Konfigurationsdatenbank) © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 21 Konfiguration zur Laufzeit 1 Alltägliche Konfigurationsänderungen 2 Archaius: Zugriff auf sich ändernde Konfigurationen 3 etcd: Zentrale Konfigurationsdatenbank 4 Togglz: Aktivieren von neuen Funktionen steuern 5 Besser mit Konfiguration zur Laufzeit? © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 22 Togglz: Feature Toggles für Java Togglz schaltet Funktionen eines Programms zur Laufzeit ein und aus Szenarien: • Noch nicht freigegebene Funktionen sind nur in Testumgebungen aktiv • Aktivierung und Deaktivierung kann über ein Web-Frontend erfolgen • Über Regeln können Funktionen z. B. für ausgewählte Nutzer oder zeitgesteuert aktiviert werden © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 23 Togglz: Feature Toggles für Java Togglz hat eine Web-Oberfläche für Änderungen Status und Rollout-Strategie können für jedes Feature zur Laufzeit geändert werden. © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 24 Togglz: Feature Toggles für Java Die Feature Toggles werden im Programmcode abgefragt Einzelne Features werden als Enums im Java-Code deklariert. Anschließend werden sie im Java-Code abgefragt, bevor der neue Code ausgeführt wird. // declaration and documentation of features public enum Features implements Feature { @Label("First Feature") FEATURE_ONE; } public boolean isActive() { return FeatureContext.getFeatureManager().isActive(this); } // making use of toggles within the code if(Features.FEATURE_ONE.isActive()) { // do new exciting stuff here } © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 25 Togglz: Feature Toggles für Java Überlegungen Pro und Kontra Feature Toggles • Feature Toggles sind ein bekanntes und gut verstandenes Pattern • Es gibt verschiedene Implementierungen für verschiedene Programmiersprachen • Feature Toggles machen Tests komplexer • Wenn ein neues Feature erfolgreich ausgerollt ist, sollte das Feature Toggle entfernt werden Der zusätzliche Aufwand von Feature Toggles lohnt sich: • Bei häufigen Releases (Continuous Delivery), damit fertige Features nicht von unfertigen Features blockiert werden • Wenn langlaufende Feature-Branches mit anschließendem Merge vermieden werden • Wenn aus einem graduellen Rollout Informationen für die Fertigstellung des Features gewonnen werden können © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 26 Konfiguration zur Laufzeit Besser mit Konfiguration zur Laufzeit? Ja! Zugriff auf sich ändernde Konfigurationen • Hilft bereits bei der Entwicklung der Anwendung • Minimaler initialer Aufwand, große Flexibilität für die Produktion Zentrale Konfigurationsdatenbank • Anwendungsübergreifende Konfiguration • Service-Discovery in Cloud-Szenarien Feature Toggles • Wenn es Entwicklung und Deployment vereinfacht • Wenn frühe Rückmeldung zu einem Feature aus der Produktion einen fachlichen Nutzen hat @ahus1de © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 27 Konfiguration zur Laufzeit Links Netflix Archaius: https://github.com/Netflix/archaius CoreOS etcd: https://github.com/coreos/etcd Apache Commons Configuration: http://commons.apache.org/proper/commons-configuration/ Jurnous etcdj: https://github.com/jurmous/etcd4j Apache Tamaya: http://tamaya.incubator.apache.org/ SkyDNS: https://github.com/skynetservices/skydns Vulcan: http://www.vulcanproxy.com/ Netflix Eureka: https://github.com/Netflix/eureka Hazelcast: http://hazelcast.com/ Apache Zookeeper: https://zookeeper.apache.org/ Saltstack and Consul Examples https://github.com/ahus1/saltconsul-examples Netflix exhibitor: https://github.com/Netflix/exhibitor HashCorp Consul: http://consul.io/ Togglz: http://www.togglz.org/ Übersicht über Feature Toggle Implementierungen: http://www.beautifulbuilds.com/feature-toggle-frameworks-list/ @ahus1de © msg | Konfiguration zur Laufzeit | Alexander Schwartz | JUG Saxony Day Dresden | 02. Oktober 2015 28 Alexander Schwartz Principal IT Consultant +49 171 5625767 [email protected] @ahus1de .consulting .solutions .partnership msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg-systems.com