Für´s Karma: Konfiguration zur Laufzeit

.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