Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
2020
Bien évidemment, ces frameworks sont interopérables les uns avec les autres.
Le but recherché est de laisser Spring se charger au maximum des mécanismes techniques du développement qui sont coûteux à mettre en
place (la plomberie). Ainsi, le développeur se concentre sur les règles métier de son application.
– la configuration : conventions et paramétrages par défaut (dépendances Maven, configuration Spring), qui assurent une bonne
intégration des différents frameworks
– l'exécution : un serveur d'applications (Tomcat, Jetty ou Undertow) est embarqué dans le jar/war exécutable de l'application
– la mise en place de microservices : support de libraires et d'une plateforme de microservices
– le déploiement dans un Cloud : aide à la configuration, outils, clients Cloud. Intégration avec Cloud Foundry
Spring Boot pousse la logique de simplification et d'intégration entamée par Spring à son maximum.
Note : Spring Boot n'apporte pas de nouvelles solutions aux problématiques déjà prises en charge par les autres frameworks
Spring.
– des Spring Boot Starter : réduction des dépendances dans le fichier de build
- rassemble un groupe de dépendances liées entre elles (domaine commun) en une seule dépendance
- il existe de nombreux starters (web, data-jpa, security, test...)
- le pom.xml devient très compact et simple à lire/modifier
– Spring AutoConfigurator : réduction de la configuration Spring
- autoconfiguration des frameworks sans fichier XML
- réduction des annotations Java à mentionner explicitement
- possibilité de surcharger cette configuration dans un fichier .properties/yml
– Spring Actuator : outils de supervision d'application Spring Boot
- métriques de suivi (logs, liste des beans, thread dump...)
- création de ses propres métriques
- ajout d'endpoints REST
En fonction des choix exprimés par l'utilisateur (Web, JPA, Security, Cloud...), le squelette du projet est créé, notamment en ajoutant les
dépendances Maven nécessaires (les starters).
Note :
– le projet généré n'est pas un projet Maven multi-modules, puisque plutôt orienté microservices
– il n'y a pas de code métier, donc le projet n'est pas testable directement, contrairement aux anciens Orange Maven
Archetypes
Les commandes sont de la forme : curl [URL] [options] ou curl [options] [URL]
On peut s'en servir pour accéder à la création d'un projet Spring Initializr, par exemple :
curl https://start.spring.io/starter.zip
-d applicationName=MyProjectApplication
-d dependencies=web,data-jpa
-o MyProject.zip
Pour avoir plus d'informations sur les paramètres et les dépendances possibles :
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Ce parent apporte :
Rappel : la section <dependencyManagement> du pom.xml déclare des dépendances mais ne les importe pas. Il faut spécifier
celles que l'on veut vraiment utiliser dans la section <dependencies>.
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Note : il n'est pas nécessaire de spécifier la version du starter, elle est paramétrée dans la dépendance spring-boot-
dependencies.
Il est possible d'en changer dans la partie <properties> du pom.xml de l'application, en surchargeant celles déclarées dans le pom.xml de
spring-boot-dependencies :
<properties>
...
<java.version>11</java.version>
<slf4j.version>1.7.29</slf4j.version>
...
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Note : nous verrons plus loin dans la formation quel packaging privilégier.
Cette annotation va entre autres scanner le package courant et les sous-packages pour détecter les beans Spring (annotés @Named,
@Component, @Controller, @Service...).
Cette classe principale contient la méthode main() qui sert à exécuter l'application.
package com.orange.todolist;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ToDoListDemoApplication {
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT,
properties="classpath:test.properties")
public class ToDoList_API_Test {
...
@LocalServerPort
private int port;
@BeforeEach
public void setUp() throws Exception {...}
@Test
public void findAllToDoLists_OK() throws Exception {...}
...
}
On peut surcharger la page d'erreur par défaut de Spring Boot par des pages customisées. Elles doivent :
Pour plus d'informations sur la surcharge de la page d'erreurs, rendez-vous sur la documentation Spring Boot.
Le format .yml ressemble beaucoup à du .json. C'est pratique pour définir des données de configuration hiérarchiques (mais attention au
respect de l'indentation !).
Le fichier principal de configuration application.properties (ou application.yml) peut par exemple définir :
– pour donner des configurations différentes suivant les environnements cibles (développement, test, intégration, production...)
– qui viendront surcharger celles définies dans le fichier par défaut.
– application-dev.properties ou application-dev.yml
– application-prod.properties ou application-prod.yml
#application-dev.properties
server.port: 4431
#application-prod.properties
server.port: 4432
#application-dev.yml
server:
port: 4431
#application-prod.yml
server:
port: 4432
spring:
application:
name: demoservice
server:
port: 8080
---
spring:
profiles: dev
server:
port: 4431
---
spring:
profiles: prod
server:
port: 4432
#application.properties
spring.profiles.active=prod
Quand un profil est lancé, le fichier correspondant est lu après le fichier principal de configuration application.properties/.yml, ce qui permet
de surcharger ses propriétés.
Note : si vous déployez une application dans Cloud Foundry, le fichier application-cloud.properties/.yml sera chargé par
défaut. Il n'est donc pas nécessaire de spécifier le profil actif.
Conseil :
– rassembler les propriétés communes (ou par défaut) à tous les environnements dans un ou plusieurs fichiers
.properties/.yml, à déployer dans le jar/war (messages...)
– externaliser la configuration dépendante de l'environnement cible dans un ou plusieurs fichiers de profils déployés en
dehors du jar/war.
#properties
logging.level.root = WARN
logging.level.com.orange.todolist = DEBUG
logging.file = /tmp/todolistApp.log
#yml
logging:
level:
root: WARN
com.orange.todolist: DEBUG
file: /tmp/todolistApp.log
Plus de précisions sur la gestion des logs dans Spring Boot ainsi que des profils.
logging.path = /tmp
logging.config = classpath:logback-custom.xml
<include resource="org/springframework/boot/logging/logback/base.xml"/>
</configuration>
Cela permet de :
– Elasticsearch :
- base de données NoSQL
- stockage massif des données, notamment des logs
- moteur de recherche, d'indexation et d'analyse de données
– Logstash :
- pipeline acceptant en entrée des données provenant de différentes sources
- fait des transformations, agrégations... sur ces données
- exporte les données vers d'autres outils, notamment Elasticsearch pour stockage
– Kibana :
- interface web permettant d'explorer les masses de données stockées dans Elasticsearch
- rendus graphiques très variés (nuages de points, courbes, graphes...)
Cloud Foundry utilise un service Logsearch opensource au dessus d'ELK, permettant de manager un environnement ELK dans un contexte
cloud.
<properties>
<logstash-encoder.version>6.4</logstash-encoder.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>${logstash-encoder.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Par défaut, Sleuth ne renvoie que 10% des logs vers la plateforme distante. Il est possible de modifier ce pourcentage dans le fichier
application.properties :
# entre 0 et 1
spring.sleuth.sampler.probability = 0.5
<root level="INFO">
<appender-ref ref="JSON" />
</root>
</configuration>
Les autres options sont disponibles pour les versions précédentes de Spring Boot. Notamment Actuator Docs qui ajoutait la
documentation d'Actuator directement dans l'application sous forme d'endpoint (URL) prédéfinie.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Par défaut, tous ces enpoints sont autorisés (sauf /shutdown) mais pas forcément exposés (donc pas accessibles). On peut changer leur
autorisation individuellement dans le fichier application.properties/yml :
management.endpoint.shutdown.enabled=true
management.endpoint.threaddump.enabled=false
Attention : ne pas exposer et autoriser certains endpoints sans les sécuriser, car ils peuvent donner des informations sensibles
sur l'application. Si Spring Security est présent, ils sont sécurisés par défaut (sauf /health et /info) et nécessitent une
authentification. Il est possible de modifier les droits d'accès de chaque endpoint en fonction de rôles.
Enfin, il est possible de créer ses propres endpoints (exposés via JMX ou HTTP ou les 2).
D'autres informations sur l'application, issues du fichier pom.xml (name, groupId, artifactId, date du build...), peuvent être ajoutées directement
grâce à la configuration du plugin spring-boot-maven-plugin :
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<!-- generates build information (used by actuator info) -->
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
de Spring à Spring Boot - le chef d'orchestre Spring Boot (Orange internal)
déploiement avec Spring Boot
– d'un PaaS : l'utilisation du fat jar est conseillée, car on est sûr que le binôme Tomcat/jar est identique d'un bout à l'autre de la chaîne de
production. La supervision est à la charge du PaaS.
– d'une plateforme Platon : il vaut mieux s'appuyer sur un fat war déployé dans un Tomcat Platonisé.
A noter qu'un fat war peut aussi bien être autoexécutable que déployé dans un Tomcat classique. Le Tomcat embarqué est alors ignoré.
– en développement : sur le poste du développeur, l'utilisation du Tomcat embarqué est très pratique
– dès l'intégration continue : déployer ce même fat war mais dans un Tomcat externe aussi proche que possible de celui en production.
Ceci afin d'éviter les différences de plateforme entre les tests et la production.
Elle permet de :
<profiles>
<profile>
<id>deploy-war</id>
<properties>
<packaging>war</packaging>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
...
</profile>
</profiles>
@SpringBootApplication
public class ToDoListDemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ToDoListDemoApplication.class);
}
}
Cela permet de remplacer le traditionnel fichier de configuration web.xml, et possiblement d'ajouter de la configuration (profil par défaut,
arguments de lancement de l'application...).
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>${cargo.version}</version>
<!-- informations sur le serveur : url, port, user, pwd... -->
...
</plugin>
Ce plugin serait utile dans le profil deploy-war présenté précédemment par exemple.