Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Konfiguration und Service Discovery für Microservices

Konfiguration und Service Discovery für Microservices

Anwendungen benötigen Konfigurationsdaten mit unterschiedlichen Informationen, z. B. zu den Adressen der Nachbarsysteme und zu fachlichen Parametern. In einer Microservices-Umgebung ist Automatisierung der Schlüssel zu einem zuverlässigen und effizienten Betrieb. Eine übergreifende zentrale Konfiguration ist der erste Schritt. Im zweiten Schritt müssen Konsumenten automatisch die von ihnen benötigten Services finden, wenn diese skaliert oder auf anderen Knoten neu gestartet wurden. Dieser Vortrag gibt eine Einführung in zentrale Konfiguration und Service Discovery mit praktischen Beispielen rund um Netflix Archaius, HashiCorp Consul, CoreOS etcd und Netflix Eureka.

Alexander Schwartz

April 20, 2016
Tweet

More Decks by Alexander Schwartz

Other Decks in Technology

Transcript

  1. Konfiguration und Service Discovery für Microservices © msg | Konfiguration

    und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 2 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  2. Mein Sponsor und Arbeitgeber – msg systems ag © msg

    | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 3 1980 gegründet mehr als 5.500 Kollegen 727 Mio € Umsatz 2015 24 Länder in 14 Städten in Deutschland präsent
  3. Wer ich bin – Alexander Schwartz © msg | Konfiguration

    und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 4 14 Jahre Java 7 Jahre PL/SQL 7 Jahre Absatzfinanzierung 3,5 Jahre Direktbank 1 Frau 2 Kinder 471 gefundene Geocaches @ahus1de
  4. Konfiguration und Service Discovery für Microservices © msg | Konfiguration

    und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 5 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  5. Cloud Setup und Herausforderungen Ein einfaches Cloud Setup © msg

    | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 6 Wo sind meine Application Server? Wo ist meine Datenbank?
  6. Cloud Setup und Herausforderungen Ein einfaches Cloud Setup © msg

    | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 7
  7. Cloud Setup und Herausforderungen Ein einfaches Cloud Setup © msg

    | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 8
  8. Alltägliche Konfigurationsänderungen Konfigurationen zur Laufzeit spart Zeit und Nerven –

    und vermeidet Wartungsfenster © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 9 • Parameter der Anwendung zur Laufzeit ändern  Ziel-Adressen für Server  Verzeichnisnamen  Timeouts und fachliche Parameter • Zentrale Datenbank  Konfigurationsparameter  Service-Discovery für Clients  Service-Discovery für Load Balancer
  9. Konfiguration und Service Discovery für Microservices © msg | Konfiguration

    und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 10 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  10. Netflix Archaius Netflix Archaius regelt den Zugriff auf Parameter für

    Java-Clients © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 11 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 Quelle: http://en.wikipedia.org/wiki/Archaius_tigris (CC) Hans Stieglitz
  11. Netflix Archaius Beim Start kann zusätzlich eine Umgebung mitgegeben werden

    © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 12 java -Darchaius.deployment.environment=test ... # database.properties db.url=jdbc:postgresql://localhost:5432/standard-db # database-test.properties db.url=jdbc:postgresql://localhost:5432/test-db // Java Startup ConfigurationManager.loadCascadedPropertiesFromResources("database");
  12. Netflix Archaius Die Java-Anwendung wird mit Angabe der Konfigurationsdatei gestartet

    © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 13 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/
  13. // construct type safe accessor for property DynamicIntProperty timeoutProperty =

    DynamicPropertyFactory.getInstance() .getIntProperty("app.timeout", 10); // access current value int timeout = timeoutProperty.get(); // get notified once the value changes timeoutProperty.addCallback(() -> { System.out.println("property has changed: " + property.get()); }); Netflix Archaius Archaius ermöglicht typsicheren Zugriff auf den aktuellen Wert © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 14 Callbacks werden aufgerufen, wenn sich ein Parameterwert ändert.
  14. Netflix Archaius Konfigurationsquellen für Konfigurationen in Archaius © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 15 Klassische Konfigurationsquellen: • Properties-Dateien, JDBC Cloud-Blob-Storage: • Amazon S3, Amazon Dynamo DB, Microsoft Azure Blob, Google Cloud Storage Konfigurationsserver: • Etcd, Zookeeper Custom Setup: • API für eigene Lösungen (ca. 150-200 Zeilen Code für eine Integration, z. B. für Consul)
  15. Netflix Archaius Überlegungen Pro und Kontra Archaius © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 16 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 Ähnliche Projekte und Weiterentwicklungen: Apache DeltaSpike, Apache Commons Configuration 2.0 und Archaius 2.0, Apache Tamaya
  16. Konfiguration und Service Discovery für Microservices 17 © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  17. CoreOS etcd etcd ist eine zentrale Konfigurationsdatenbank © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 18 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
  18. CoreOS etcd + Hightower´s confd Wenn sich Werte in etcd

    ändern, aktualisiert confd die Konfiguration © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 19 confd
  19. CoreOS etcd + Hightower´s confd Wenn sich Werte in etcd

    ändern, aktualisiert confd die Konfiguration © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 20 • 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" # nginx.tmpl upstream app_pool { {{ range getvs "/foo-service/*" }} server {{ . }}; {{ end }} } confd
  20. CoreOS etcd + Jurmous´ Java Client Jurmos Java Client spricht

    etcd über ein Java API an © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 21 • 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 });
  21. CoreOS etcd Überlegungen Pro und Kontra etcd © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 22 Pro: • Einfacher Zugriff (REST), einfache Installation (Go-Binary), Transport-Sicherheit (SSL) • Änderungen werden sofort an die Clients weitergegeben • Generische Struktur für flexiblen Einsatz • Einsatz innerhalb von CoreOS und Kubernetes Kontra: • Keine Zugriffsbeschränkung für einzelne Clients Ergänzungen: • Vulcan (HTTP Load Balancer, Konfigurationsablage in etcd) • SkyDNS (Servicediscovery über DNS, Datenablage in etcd)
  22. Konfiguration und Service Discovery für Microservices 23 © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  23. Hashicorp Consul Consul © msg | Konfiguration und Service Discovery

    für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 24 Geeignet für Service Discovery, Konfiguration und Monitoring • Einfach: HTTP/REST mit JSON • Zuverlässig: hochverfügbar und konsistent • Sicher: eingebaute Access Control Lists und Verschlüsselung Haupt-Sponsor: HashiCorp (die, die auch Vagrant machen) Homepage: https://www.consul.io/
  24. Netflix Ribbon Ribbon © msg | Konfiguration und Service Discovery

    für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 25 Geeignet für Client-Seitiges Load-Balancing • Ribbon arbeitet gut zusammen mit Feign: Typsichere Web-APIs Haupt-Sponsor: Netflix Homepage: https://github.com/Netflix/ribbon/
  25. Consul und Ribbon Der Client nimmt direkt Verbindung mit dem

    funktionierenden Service auf © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 26 Consul-Server (für Key-Value-Store und Service-Catalog) Services Client
  26. Services mit Consul Jede Consul Instanz kennt ihre lokalen Services

    © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 27 "service": { "name": "web", "tags": ["master"], "port": 80 }
  27. Services mit Consul Jede Consul Instanz prüft sich und ihre

    lokalen Services © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 28 "check": { "id": "http", "name": "HTTP API on port 80", "http": "http://localhost:80", "service_id": "web", "interval": "10s", "timeout": "1s" } "check": { "id": "script", "name": "Script Check", "script": "/usr/local/bin/check_mem.py", "service_id": "web", "interval": "10s" } "check": { "id": "ttl", "name": "Web Status", "service_id": "web", "ttl": "30s" }
  28. Services mit Consul Consul UI © msg | Konfiguration und

    Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 29
  29. Services mit Consul Services finden per DNS mit SRV Record

    © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 30 $ dig @127.0.0.1 -p 8600 web.service.dc1.consul. SRV web.service.dc1.consul. 0 IN SRV 1 1 80 web2.node.dc1.consul. web.service.dc1.consul. 0 IN SRV 1 1 80 web1.node.dc1.consul. web1.node.dc1.consul. 0 IN A 192.168.23.21 web2.node.dc1.consul. 0 IN A 192.168.23.22
  30. Consul und Ribbon Anwendungs-Code für Ribbon © msg | Konfiguration

    und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 31 MyService api = Feign.builder() .contract(new JAXRSContract()) .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .client(RibbonClient.builder() .lbClientFactory(new ConsulLbFactory()) .build()) .target(MyService.class, "http://web"); api.call();
  31. public class ConsulLbFactory implements LBClientFactory { private Map<String, LBClient> clients

    = new HashMap<>(); public synchronized LBClient create(String clientName) { LBClient client = clients.get(clientName); if(client == null) { ILoadBalancer lb = new ConsulLoadBalancer(clientName); IClientConfig clientConfig = new DefaultClientConfigImpl(); clientConfig.loadDefaultValues(); client = LBClient.create(lb, clientConfig); clients.put(clientName, client); } return client; } } Consul und Ribbon Java-API für Consul © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 32 public class ConsulLoadBalancer extends BaseLoadBalancer { public ConsulLoadBalancer(String serviceName) { Consul consul = Consul.builder().build(); HealthClient client = consul.healthClient(); ServiceHealthCache svHealth = ServiceHealthCache.newCache(client, serviceName); svHealth.addListener(map -> { List<Server> newServers = new ArrayList<>(); map.forEach((hostAndPort, serviceHealth) -> newServers.add(new Server(hostAndPort.getHostText(), hostAndPort.getPort()))); setServersList(newServers); }); /* ... */ } }
  32. Consul und Ribbon Überlegungen Pro und Kontra Service Discovery mit

    Consul © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 33 Pro: • Kontakt zu Services ohne Single Point of Failure • Fertige Bibliotheken verfügbar • Dezentrales Monitoring von Services • GUI für Key-Value-Store und Monitoring • Zusätzliche Semantik für Services (statt nur Key-Value-Store) Ergänzungen: • eBay Fabio (HTTP Load Balancer, Konfigurationsablage in Consul) • consul-template (schreibt Konfigurationsdateien analog zu confd) • Nomad (Scheduler, der Services automatisch in Consul registriert)
  33. Konfiguration und Service Discovery für Microservices 34 © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  34. Netflix Eureka Eureka © msg | Konfiguration und Service Discovery

    für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 35 Gebaut für Service Discovery innerhalb von AWS • REST: Wahlweise mit JSON oder XML • Einfach: Client-Pull für Clients • Zuverlässig: hochverfügbar, Verfügbarkeit vor Konsistenz Hauptentwickler: Netflix Homepage: https://github.com/Netflix/eureka
  35. Netflix Eureka Brewers CAP Theorem © msg | Konfiguration und

    Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 36 „Ein verteiltes System kann zwei der folgenden Eigenschaften gleichzeitig erfüllen, jedoch nicht alle drei.“ Konsistenz (C = consistency) Hier: Wenn sich ein Service registriert hat, können alle anderen Teilnehmer anschließend diesen Service finden (auch: Linearisierbarkeit). Verfügbarkeit (A = availability) Hier: Service-Registrierung und -Lookup können durch Clients ausgeführt werden. Partitionstoleranz (P = partition tolerance) Hier: Service-Registrierung und -Lookup sind möglich, auch wenn Netzwerkverbindungen teilweise unterbrochen sind.
  36. Netflix Eureka Eureka – Verfügbarkeit wichtiger als Konsistenz (1/2) ©

    msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 37 Etcd: • Registrierung: CP • Lookup: AP (Standard) oder CP („?quorum=true“) Consul: • Registrierung: CP für Key-Value-Store AP für Service-Registrierung und Health und über lokalen Agenten („Anti-Entropy“) CP für das Zusammenführen der Informationen in der Service-Registry • Lookup via REST API: wahlweise CP („?consistent“), bei einem bekannten Leader oder AP („?stale“) • Lookup via DNS: bei einem bekannten Leader, alternativ AP mit oberer Zeitgrenze mit „stale reads“
  37. Netflix Eureka Eureka – Verfügbarkeit wichtiger als Konsistenz (2/2) ©

    msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 38 Eureka: • Registrierung für Services: AP (ein Client meldet sich an einer Server-Instanz an und publiziert alle 30 Sekunden seinen aktuellen seinen Status) • Lookup für Services: AP (ein Client sieht die Sicht seines Servers) • „Self-Preservation“ bei vermuteter Netzwerkpartition Server/Server oder Clients/Server: Der Server behält seinen Status der bereits bekannten Services
  38. Netflix Eureka Eureka – Pull und Cache statt Query und

    Push (1/2) © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 39 Etcd: • Service-Lookup mit HTTP GET als synchroner Aufruf • Warten auf Änderungen mit HTTP GET blocking query („?wait=true&waitIndex=X“) Consul: • Service-Lookup mit HTTP GET als synchroner Aufruf • Service-Lookup mit HTTP GET als blocking query („?wait=Xs&index=Y“)
  39. Netflix Eureka Eureka – Pull und Cache statt Query und

    Push (2/2) © msg | Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 40 Eureka: • Clients holen alle 30 Sekunden das Delta der Service-Registry vom Server • Server holen alle 30 Sekunden das Delta der anderen Server • Service-Lookup ist eine Client-lokale Operation • Weitergabe von Änderungen kann bis zu 2 Minuten dauern (Lookup mit HTTP GET als synchroner Aufruf ist über das API möglich)
  40. Konfiguration und Service Discovery für Microservices 41 © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 Alltag in der Cloud 1 Archaius: Zugriff auf veränderliche Konfigurationen 2 etcd: Zentrale Konfigurationsdatenbank 3 Consul: Service Discovery, Konfiguration und Monitoring 4 Netflix Eureka: Availablity First! 5 Service Discovery im Vergleich 6
  41. Favorit Service Discovery Capability Matrix © msg | Konfiguration und

    Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 42 Etcd Consul Eureka Konfigurationen Ja Ja Nein Service Discovery via REST-API Ja (via KV-Store) Ja Ja Konfigurationsdateien schreiben Ja (via confd) Ja (nativ und confd) Nein Dynamic DNS Ja (via SkyDNS) Ja (nativ) Nein Topologie Unterstützung Nein Ja (Datacenter & WAN) Ja (Region & Zone) Zugriffskontrolle SSL Client-Zertifikate Detailliert (ACLs) Servlet-Security Health Checks für Services Nein Ja Nein Edge Service (Vulcan) (Fabio) (Zuul) GUI Nein Ja Nein
  42. Favorit Service Discovery Wer ist der Favorit? © msg |

    Konfiguration und Service Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 43 Etcd – hochverfügbarer und konsistenter Key-Value-Store • Bereits mit ausgeliefert bei CoreOS • Einfach zu nutzendes REST-API Consul – Services als „First Class Citizen“ zusätzlich zum Key-Value-Store • Aktives Monitoring der Services • Sicherheit eingebaut: Transportverschlüsselung und ACLs Eureka – Gebaut für die Amazon Cloud • Sehr gute Integration in die Amazon Infrastruktur • Zeitverzögerte Replikation des kompletten Service-Katalogs an die Clients (Client Pull) • Verfügbarkeit geht vor Aktualität und Konsistenz @ahus1de
  43. Favorit Service Discovery Links © msg | Konfiguration und Service

    Discovery für Microservices | Alexander Schwartz | JAX 2016 | 20. April 2016 44 Netflix Archaius: https://github.com/Netflix/archaius Apache Commons Configuration: http://commons.apache.org/proper/commons-configuration/ Übersicht über verschiedene Methoden: http://javaeeconfig.blogspot.de/2014/08/ overview-of-existing-configuration.html HashiCorps Consul für Service Discovery, Monitoring und Konfigurationsmanagement http://heise.de/-3040847 eBay Fabio: https://github.com/eBay/fabio Nomad: https://www.nomadproject.io/ Saltstack and Consul Examples https://github.com/ahus1/saltconsul-examples @ahus1de CoreOS etcd: https://github.com/coreos/etcd Jurnous etcdj: https://github.com/jurmous/etcd4j Vulcan: http://www.vulcanproxy.com/ SkyDNS: https://github.com/skynetservices/skydns Netflix Eureka: https://github.com/Netflix/eureka Apache Zookeeper: https://zookeeper.apache.org/ Netflix exhibitor: https://github.com/Netflix/exhibitor HashiCorp Consul: http://consul.io/
  44. .consulting .solutions .partnership Alexander Schwartz Principal IT Consultant +49 171

    5625767 [email protected] @ahus1de msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg-systems.com