Spring Boot - Wird Spring jetzt wirklich einfach?

Post on 21-Jan-2018

241 views 2 download

transcript

SPRING BOOTWird Spring jetzt wirklich einfach?

Jens Presser

INHALTE1. Hintergrund2. Was ist Spring Boot?3. Wie funktioniert es?4. Demo

HINTERGRUND

Herausforderungen

DependenciesVersionenSpring KomponentenSpring Klassenhohe Lernkurve"selbstgemachte" Spring-Konfigurationen

yeah, sure, you just connect your TransactionAwareConnectionFactoryProxyto your UserCredentialsConnectionFactoryAdapter to your ..

Folgen

BoilerplateGoogle/Stackoverflow Driven DevelopmentCopy&Paste aus anderen Projekten

WAS IST SPRING BOOT?

Spring Boot Mission Statement

Spring Boot makes it easy to create stand-alone, production-grade Spring based

Applications that you can "just run". We takean opinionated view of the Spring platform

and third-party libraries so you can getstarted with minimum fuss. Most Spring Boot

applications need very little Springconfiguration.

Ziele

Vereinfachung von Spring ProjektenOut-of-the-box VerhaltenNichtfunktionale Features bspw. Embedded Servers, Healthchecks, Metrics, Externalized Configuration

Optimierungen in Richtung:MicroservicesCloud-basierte Applikationen12 factor applications

Exkurs: 12 factor applications

one codebase, many deploysexplicit dependenciesconfiguration in environmentbacking services as attached resourcesseparate build, release and run stagesstateless processexport service via port bindingscale out as processesrobustness with fast startup times, graceful shutdownkeep dev and prod as similar as possiblelogs as event streams (stdout)admin/management tasks as one-off processes

Features

Dependency Management Maven/GradleAutoConfigurationConvention over ConfigurationExternalisierte KonfigurationProfileAusführbare ArtefakteKeine Bytecode Manipulation oder Codegenerierung

WIE FUNKTIONIERT ES?

Spring Initializr

Generator für Spring Boot ProjekteSelektion von Spring Boot KomponentenParametriert durch:

Artefakt-Koordinaten (group, artifact)PackagingJava/Spring Boot VersionSprache (Java/Groovy)

http://start.spring.io/

Spring Boot Starters

"POM" Projekte für definierte Sets von DependenciesDepencency ManagementZugriff auf:

Spring Portfolio Module z.B. Web, Security, Data

3rd Party z.B. Activiti, Stormpath

Eigene Starters

Spring Boot Plugins

Plugins für Build-Tools Maven und GradleDependecy (Version) ManagementSelf-executable JARs

enhalten abhängige JARseigener Classloader und Main Klasse

Ausführbarkeit aus dem Build-Tool:

java -jar target/my-spring-boot-demo.jar

mvn spring-boot:run

gradle bootRun

Spring Booting...

package com.example.myproject;

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

... that's all!

AutoConfiguration

Vorgefertigte Spring @ConfigurationsCondition und @Conditional@ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnWebApplication

@Configuration @ConditionalOnClass(ObjectMapper.class) @ConditionalOnBean(ObjectMapper.class) protected class MappingJackson2HttpMessageConverterConfiguration { @Bean @ConditionalOnMissingBean public MappingJackson2HttpMessageConverter mj2hmc(ObjectMapper objectMapper) { // pseude code, der Name ist zu lang ;-) MappingJackson2HttpMessageConverter converter = new MJ2HMC(objectMapper); if (this.properties.isJsonPrettyPrint() != null) { converter.setPrettyPrint(this.properties.isJsonPrettyPrint()); } return converter; } }

Externalized Configuration

Spring Boot DefaultsPropertySources in @Configurationapplication.properties in JAR / externapplication-{profile}.properties in JAR / externUmgebungsvariablen

System-Properties

SPRING_APPLICATION_JSON UmgebungsvariableCLI Argumente

SERVER_PORT=8080

-Dserver.port=8080

--server.port=8080

YAML Format für Konfigurationsdateien (application.yml)Property Placeholder

profilspezifische Konfigurationsdateienapplication.propertiesapplication-default.propertiesapplication-[profile].properties

Typsicherheit, Casting, Namespacing via@ConfigurationProperties

prop.message=Hello ${prop.name}!

spring.profiles.active=prod spring.profiles.include=proddb,prodmq

@ConfigurationProperties

@Component @ConfigurationProperties(prefix="connection") public class ConnectionSettings { private String username; private InetAddress remoteAddress; // ... getters and setters }

@Autowired private ConnectionSettings connection;

connection.username=demo connection.remoteAddress=192.168.0.1

Logging

Vordefinierte DefaultsFormate, Loglevel, Appender etc. konfiguriertDefault: Nur CONSOLE AusgabeERROR, WARN, INFO⇒ Keine Log-Konfigurationsdatei nötig

Log-Konfiguration

Logdatei kann aktiviert werden

Debug über Flag aktivierbar

Log-Level

Log Pattern

logging.file=demo.log logging.path=/data/demo-app/

--debug -Ddebug=true

logging.level.my.package=DEBUG

logging.pattern.console=... logging.pattern.file=...

DevTools

Default-Properties für Development z.B. spring.thymeleaf.cache=false

Automatic RestartLiveReload Browser SupportRemote Debug Tunneling (via HTTP[S])Remote Update and Restart

Actuators

production ready featuresHealthChecks z.B. Connections zu DB, MQ oder Diskspace …

Metrics und Metric Export z.B. Uptime, Requests, Memory, Pools, Cache, GC, Heap …

Weitere Endpoints: info, env, dump, shutdown …

JMX (over HTTP)Remote ShellAuditingPID und Port Dateien

Caveat

KonventionenAutoConfigurationUmgebungsvariablenDefault: Single ConnectionFramework für ein Framework

DEMO TIME

Fazit

IMHO

Schnelles AufsetzenSinnige Defaults80:20 RegelPrototyping?Kenntnis der Konventionen/Automatismen

VIELEN DANK FÜR EURE AUFMERKSAMKEIT!Fragen oder Anmerkungen?