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:

 

  1. Z příkazové řádky pomocí Spring Boot CLI
  2. Online pomocí nástroje SPRING INITIALIZR
  3. 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

  1. Instalace pluginu Spring Boot
  2. File -> New -> Project
  3. V pravém sloupci by mělo být možné vybrat Spring Initializr

Eclipse

  1. Instalace STS (Spring Tool Suite) přes Marketplace
  2. 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)

@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

Developer Tools

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>

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 endpoint​​u

  • 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

  • 264