Prez -chtijug-29032016-(micro)services, loadbalancing et gestion des erreurs comment bien gérer vos dépendances http

Embed Size (px)

Citation preview

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