MICRO-BATCH-SERVICES MIT SPRING BOOT Ein Praxisbericht
Tobias Flohre Düsseldorf @TobiasFlohre www.github.com/tobiasflohre blog.codecentric.de/en/author/tobias.flohre tobias.flohre@codecentric.de www.codecentric.de
WORUM GEHT ES? So könnte die schöne neue Welt sein!
WORUM GEHT ES? So könnte die schöne neue Welt sein! So ist die neue Welt! Micro-Batch-Services
WORUM GEHT ES? So könnte die schöne neue Welt sein! So ist die neue Welt! Micro -Batch- Services Tools, Methoden, Frameworks, Vorgehen
AGENDA - Motivation / Problemstellung - Entwicklung - Build - Deployment - Monitoring - Logging
BATCH-ARCHITEKTUR Servlet Container Cron-Job Anwendung HTTP Endpoint Scheduler Batch Application Workflow-System Logs Job- Metadaten 27.03.15 7
BATCH-META-FRAMEWORK Transaktionssicher Metrics Summen Zähler Deployed Jobs Job-Start Job-Execution- Details Status Test-Ressourcen Test- Unterstützung In-Memory Laufende Jobs HTTP-Endpoints Job-Stop Logfile / Protokoll Kerndaten des Joblaufs Protokoll Einheitliches Format Revisionssichere Ablage Logging Thread-Local Logfile pro Job-Execution
MOTIVATION / PROBLEMSTELLUNG Servlet Container HTTP Endpoint Anwendung Batch Application Job Job Job Job Job Job Job Job Job Logs Sparte A Job- Metadaten Problem! Deployment -> Test aller Jobs Jobs sind schwer zu testen Mehrere Anwendungen! Puh... Nee... Anträge, Aufsetzen, git, Build, CI, Properties für Stages, Application Server Deployment, Monitoring, Logging 27.03.15 9
MOTIVATION / PROBLEMSTELLUNG Ein Job pro Anwendung! Voraussetzungen schaffen! Aufsetzen des Projekts muss trivial sein Build-/CI-Jobs nicht manuell erzeugen Application Server loswerden Deployment vereinfachen Monitoring und Logauswertung von vielen Anwendungen ermöglichen
ENTWICKLUNG Spring Boot makes it easy to create stand-alone, productiongrade Spring based Applications that you can "just run".
ENTWICKLUNG Spring Boot Starter liefern Dependencies liefern Konfiguration einfach erweiterbar Spring Boot makes it easy to create stand-alone, productiongrade Spring based Applications that you can "just run".
ENTWICKLUNG Embedded Servlet Container Start per main-methode Startfähiges Fat-Jar java jar app.jar Spring Boot makes it easy to create stand-alone, productiongrade Spring based Applications that you can "just run".
ENTWICKLUNG Monitoring Properties Remote Shell CRaSH Spring Boot makes it easy to create stand-alone, productiongrade Spring based Applications that you can "just run".
ENTWICKLUNG - spring-boot-starter-batch - Batch-Ausführung standalone - Lösung: eigener Spring Boot Starter - Infrastruktureller Code wird geteilt https://github.com/codecentric/spring-boot-starter-batch-web <dependency> <groupid>de.codecentric</groupid> <artifactid>spring-boot-starter-batch-web</artifactid> <version>1.3.4.release</version> </dependency>
ENTWICKLUNG Transaktionssicher Metrics Summen Zähler Deployed Jobs Job-Start Job-Execution- Details Status Test-Ressourcen Test- Unterstützung In-Memory Laufende Jobs HTTP-Endpoints Job-Stop Logfile / Protokoll Kerndaten des Joblaufs Protokoll Einheitliches Format Revisionssichere Ablage Logging Thread-Local Logfile pro Job-Execution
ENTWICKLUNG 1. Wähle eine Basis aus existierenden Spring Boot Startern spring-boot-starter-web spring-boot-starter-batch spring-boot-starter-jdbc spring-boot-starter-actuator
ENTWICKLUNG 2. Eigene Konfiguration und Auto-Configuration META-INF/spring.factories org.springframework.boot.autoconfigure.enableautoconfiguration= de.codecentric.batch.configuration.batchwebautoconfiguration
ENTWICKLUNG 3. Konfigurierbarkeit durch Properties @Value("${batch.max.pool.size:5}") private int maxpoolsize; @Bean public TaskExecutor taskexecutor() { ThreadPoolTaskExecutor taskexecutor = new ThreadPoolTaskExecutor(); taskexecutor.setmaxpoolsize(maxpoolsize); taskexecutor.afterpropertiesset(); return taskexecutor; }
ENTWICKLUNG 4. Erweiterbarkeit durch überschreibbare Default- Implementierungen @ConditionalOnMissingBean(BatchConfigurer.class) @Configuration public class TaskExecutorBatchConfigurer implements BatchConfigurer {} public interface BatchConfigurer { JobRepository getjobrepository() throws Exception; PlatformTransactionManager gettransactionmanager() throws Exception JobLauncher getjoblauncher() throws Exception; JobExplorer getjobexplorer() throws Exception; }
ENTWICKLUNG 5. Abhängigkeit von Klassenpfad und Ressourcen @ConditionalOnClass(name = "javax.persistence.entitymanagerfactory") @ConditionalOnMissingBean(BatchConfigurer.class) @Configuration protected static class JpaBatchConfiguration {} @ConditionalOnMissingClass @ConditionalOnResource @ConditionalOnWebApplication @ConditionalOnExpression @ConditionalOnProperty
ENTWICKLUNG Voraussetzungen schaffen! Aufsetzen des Projekts muss trivial sein Build-/CI-Jobs nicht manuell erzeugen Application Server loswerden Deployment vereinfachen Monitoring und Logauswertung von vielen Anwendungen ermöglichen
BUILD Ziel 1: Build-/CI-Jobs nicht manuell erzeugen Ziel 2: Ein Job für alles -> Build, Release, Deployment
BUILD Build now bei SCM Commit mvn clean package Release manuell mvn build-helper:parse-version versions:set DnewVersion=${...} mvn clean package mvn deploy mvn scm:tag Promotion manuell Deployment auf Stages -> Trigger eines deployapplication-jobs
BUILD trigger job create repo Job DSL Plugin Seed-Job Job, der Job erzeugt 27.03.15 25
ENTWICKLUNG Voraussetzungen schaffen! Aufsetzen des Projekts muss trivial sein Build-/CI-Jobs nicht manuell erzeugen Application Server loswerden Deployment vereinfachen Monitoring und Logauswertung von vielen Anwendungen ermöglichen
DEPLOYMENT Ziel: Deployment vereinfachen
DEPLOYMENT Build erzeugt RPM (Red Hat Package Manager) Maven RPM Plugin Startskript + Spring Boot Fat Jar Installationslogik (<preinstallscriptlet>) Properties umgebungsabhängig aus SCM Alternative: Spring Cloud Config Java Property- Resolver deployapplication Job ermittelt Server für Stage ssh -> yum install <artefakt> Spring Boot Anwendung 27.03.15 28
ENTWICKLUNG Voraussetzungen schaffen! Aufsetzen des Projekts muss trivial sein Build-/CI-Jobs nicht manuell erzeugen Application Server loswerden Deployment vereinfachen Monitoring und Logauswertung von vielen Anwendungen ermöglichen
MONITORING Spring Boot Actuator + Spring Boot Admin: Live-Demo
LOGGING Anwendung Anwendung Anwendung Anwendung ElasticSearch + Logstash + Kibana
LOGGING
ENTWICKLUNG Voraussetzungen schaffen! Aufsetzen des Projekts muss trivial sein Build-/CI-Jobs nicht manuell erzeugen Application Server loswerden Deployment vereinfachen Monitoring und Logauswertung von vielen Anwendungen ermöglichen
RESSOURCEN https://github.com/codecentric/spring-boot-starter-batch-web https://github.com/codecentric/spring-boot-admin https://blog.codecentric.de/en/2014/11/extending-springboot-five-steps-writing-spring-boot-starter/ https://blog.codecentric.de/2015/01/continuous-delivery-furmicroservices-mit-jenkins-und-dem-job-dsl-plugin/ https://blog.codecentric.de/2014/10/log-management-furspring-boot-applikationen-mit-logstash-elastichsearch-kibana/
FRAGEN? Tobias Flohre Merscheider Straße 1 42699 Solingen tobias.flohre@codecentric.de www.codecentric.de blog.codecentric.de www.meettheexperts.de 27.03.15 35