Spring Boot
Osnova
-
Úvod
-
Konfigurace
-
Vývoj a monitoring
-
Web application
-
Security
-
Databases
-
noSQL
-
Cache
-
Messaging
-
Testování
Úvod
Architektura
Spring Framework
- především IoC (Inversion of Control)
kontejner - Application context a Beany
Spring MVC Framework
- nástroje pro tvorbu web aplikací
- Dispatcher Servlet, ModelAndView a
View Resolver
Spring Boot
- autokonfigurace (použití "běžných"
výchozích hodnot) - nástroje pro vytvoření samostatně běžící aplikace
https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/overview.html
Benefity použití Spring Boot
- rychlé a snadné vytváření aplikací (Initializr, Starters)
- SaaS (Software as a Service) díky vestavěnému serveru => vhodné pro vývoj microservice
- externalizace konfigurace Frameworku i komponent (env vars, YML soubory)
- pokročilá správa závislostí díky Starters
- defaultní konfigurace závislostí
- zaručená kompatibilita závislostí díky centrální definici verzí (BOM)
- nástroje pro vývojáře (automatický restart, Actuator)
- ...
Komponenty Spring Bootu
Spring Boot Core
- poskytuje základní funkce pro ostatní moduly
- práce s konfiguračními proměnnými (konverze konfiguračních proměnných do Bean)
Autoconfigure
- automatická detekce přidání závislostí
- konfigurace pomocí běžných hodnot
CLI
- nástroje pro příkazový řádek
- prototypování, packaging, inicializace projektu
http://www.adeveloperdiary.com/java/spring-boot/an-introduction-to-spring-boot/
Komponenty Spring Bootu
Starters
- závislosti sdružené za účelem splnit nějaký běžný use-case
- zaručená kompatibilita verzí
Tools
- nástroje pro sestavení aplikace (Maven, Gradle)
- class loadery (lib, classes)
Actuator
- nástroje pro monitoring a profiling aplikace
http://www.adeveloperdiary.com/java/spring-boot/an-introduction-to-spring-boot/
CLI
- stačí stáhnout archiv a přidat do bin/PATH
- rychlé prototypování, vytoření kostry projektu, vytvoření standalone aplikace
- některé příkazy:
- run - spuštění groovy skriptu ve Stringu
- jar/var - vytvoří standalone aplikaci s groovy skriptů
- init - průvodce vytvořením kostry Spring Boot projektu
Příklady
Run - Hello World
- vytvoříme soubor app.groovy
-
spring run app.groovy
@RestController
class App {
@RequestMapping("/")
String home() {
return "Hello World!"
}
}
Init
-
spring init --dependencies=web,actuator test-project
Starters
- přepřipravené balíčky závislostí řešící jeden doménový problém
- dostupné v Maven repozitáři s prefixem spring-boot-starter-
- seznam s popisem je dostupný v dokumentaci
- nejpoužívanější
- spring-boot-starter-data-jpa
- spring-boot-starter-web
- spring-boot-starter-test
Struktura Starters balíčků
- použití parent elementu v pom.xml pro vytvoření dědičnosti
- ve Spring Boot aplikaci použijeme jako parenta v pom.xml spring-boot-starter-parent
- definice výchozích hodnot pro Maven
- dědí z spring-boot-dependencies
- spring-boot-dependencies je BOM (Bill of Materials) což je speciální POM určený pro centrální definici verzí závislostí
- díky podědění spring-boot-dependencies je možné vynechat version element u závislostí a máme jistotu, že daná kombinace závislostí funguje
Vytvoření aplikace
Spring Boot nabízí následující tři možnosti jak jednoduše vytvořit novou plně funkční aplikaci:
- Z příkazové řádky pomocí Spring Boot CLI
- Online pomocí nástroje SPRING INITIALIZR
- V IDE s podporou Spring Boot
Spring Boot CLI
- instalace je popsána v dokumentaci
- sada nástrojů pro příkazovou řádku které umožňují například:
- jednoduché prototypování s využitím příkazu run (pro Groovy soubory)
- vygenerování kostry nového projektu s definicí závislostí příkazem init
- vytvoření samostatně spustitelné aplikace příkazem jar
spring init --dependencies=web,data-jpa my-project
spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip
SPRING INITIALIZR
- online nástroj pro vytvoření aplikace dostupný na adrese https://start.spring.io/
- po nastavení požadovaných hodnot lze stáhnout jako zip
- archiv obsahuje spustitelnou kostru projektu
IDE
IDEA
- Instalace pluginu Spring Boot
- File -> New -> Project
- V pravém sloupci by mělo být možné vybrat Spring Initializr
Eclipse
- Instalace STS (Spring Tool Suite) přes Marketplace
- File -> New -> Spring -> Spring Starter Project
Statický obsah
Spring Boot má ve výchozím stavu předkonfigurovánu správu následujícího statického obsahu:
- obsah adresářů /static, /public, /resources, /META-INF/resources
- banner v podobě textu i obrázku
- favicon.ico
- welcome page (index.html)
- chybove stránky
Banner
Textový Banner
- do src/main/resources stačí přidat soubor banner.txt
- pokud existuje i obrázkový banner, tak se textový vypíše pod něj
- podporuje ANSI barvy
Obrázkový Banner
- do src/main/resources stačí přidat soubor banner.<png|jpg>
- obrázek je automaticky převeden na ASCII art
- vzhled je možné ovlivnit konfiguračními proměnnými spring.banner.image.*
${AnsiColor.MAGENTA} Text banneru
Favicon, Welcome a Error stránky
Favicon
- do src/main/resources přidáme favicon.ico
Welcome page
- do src/main/resources/templates přidáme index.html
Error stránky
- přidáme závislost na některém z šablonovacích systémů
- obecná šablona src/main/resources/templates/error.<html|ftl>
- šablony podle kódu chyby src/main/resources/templates/error/<kod_chyby>.<html|ftl> (404.html jen pro 404, 5xx.html pro celou třídu chyb)
Konfigurace
@SpringBootApplication
- Označuje hlavní třídu/vstupní bod aplikace
- Sestává z dalších anotací:
- @Configuration
- @ComponentScan
- @EnableAutoConfigure
@EnableAutoConfiguration
- Zapne "automatické konfigurace" modulů naší aplikace
- Hledá a použije auto-configuration beany
- beana označena @Configuration a registrována jako auto-configuration beana
- registrace beany v souboru META-INF/spring.factories
- beana "hádá" co chceme podle dependecies a vytváří default konfigurace
@Conditional...
- @ConditionalOnClass(clazz.class)
- @ConditionalOn(Missing)Bean(name="dataSource")
- @ConditionalOnProperty(name="mysql", havingValue="local")
- @ConditionalOnResource(resources="classpath:db.properties")
- @ConditionalOn(Not)WebApplication
- @ConditionalOnExpression("SpEL")
- @Conditional(OurConditionalClass.class) - pro složitější případy, custom implementace
Externalizace konfigurace
- command-line args - SB převede argumenty '--server.port=9000' na property
- environment variables
- properties file/YAML file
Properties file
- čtení zajišťuje 'PropertySourcePLaceholder' který je defaultně nakonfigurován
- application.properties - default property file (src/main/resource)
- lze měnit --spring.config.location=classpath:/another-location.properties
- application-env.properties - kde env je spring profile
- použije se dle profilu spolu s defaultním a případnými dalšími
- @ConfigurationProperties(prefix = "db") - umožní vytvořit ze souboru java reprezentaci s možností validací atp.
- @PropertySource("classpath:config.properties") - umožní hledat v jiném než defaultním souboru
Configuration metadata
při kompilaci vygenerován soubor spring-configuration-metadata.json
Prerekvizity
- anotace @ConfigurationProperties na property file
- závislost spring-boot-configuration-processor
Vlastnosti
- default hodnota přiřazením v kódu
- description z javadoc komentáře
- hodnoty výčtu automaticky v našeptávači
- pomocí additional-spring-configuration-metadata.json lze rozšiřovat/přetěžovat
Properties file - validace
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperty {
@NotNull
private String name;
@Pattern(regexp = "^.*?[0-9]{2,3}$")
private String description;
private String version;
private String buildTime;
.
.
.
}
Build informace
- spring-boot-maven-plugin + BuildProperties
- vytvoří soubor build-info.properties
- data lze získat i z objektu 'BuildProperties' který lze injectnout
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-info</id>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
#Properties
#Wed Oct 24 21:29:57 CEST 2018
build.time=2018-10-24T19\:29\:57.180Z
build.artifact=spring-boot-app
build.group=com.cleverlance.training
build.name=spring-boot-app
build.version=0.0.1-SNAPSHOT
Vývoj a monitoring
Developer Tools
-
zapneme přidáním závislosti spring-boot-devtools (optional)
- automaticky zakázané na produkci
- cachování je zakázáno (kompletní seznam změn v properties)
Komponenty
- spring-boot-maven-plugin
- automatický restart
- LiveReload
Globální nastavení
- .spring-boot-devtools.properties v HOME adresáři
- použije se pro všechny spring boot aplikace na daném stroji
spring-boot-maven-plugin
- maven goaly
- spring-boot:run - spuštění spring boot aplikace in-place (z Maven JVM)
- spring-boot:repackage - vytvoření spustitelného jar/war
- spring-boot:start and spring-boot:stop - neblokující spuštění pro integrační testy
- spring-boot:build-info - vygenerování souboru build-info.properties
- nastavení pro možnost vzdáleného debuggování pomocí devtoools
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
- další možnosti nastavení v dokumentaci
Automatický Restart
- watcher na classpath projektu
- IDEA - nutný build, automaticky jen po zásahu do registrů
- Eclipse - při uložení souboru
- změny statického obsahu a šablon jsou ignorovány
- spuštění s dev tools
- spring-boot-maven-plugin (spring-boot:run goal)
- SpringApplication.run
- pro rychlejší restart se používají dva classloadery
- base classloader: neměnné classy (3th party jars)
- restart classloader: pro classy projektu (staví se při každém restartu)
- nefunguje pro vyhrazené názvy projektů jako spring-boot ;-)
Automatický Restart - nastavení
- spring.devtools.restart.exclude
- spring.devtools.restart.additional-exclude
- spring.devtools.restart.additional-paths
- spring.devtools.restart.enabled
- spring.devtools.restart.trigger-file
LiveReload
- spring-boot-devtool obsahuje integrovaný LiveReload server
- je potřeba mít nainstalovaný doplňek pro LiveReload v prohlížeči
- vyvoláno po buildu projektu
- defaulně jsou sledovány následující umístění
- /META-INF/maven
- /META-INF/resources
- /resources
- /static
- /public
- /templates
Spring Boot Actuator
- nástroj pro monitorování a správu aplikace
- přidání prostřednictvím závislosti spring-boot-starter-actuator
- endpointy dostupné prostřednictvím HTTP/S (Spring Boot Admin) a JMX (JConsole)
- možnost použít Jolokia JMX-HTTP bridge
Přístup k endpointům
- /actuator - seznam dostupných endpointů
- /actuator/<id> - konkretní endpoint
Konfigurace Endpointů
- management.endpoint.<id>.enabled - false = odstranění z contextu
- management.endpoints.<web|jmx>.exposure.exclude - skrytí endpointu
- management.endpoints.<web|jmx>.exposure.include - vystavení endpointu
Endpointy
/actuator/health
- detailní info přes web management.endpoint.health.show-details=always
- vlastní healtcheck implementací rozhraní HealthIndicator
/actuator/info
- info o aplikaci
- automaticky jsou publikovány všecny env properties ve formátu info.*
- dále jsou publikovány informace z InfoContributor bean (např.: build, git)
/actuator/shutdown
- by default je zakázaná
- lze povolit management.endpoint.shutdown.enabled=true
- umožňuje graceful shutdown
Endpointy
/actuator/metrics
- informace o OS, JVM a aplikaci
- dva typy metrik gauge (hodnota), counter (počítadlo)
- přidání vlastní metriky přes beanu MeterRegistry
- seznam podporovaných monitorovacích nástrojů
vytvoření vlastního endpointu
- by default je povolený
- anotace @Endpoint(id = <id> [, enableByDefault = false]) na beaně
- anotace @ReadOperation (GET), @WriteOperation (POST) na metodě
Profiling - Prometheus
anotace @Timed (io.micrometer)
- automatická registrace metriky typu timer
- zaznamenávání času stráveného ve funkci
Konfigurace
- závislosti org.aspectj.aspectjweaver a io.micrometer.micrometer-registry-prometheus
- anotace @EnableAspectJAutoProxy v konfiguraci applikace
- pridání prometheus endpointu do konf. management.endpoints.web.exposure.include
- anotace @Timed(value = <název_timeru>) nad metodou
- vytvoření beany TimedAspect
Webové aplikace
Spring Web MVC
- asd
Spring boot
By Jiří Čížek
Spring boot
- 272