Upload
ekino
View
2.616
Download
0
Embed Size (px)
Citation preview
Se lancer dans l’aventure microservicesavec SpringCloud
Julien RoyArchitecte [email protected]/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/