Page 1
techblog.newsweaver.com
github.com/PierreVincent
@PierreVincent
pierrevincent
Microservices, Docker & Service Discovery
avec Smartstack
Meetup - Docker RennesISTIC, 28 Mai 2015
This work is licensed under a Creative Commons Attribution 4.0 International License.
Page 3
DéploiementMicroservices
Environnement de Build
Tests d’intégration
Environnement de Dev.
Page 4
Microservices are small, autonomous services that work together.
Sam Newman
Page 5
Application Monolithique
Ancrage Technologique
Code complexe et difficile d’accès
Refactoring difficile
Dette technique croissante
Déploiement disruptif
Problèmes en production difficiles
à isoler
Options de scaling limitées
Page 6
Taille réduite=
Cohésion forte
Autonomie et isolation
=Couplage faible
Indépendance technologique
Isolation des fautes=
Résilience
Réduction de l’impact des
déploiements
Scaling spécifique
Page 7
+
Microservices
Cohésion1 conteneur = 1 microservice
Indépendance TechnologiqueLangage specifique au conteneur
Livraison- Image docker (peu importe la techno)- Docker registry
Couplage faibleChaque conteneur est independant
Liberté de déploiementSeulement besoin de Docker
Solutions d’orchestration- Déploiements plus complexes- Swarm, Compose, Kubernetes, Mesos...
Page 8
Test / Validation
Systèmes distribués
ContinuousDelivery
MonitoringInterfaces entre
services
Page 9
Tout sur les microservices
Délimiter les microservices
Un peu de lecture !
Page 10
Service DiscoveryOrganisation dynamique entre microservices
Page 11
Nombre de services variable Services à courte durée de vie
Comment localiser les services disponibles ?
Comment répartir la charge entre les
instances ?
Comment savoir qu’un service n’est plus disponible ?
Page 12
❏ Enregistrement / Découverte
❏ Load Balancing
❏ Abstraction pour les clients
❏ Gestion proactive des erreurs
❏ Résilience aux problèmes exterieurs
❏ Pas de “Single Point of Failure”
Checklist
Page 13
Recommendations Service
Viewing HistoryService
C*
.../users/123/recommendations
.../users/123/viewingHistory
{ “watched”: [ “Breaking Bad”, … ]}
{“recommendations”: [ { “watch”: “Better call saul!”, “because”: [“Breaking Bad”] }, ...]}
Page 14
Recommendations Service
Viewing HistoryService
http://1.1.1.1/users/123/recommendations
services.properties
viewing_history_url = http://1.1.1.1
1.1.1.1
Solution 1: Dépendances en config.
Possibilité de volume partagé avec liste des services et instances
Pas vraiment dynamique :- service doit prendre en compte les
changements- configuration doit être mise à jour
+
-
Page 15
Recommendations Service
Viewing HistoryService
http://viewing-history/users/123/recommendations
/etc/hosts
1.1.1.1 viewing-history
1.1.1.1
Solution 2: Docker links
docker run --named=viewing-history viewing-history-service:latest
docker run --named=recommendations --link viewing-history:viewing-history recommendations-service:latest
Simplicité pour les clients
Dépendances claires
Déploiment possible avec docker-compose
Manque de dynamisme :- ordre prédefini- difficile pour instances multiples
+
-
Page 16
viewing-history.service → 1.1.1.1
Recommendations Service
Viewing HistoryService
http://viewing-history.service/users/123/recommendations
1.1.1.1
Solution 3: DNS
DNS
Simplicité pour les clients
DNS avec round-robin :- instances multiples- load balancing
Problèmes de propagation
+
-
Page 17
[ viewing-history: 1.1.1.1 ...]
Recommendations Service
Viewing HistoryService
http://1.1.1.1/users/123/recommendations
1.1.1.1
Solution 4: Publisher / Subscriber
Key-valueStore
Dynamique :- chaque instance s’enregistre- les clients découvrent les instances
Mise en place d’un Key-value Store HA
Complexité pour les services- Logique codées dans les services
+
-
Page 18
[ viewing-history: 1.1.1.1 ...]
Recommendations Service
Viewing HistoryService
1.1.1.1
Solution 4: Publisher / Subscriber + Ambassadeur
Key-valueStore
http://1.1.1.1/users/123/recommendations
Très dynamique
Transparence pour Clients et Services
Mise en place d’un Key-value Store HA
+
-
Page 19
SmartstackDiscovery framework et intégration avec Docker
Page 20
github.com/airbnb/nerve
github.com/airbnb/synapse
Page 21
Zookeeper(Quorum)
Application
Viewing History Service
API Application
Recommendations Service
SynapseHAProxyNerve
Publication
Discovery
SmartstackVue d’ensemble
Page 22
Application
Nerve
ZK
1.1.1.1
nerve.confname = viewing_historyip = 1.1.1.1port = 8080healthCheck = /health
Publicatio
n
SmartstackNerve
API(8080)
/health
Viewing History Service
Page 23
Application
Synapse
ZK
1.1.1.2
synapse.confviewing_history → 9000
Discov
ery
SmartstackSynapse
HAProxy
1.1.1.1
haproxy.confviewing_history: frontend: localhost:9000 backends: [1.1.1.1:8080]
GEThttp://localhost:9000/users/123/viewingHistory
8080 Servicesviewing_history: [1.1.1.1:8080]
Recommendations Service
ping
Page 24
Distribution de base(ex. Ubuntu)
ruby
synapse (gem)
HA Proxy
nerve (gem)
service.jarsynapse.conf / nerve.conf
startup script
server.js + autres
startup script
Base Smartstack
startSynapse.sh
startNerve.sh
+ Techno
synapse.conf / nerve.conf + Code du service+ Config
Page 25
FROM smartstack-java
# DiscoveryADD nerve.conf.json /etc/ADD synapse.conf.json /etc/
# JARADD service.jar /opt/service/
# StartupADD start.sh /opt/start.shENTRYPOINT ["/opt/start.sh"]
Dockerfile
#!/bin/bash
/opt/startSynapse.sh/opt/startNerve.sh
java -jar service.jar
start.sh
$ docker build -t my-service ....$ docker run -d -e ZK_HOSTS=zk1:2181,zk2:2181 my-service
Page 26
color-service
color-service
color-serviceGET .../v1/color
color-ui-service
blue
{ "name": "blue", "hex": "0000FF"}
{ "name": "red", "hex": "FF0000"}
{ "name": "green", "hex": "00FF00"}
Démo !
Page 27
techblog.newsweaver.com
Questions ?
@PierreVincent