backday xebia : découvrez spring boot sur un cas pratique
TRANSCRIPT
#backdaybyxebia
Nicolas Jozwiak Thomas Auffredou
Construire le SI de demain
Spring boot
#backdaybyxebia
@tauffredou
@njozwiak
#backdaybyxebia
Initié par Phillip Webb : @phillip_web
et Dave Syer : @david_syer
#backdaybyxebia
Dernière release GA : 1.2.3 (Mars 2015)
#backdaybyxebia
Se frayer un chemin dans la galaxie Spring
Objectifs
#backdaybyxebia
● Démarrer rapidement ● Convention over configuration ● Orienté ops (métriques, configuration, ...) ● Pas de génération de code (contrairement à SpringRoo)
Objectifs
#backdaybyxebia
Exemple Groovy @RestController class SampleApplication { @RequestMapping("/") String home() { "Hello World!" } } $spring run app.groovy
#backdaybyxebia
Présentation
● Prérequis faibles : jdk >= 1.6, maven >= 3.1, gradle >= 1.6 ● Repose sur les nouveautés de Spring 4 ● Orientation architecture standalone / microservices
#backdaybyxebia
@EnableAutoConfiguration
● Configuration automatique de l'application ● Repose principalement sur les @Conditional
#backdaybyxebia
@ConditionalOnClass
@Configuration @ConditionalOnClass(Mongo.class) @EnableConfigurationProperties(MongoProperties.class) public class MongoAutoConfiguration { /* ... */ }
#backdaybyxebia
@ConditionalOnBean
@Configuration @ConditionalOnExpression("${health.db.enabled:true}") @ConditionalOnBean(DataSource.class) public static class DataSourcesHealthIndicatorConfiguration { /* ... */ }
#backdaybyxebia
@ConditionalOnMissingBean
@Bean @ConditionalOnMissingBean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter( ObjectMapper objectMapper) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper); converter.setPrettyPrint(this.properties.isJsonPrettyPrint()); return converter; }
#backdaybyxebia
@ConditionalOnExpression
@ConditionalOnExpression("${security.basic.enabled:true}") @Configuration @Order(SecurityProperties.BASIC_AUTH_ORDER) protected static class ApplicationWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { /*...*/ }
#backdaybyxebia
@ConditionalOnProperty
@Bean @ConditionalOnProperty(prefix = "spring.mvc.", value = "date-format") public Formatter<Date> dateFormatter() { return new DateFormatter(this.mvcProperties.getDateFormat()); }
#backdaybyxebia
● @ConditionalOnMissingClass ● @ConditionalOnNotWebApplication ● @ConditionalOnResource ● @ConditionalOnWebApplication
#backdaybyxebia
Application.java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; @Configuration @EnableAutoConfiguration @Import(RepositoryRestMvcConfiguration.class) @EnableJpaRepositories public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
#backdaybyxebia
Client.java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Client { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; String name; //Getter & Setter }
#backdaybyxebia
ClientRepository.java
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @RepositoryRestResource(collectionResourceRel = "client",path = "client") public interface ClientRepository extends PagingAndSortingRepository<Client,Long> { }
#backdaybyxebia
Sous le capot...
● spring mvc ● jpa + hibernate ● logback ● tomcat ● spring HATEOAS
#backdaybyxebia
STARTERS
#backdaybyxebia
spring-boot-starter-parent
● Gère la version des starters et des dépendances sous-jacentes ● On ne définit que la version de spring boot (ex : 1.2.3.RELEASE)
#backdaybyxebia
spring-boot-starter-web
Tomcat + Spring MVC + logback
#backdaybyxebia
spring-boot-starter-jpa
JPA & Hibernate + Validation + TomcatConnectionPool
#backdaybyxebia
spring-boot-starter-security
● basic auth ● jdbc ● oAuth ● cas ● ...
Spring security
#backdaybyxebia
spring-boot-starter-actuator
● Metrics ● Health Check ● Autoconfig ● Environment information ● Pages d'erreurs par défaut
MVC endpoints + JMX support
#backdaybyxebia
spring-boot-starter-test spring-boot-starter-jetty
spring-boot-starter-mongo
...
Liste complète sur https://github.com/spring-projects/spring-boot/tree/master/spring-boot-starters
#backdaybyxebia
Gestion de configuration
#backdaybyxebia
Fichiers par défaut
● application.properties ● application.yml
#backdaybyxebia
Emplacements par défaut
● classpath: ● classpath:/config ● file: ● file:config/
#backdaybyxebia
Surcharger la configuration
#backdaybyxebia
ConfigurationProperties
@Component @ConfigurationProperties(prefix = "my-app") public class SampleProperties { private String version; private String motd = "Some default value"; // Getters & setters }
#backdaybyxebia
ConfigurationProperties @Component @ConfigurationProperties(prefix = "my-app") public class SampleProperties { private String version; private String motd = "Some default value"; // Getters & setters }
SampleProperties.java
application.yml
my-app : version : 1.2.3 motd : "Un message tellement plus utile"
#backdaybyxebia
ConfigurationProperties
@Service public class SampleService { @Inject ClientProperties properties; }
SampleService.java
#backdaybyxebia
Avec les profiles spring
$java -jar my-app.jar --spring.profiles.active=instance1
SampleProperties.java
application-instance1.yml
# # Override properties from application.yml for instance1 # server : port : 8081
#backdaybyxebia
En précisant les fichiers
$java -jar my-app.jar --spring.config.location=\ file:/etc/my-app/default.properties,\ file:/etc/my-app/instance1.properties
#backdaybyxebia
Spring Cloud
#backdaybyxebia
Gestion de systèmes distribués
● Gestion de la configuration versionnée ● Découverte et enregistrement de services ● Messages distribués ● Locks distribués ● Election de leader dans un cluster ● ...
Liste complète sur http://projects.spring.io/spring-cloud
#backdaybyxebia
spring-boot-netflix ● service discovery ● circuit breaker ● load balancer côté client ● monitoring ● router et filter ● ...
Liste complète sur http://projects.spring.io/spring-cloud
#backdaybyxebia
Démo Gestion des actions
#backdaybyxebia
#backdaybyxebia
#backdaybyxebia
● Tolérance à la panne ● Monitoring en temps réel ● Gestion de la concurrence
#backdaybyxebia
Eureka Découverte de services
#backdaybyxebia
Let’s play
#backdaybyxebia
Critiques
#backdaybyxebia
● Beaucoup de magies ● Obligation de surcharger ● Pratiquement plus de XML ● Même courbe d’apprentissage que Spring
#backdaybyxebia
https://github.com/xebia-france/backday-spring-boot-server