prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs comment bien gérer...
TRANSCRIPT
Prsentation PowerPoint
ChtiJug(Micro)services, loadbalancing et gestion des erreurs / comment bien grer vos dpendances HTTP
Christophe FurmaniakTwitter: @cfurmaniak
Github: looztra
Consultant Architecture et Culture DevOps chez Zenika
Ex Atos Multimedia Atos Worldline Worldline
(Trs) Intress par la Gestion de la Configuration, les mtriques, le cycle de construction, livraison et dploiement des applications
Adepte de la tonte des Yaks
Yak shaving: Any apparently useless activity which, by allowing you to overcome intermediate difficulties, allows you to solve a larger problem.Note: j'ai l'air grincheux, mes slides ne sont pas trs esthtiques, je suis au courant
/me
Le contenu de la prez
Contexte
(micro)servicesAttention, buzzwords Martin Fowler http://martinfowler.com/articles/microservices.html
the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery.
[Chez Pivotal => Cloud Native Apps]
(micro)servicesAttention, buzzwords
Microservices vs SOA vs MonolithMme combat!Vous aurez un jour ou l'autre grer des dpendances
Qu'elles soient internes ou externes
paypal, ident oauth, envoi de mel, ...
Soit vos dpendances sont soft(compatibles asynchrone):ESB, messaging (jms ou autre), voire WS
Soit elles sont hard (temps rel) => besoin de ractivitWebService http(s), ...
Comment s'y prendre?En mode optimiste:
Mais pourquoi a planterait?
=> Mode cowboy!!!
En mode raliste:Ca va planter
=> Bienvenus!
Pourquoi maintenant(1) ? Le dv logiciel a volu:Avant, la plupart du temps, on ne s'occupait pas de cette problmatique, on avait dj suffisamment de mal utiliser/communiquer avec nos dpendances :)
Maintenant on est des grands, on doit s'en occuper, plus d'excuses!
l'outillage et les libs (par dfaut/embeded ou extra) ont volu
Pourquoi maintenant (2)?
Microservices: la thorieLes petits services sont trs simple, se focalisant sur un domaine prcis, en le faisant bien
Chaque service peut tre construit en utilisant le meilleur et le plus appropri des outils pour faire le boutlot
Les systmes construits de cette faon sont par dfaut faiblement coupls
Plusieurs dveloppeurs et quipes peuvent livrer relativement indpendamment les uns des autres
Ces services sont de grands facilitateurs du mode continuous delivery, autorisant des dploiements frquents tout en gardant un systme global disponible et stable
(Source: Microservices Not a free lunch by Benjamin Wooton)
Not a free lunch?
Vous et vos ops quand vous allez livrer
Microservices: la pratiqueAttention :
La latence
La tolrance la panne
La configuration du load balancing
La gestion de la configurationSans automatisation, vous allez vous prendre des murs!
Le monitoringSans mtriques, vous ne savez pas d'o vous partez ni o vous allez!
Pour la latence?Rxjava : https://github.com/ReactiveX/RxJava/
Reactive Streams http://www.reactive-streams.org
http://techblog.netflix.com/2013/02/rxjava-netflix-api.html
Pour la tolrance la panne?Hystrix https://github.com/Netflix/Hystrix (par Netflix)
cf le TIA de Thomas Recloux DevoxxFR#2015
https://www.devoxx.fr/2015/speaker/thomas_recloux.html
https://github.com/trecloux/devoxx-fr-15-hystrix-demo
Focus Loadbalancing
Loadbalancing?En informatique, la rpartition de charge (en anglais : load balancing) est un ensemble de techniques permettant de distribuer une charge de travail entre diffrents ordinateurs d'un groupe.
Ces techniques permettent la fois:- de rpondre une charge trop importante d'un service en la rpartissant sur plusieurs serveurs- de rduire l'indisponibilit potentielle de ce service que pourrait provoquer la panne logicielle ou matrielle d'un unique serveur
L'appli Guestbook
Le guestbook qui dchireUn frontend AngularJs (nginx)
Un service API Gateway (springboot)
Un service de filtrage (springboot)
Un service de stockage (springboot)
Un backend de stockage (redis)
Frontend --> API Gateway --> Filter Service --> Api Service --> Redis Master --> Redis Slave
Chaque service tourne sur 2 serveurs
Sauf le redis master (parce que!)
LB OldSchool
Le LB mis en place par ta grand-mreConfiguration d'une VIP (adresse ip virtuelle)
Loadbalancing hardware (F5/A10)
HAProxy
LVS/KeepAlived
Pas trop mauvaise gestion des indisponibilits
Pas scalable facilement
Combien de temps (et de tickets) pour que votre configuration soit mise jour?
Et si on multiplie le nombre de services loadbalancer?
LB Les devs prennent le pouvoir
Le LB mis en place par les devs #1Chaque service doit connaitre la liste des serveurs (+port) implmentant chacune de ces dpendances
Idalement, les requtes sont distribues sur tous les 'backends' disponibles rfrencs
'Tarzan faire son trou tout seul' => sans moi
Netflix la rescousse: Ribbon
Software loadbalancers
Fault tolerance incluse
RxJava friendly
Rfrencement statique des serveurs
Ribbon
CommandBuilder.newBuilder() .withLoadBalancer(LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList)) .build(new LoadBalancerExecutable() { @Override public String run(Server server) throws Exception { URL url = new URL("http://" + server.getHost() + ":" + server.getPort() + path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); return conn.getResponseMessage(); } }).execute();
LB Rfrencement statique: dmo
Le LB mis en place par les devs #2Quand un des backends n'est plus dispo => ERROR!
Une solution simple (avec Netflix/Ribbon)
Utiliser un RetryHandler!
DefaultLoadBalancerRetryHandler(
int retrySameServer,int retryNextServer,boolean retryEnabled)
Rfrencement statique des serveurs + retry
LB statique+ retry handler: dmo
LB Service Registry+Discovery
Le LB mis en place par les devs #3Chaque service s'enregistre dans une base de manire dynamique (nom + coordonnes)
Chaque service ayant besoin d'une dpendance interroge la base et dcouvre les backends de ses dpndances dynamiquement
Mta question: mais comment mes services connaissent l'adresse de la base de registre? :)
Enregistrement et dcouverte dynamique
Le LB mis en place par les devs #3internal registration (du code dans ton app)
external registration (de la config l'exterieur de ton app)
fichier de conf global au serveur (ex smartstack+nerve)
par application, en mode wrapper
auto-registration (coute d'un daemon, type docker [ex registrator])
Patterns pour l'enregistrement
Le LB mis en place par les devs #3La base de registre est interrogeable en mode DNS
Besoin de configurer votre appli/vos serveurs pour pouvoir utiliser le bon serveur DNS
Attention aux pb potentiels de cache DNS
!!! nginx et upstream
La base de registre fournit une API http qui permet de retrouver la liste des backends pour un service
Patterns pour la dcouverte
Le LB mis en place par les devs #3Attention la notion de dure de validit des informations rcupres (le TTL)
Use case: service s'appuyant sur noeuds A, B et C
ttl de 5secondes
serveur C 'tombe' dans l'intervalle des 5 secondes
le service DNS peut retourner C (il ne sait pas encore qu'il n'est pas dispo)
le service "liste de serveurs" retournera A, B et C (idem)
si pas de bol, c'est serveur C que tu appelles en faisant confiance ton service "registry/dns", => BOOM
=> Le retry handler est ton ami!Dans tous les cas
Le LB mis en place par les devs #3Eureka
Consul (HashiCorp)
Etcd (CoreOS)
ZooKeeper (nan, oubliez en fait, ou alors utilisez Curator)
SkyDns
SmartStack (AirBnB)
Les implmentations
Le LB mis en place par les devs #3S'appuie sur 3 composants:
ZooKeeper:
Centralisation des informations
Focus sur SmartStack
Le LB mis en place par les devs #3
NerveInstall sur chaque serveur hbergeant des services
Responsable:
De l'enregistrement
De la validation de l'tat de sant de chaque service (healthchecks)
Focus sur SmartStack
Le LB mis en place par les devs #3
SynapseInstall sur chaque serveur hbergeant des services
Gnration d'une config HA Proxy
Pour parler une dpendance, chaque service s'adresse localhost!
Focus sur SmartStack
Le LB mis en place par les devs #3
Avantages:utilisation de localhost
non intrusif (pas de code dans ton app!)
Inconvnients: ZooKeeper
Maintenance du fichier de conf Nerve
Focus sur SmartStack
Le LB mis en place par les devs #3Un ensemble de serveurs jouent le rle de cluster central
Chaque service hbergeant des services ou devant communiquer avec des services hberge un agent consul
Les services communiquent toujours avec 'localhost'
Requtable en mode DNS et en mode API http
Focus sur Consul (1/3)
Le LB mis en place par les devs #3 Les deux patterns d'enregistrement sont possibles:
Enregistrement intgr dans votre appli (avec du code, cf Spring Cloud Consul)
Enregistrement par un wrapper (shell par exemple): pas de code modifier dans l'appli...mais un wrapper configurer
Focus sur Consul (2/3)
Le LB mis en place par les devs #3 Les deux patterns de dcouverte sont possibles:
Dcouverte intgre dans votre appli (avec du code, cf Spring Cloud Consul + Netflix Ribbon)
Dcouverte en utilisant le DNS (rfrencement uniquement d'une 'vip')
Focus sur Consul (3/3)
LB Dmo Consul
LB Infrastructure au top
Le LB quand c'est l'infra qui gre Ton appli est hberge au format container?
T'as la chance d'utiliser un orchestrateur?
Ben t'as rien faire alors
(Bon, vrifier tes params de cache DNS java quand mme au cas o)
Exemple d'orchestrateursqui vont bien:Kubernetes
Rancher
Rien faire j'te dis!
LB Dmo Rancher
The End Rancher
Il faut s'adapter votre infra! refrencement statique
refrencement vers serveur de configuration (Spring Cloud Config, Archaius)
DNS statique
load balancer externe (haproxy, lvs+keepalived, F5/A10) (-)
reverse-proxy
consul en mode enregistrement de l'application
consul en mode "sidekick registrator (a ne marche bien que dans un contexte docker)"
Consul avec un wrapper-launcher
DNS dyn dans Rancher
Smartstack
les autres solutions auxquelles je n'ai pas pens en prparant la prez :)
+ vos Ops et la culture de votre entreprise!
Si vous ne deviez retenir qu'une choseSOA/Microservices/Monolith:dans tous les cas soyez prpars, a va planter!
Du code? https://github.com/looztra/guestbook-api-server
MerciDes questions ?
Expliquer le trait