40
Se lancer dans l’aventure microservices avec Spring Cloud Julien Roy Architecte Java @vanr0y github.com/vanroy

Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

  • Upload
    ekino

  • View
    2.616

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

Se lancer dans l’aventure microservicesavec SpringCloud

Julien RoyArchitecte [email protected]/vanroy

Page 2: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

22

1. Définition

2. Problématiques

3. Solutions

4. Implémentation

5 Retours d’expériences

Page 3: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

3

Définition

1.

Page 4: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

4

Microservices« In short, 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. (…) »

James Lewis and Martin Fowler

Page 5: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

55

Périmètre fonctionnelConnaissance métierDomain Driven Design

Concepts

Processus indépendant

Couplage lâcheAPI RESTMessaging

DéploiementAutomatiséContinu

Page 6: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

66

ScalabilitéGranularité fine

Bénéfices

IsolationDéfaillances

IndépendanceCycle de vieStockageTechnos / Langage

ProductivitéMontée compétencesDette techniqueRefactoring

Page 7: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

7

Problématiques

2.

Page 8: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

88

Externalisée

Versionnée

Modifiable à chaud

Configuration

Page 9: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

99

Cataloguer

Localiser

Distribution

Page 10: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1010

Interconnexion

Repartition charge

Exposition

Communication

Page 11: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1111

Timeout

Défaillances

Cascades

Résilience / Fallback

Tolérance pannes

Page 12: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

12

Solutions

3.

Page 13: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1313

Airbnb : SmartStack

HashiCorp : Consul

Netflix : Eureka, Feign, …

Solutions

Page 14: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1414

Boite à outils

Abstraction

Systémes distribués

Spring Boot

SpringCloud

Page 15: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1515

SpringCloud spring-cloud-aws

spring-cloud-bus

spring-cloud-cli

spring-cloud-commons

spring-cloud-config

spring-cloud-netflix

spring-cloud-security

spring-cloud-starters

17 projets

8 en RELEASE ( 1.0.2 / 1.0.3 )

spring-cloud-aws

spring-cloud-bus

spring-cloud-cli

spring-cloud-commons

spring-cloud-config

spring-cloud-netflix

spring-cloud-security

spring-cloud-starters

Page 16: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1616

SpringCloud spring-cloud-cloudfoundry

spring-cloud-cluster

spring-cloud-consul

spring-cloud-lattice

spring-cloud-sleuth

spring-cloud-dataflow

spring-cloud-stream

spring-cloud-stream-modules

spring-cloud-zookeeper

17 projets

8 en RELEASE ( 1.0.2 / 1.0.3 )

9 en BUILD-SNAPSHOT

Page 17: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

17

Implémentation

4.

Page 18: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

1818

Serveur / Client

Backend GIT

Configs versionnées

Rechargement à chaud

Chiffrement des configs

SpringCloud Config

Page 19: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

19

Config Serverdependencies {

compile 'org.springframework.cloud:spring-cloud-server'}

@SpringBootApplication@EnableConfigServerpublic class ConfigServerApplication {

public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);

}}

spring.cloud.config.server.git.uri: https://github.com/myproject/...

Page 20: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

20

Config Clientdependencies {

compile 'org.springframework.cloud:spring-cloud-starter-config'}

spring.cloud.config.uri: http://myconfigserver.com

@SpringBootApplicationpublic class Application {

@Value("${config.name}")String name = "World";

...}

Page 21: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

2121

Service d’enregistrement

Localisation des services

État de santé

AWS Aware

Tableau de bord

SpringCloud NetflixEureka

Page 22: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

22

Eureka Serverdependencies {

compile 'org.springframework.cloud:spring-cloud-starter-eureka-server'}

@SpringBootApplication@EnableEurekaServerpublic class Application {

...}

Page 23: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

23

Eureka Clientdependencies {

compile 'org.springframework.cloud:spring-cloud-starter-eureka'}

eureka.client.serviceUrl.defaultZone: http://localhost:8001/eureka/

@SpringBootApplication@EnableDiscoveryClientpublic class Application {

...}

Page 24: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

24

Eureka Dashboard

Page 25: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

2525

Client REST Dynamique

Annotate les interfaces

Processors JAX-RS , SpringMVC, Retrofit

Personnalisation des Encoder / Decoder

SpringCloud NetflixFeign

Page 26: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

26

Feigndependencies {

compile 'org.springframework.cloud:spring-cloud-starter-feign'}

@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class Application {

...}

@FeignClient("actors")public interface ActorClient {

@RequestMapping(method = RequestMethod.GET, value = "/actors")List<Actor> getActors();

}

Page 27: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

2727

Load balancer coté client

Algorithmes• Round robin• Aléatoire• Temps réponse

Liste de serveur• Configurable• Auto découverte Eureka

SpringCloud NetflixRibbon

Page 28: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

28

Ribbondependencies {

compile 'org.springframework.cloud:spring-cloud-starter-ribbon'}

@SpringBootApplication@EnableDiscoveryClient@RibbonClient(name="actors", configuration=ActorsRibbonConfig.class) public class Application {

...}

@Configurationpublic class ProductsRibbonConfiguration {

@Beanpublic IRule ribbonRule() { return new RoundRobinRule(); }

}

Page 29: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

29

Ribbon@Autowiredprivate LoadBalancerClient loadBalancer;

public List<Actors> getActors() {ServiceInstance instance = loadBalancer.choose("actors");String url = "http://"+instance.getHost()+":"+instance.getPort();

...

// Get the actors list with RestTemplate ( Backend by ribbon )restTemplate.getForEntity("http://actors/actors", Actor[].class);

Page 30: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

3030

Coupe circuit

Timeout

Cascade d’erreur

Fallback

Tableau de bord

SpringCloud NetflixHystrix

Page 31: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

31

Hystrixdependencies {

compile 'org.springframework.cloud:spring-cloud-starter-hystrix'}

@SpringBootApplication@EnableCircuitBreakerpublic class Application {

...}

@HystrixCommand(fallbackMethod = "defaultActor")

public Actor get(String id) { return actorRestClient.get(id); }public Actor defaultActor(String id) { return new Actor("Actor not found");}

Page 32: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

32

Hystrix Dashboard

Page 33: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

3333

Routage• A/B Testing• Mise à jour

Filtrage• Sécurité• Supervision

Programmable ( JVM )

Intégration Eureka / Hystrix

SpringCloud NetflixZuul

Page 34: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

34

Zuuldependencies {

compile 'org.springframework.cloud:spring-cloud-starter-zuul'}

@SpringBootApplication@EnableDiscoveryClient@EnableZuulProxypublic class Application {

...}

zuul:routes:

shows: /tvshows/**actors: /actors/**reviews: / reviews /**

Page 35: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

35

Retours d'expériences

5.

Page 36: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

‹N°›36

Organisation Independance1 dépôt GIT par service1 build par service1 déploiment par service

Attention au DRY Independance entre servicePrivilégier la création de librairieConsumer-Driven Contracts

Page 37: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

‹N°›37

Architecture MessagingDécouplage

Reactive programmingResilience

Page 38: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

‹N°›38

Exploitation ConteneurSimplification déploiementDev ISO Prod

CloudScalabilitéDisponibilitéSouplesse

MonitoringTracer ( Zipkin, … )Centraliser logs ( ELK, … )

Page 39: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

39

Do not be afraid

Microservices it’s not a silver bullet and itcome with few problems

But

We have many great solutions, big actorsexperiences and a lots of benefits

Try it

Page 40: Se lancer dans l'aventure microservices avec Spring Cloud - Julien Roy

40

Ressources • Projet démo sur GitHubhttps://github.com/VanRoy/tvshowsdb-microservices

• Martin Fowler : Microservices architecturehttp://martinfowler.com/articles/microservices.html

• Chris Richardson : Introduction to microserviceshttps://www.nginx.com/blog/introduction-to-microservices/

• Adam Wiggins : The Twelve-Factor Apphttp://12factor.net/

• Paul Chapman : Microservices with Springhttps://spring.io/blog/2015/07/14/microservices-with-spring

• Rohit Kelapure : An Architecture for Microservices using Spring on Cloud Foundryhttps://docs.google.com/document/d/15G8ew0qEDqpuBTWH9YGHKhda6HaLvfKuS4pnB-CPm50

• Dave Syer : Spring Cloud, Spring Boot and Netflix OSShttp://presos.dsyer.com/decks/cloud-boot-netflix.html

• Netflix : Open Source Software Centerhttps://netflix.github.io/

• Spring Cloudhttp://projects.spring.io/spring-cloud/