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

  • View
    2.616

  • Download
    0

  • Category

    Internet

Preview:

Citation preview

Se lancer dans l’aventure microservicesavec SpringCloud

Julien RoyArchitecte Java@vanr0ygithub.com/vanroy

22

1. Définition

2. Problématiques

3. Solutions

4. Implémentation

5 Retours d’expériences

3

Définition

1.

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

55

Périmètre fonctionnelConnaissance métierDomain Driven Design

Concepts

Processus indépendant

Couplage lâcheAPI RESTMessaging

DéploiementAutomatiséContinu

66

ScalabilitéGranularité fine

Bénéfices

IsolationDéfaillances

IndépendanceCycle de vieStockageTechnos / Langage

ProductivitéMontée compétencesDette techniqueRefactoring

7

Problématiques

2.

88

Externalisée

Versionnée

Modifiable à chaud

Configuration

99

Cataloguer

Localiser

Distribution

1010

Interconnexion

Repartition charge

Exposition

Communication

1111

Timeout

Défaillances

Cascades

Résilience / Fallback

Tolérance pannes

12

Solutions

3.

1313

Airbnb : SmartStack

HashiCorp : Consul

Netflix : Eureka, Feign, …

Solutions

1414

Boite à outils

Abstraction

Systémes distribués

Spring Boot

SpringCloud

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

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

17

Implémentation

4.

1818

Serveur / Client

Backend GIT

Configs versionnées

Rechargement à chaud

Chiffrement des configs

SpringCloud Config

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/...

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";

...}

2121

Service d’enregistrement

Localisation des services

État de santé

AWS Aware

Tableau de bord

SpringCloud NetflixEureka

22

Eureka Serverdependencies {

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

@SpringBootApplication@EnableEurekaServerpublic class Application {

...}

23

Eureka Clientdependencies {

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

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

@SpringBootApplication@EnableDiscoveryClientpublic class Application {

...}

24

Eureka Dashboard

2525

Client REST Dynamique

Annotate les interfaces

Processors JAX-RS , SpringMVC, Retrofit

Personnalisation des Encoder / Decoder

SpringCloud NetflixFeign

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();

}

2727

Load balancer coté client

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

Liste de serveur• Configurable• Auto découverte Eureka

SpringCloud NetflixRibbon

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(); }

}

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);

3030

Coupe circuit

Timeout

Cascade d’erreur

Fallback

Tableau de bord

SpringCloud NetflixHystrix

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");}

32

Hystrix Dashboard

3333

Routage• A/B Testing• Mise à jour

Filtrage• Sécurité• Supervision

Programmable ( JVM )

Intégration Eureka / Hystrix

SpringCloud NetflixZuul

34

Zuuldependencies {

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

@SpringBootApplication@EnableDiscoveryClient@EnableZuulProxypublic class Application {

...}

zuul:routes:

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

35

Retours d'expériences

5.

‹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

‹N°›37

Architecture MessagingDécouplage

Reactive programmingResilience

‹N°›38

Exploitation ConteneurSimplification déploiementDev ISO Prod

CloudScalabilitéDisponibilitéSouplesse

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

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

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/

Recommended