Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microservices – ein Praxisbericht

Microservices – ein Praxisbericht

Spring Boot Starter, Jenkins Job DSL, RPMs und ELK

Dennis Schulte

June 29, 2015
Tweet

More Decks by Dennis Schulte

Other Decks in Technology

Transcript

  1. Worum geht es heute nicht? Was sind Microservices? Allgemeine Vor-

    und Nachteile Bibliotheken im Beta-Status 4
  2. BATCH-META-FRAMEWORK HTTP-Endpoints Job-Start Status Job-Stop Logfile / Protokoll Laufende Jobs

    Deployed Jobs Job-Execution- Details Logging Logfile pro Job- Execution Thread-Local Protokoll Einheitliches Format Kerndaten des Joblaufs Revisionssichere Ablage Metrics Test- Unterstützung Test-Ressourcen In-Memory Zähler Summen Transaktionssicher
  3. Servlet Container Anwendung Batch Application HTTP Endpoint Job- Metadaten Logs

    Sparte A Job Job Job Job Job Job Job Job Job 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 MOTIVATION / PROBLEMSTELLUNG
  4. 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
  5. ENTWICKLUNG Spring Boot makes it easy to create stand-alone, production-grade

    Spring based Applications that you can "just run".
  6. ENTWICKLUNG Spring Boot makes it easy to create stand-alone, production-grade

    Spring based Applications that you can "just run". Spring Boot Starter liefern Dependencies liefern Konfiguration einfach erweiterbar
  7. ENTWICKLUNG Spring Boot makes it easy to create stand-alone, production-grade

    Spring based Applications that you can "just run". Embedded Servlet Container Start per main-Methode Startfähiges Fat-Jar java –jar app.jar
  8. ENTWICKLUNG Spring Boot makes it easy to create stand-alone, production-grade

    Spring based Applications that you can "just run". Monitoring Properties Remote Shell CRaSH
  9. 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.5.RELEASE</version> </dependency>
  10. ENTWICKLUNG HTTP-Endpoints Job-Start Status Job-Stop Logfile / Protokoll Laufende Jobs

    Deployed Jobs Job-Execution- Details Logging Logfile pro Job- Execution Thread-Local Protokoll Einheitliches Format Kerndaten des Joblaufs Revisionssichere Ablage Metrics Test- Unterstützung Test-Ressourcen In-Memory Zähler Summen Transaktionssicher
  11. 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
  12. 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; }
  13. 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; }
  14. 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
  15. 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
  16. BUILD Ziel 1: Build-/CI-Jobs nicht manuell erzeugen Ziel 2: Ein

    Job für alles -> Build, Release, Test, Deploy
  17. BUILD 30.06.1 5 24 job(type: Maven) { name("${projectName}") triggers {

    scm("*/5 * * * *") } scm { git { remote { url("https://github.com/codecentric/spring-samples") } } } goals("clean package") }
  18. BUILD 30.06.1 5 25 def repository = "codecentric/spring-samples" def contentApi

    = new URL("https://api.github.com/repos/${repository}/ contents") def projects = new groovy.json.JsonSlurper().parse(contentApi.newReader()) projects.each { def projectName = it.name; job(type: Maven) {…} }
  19. 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
  20. 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
  21. DEPLOYMENT 30.06.1 5 32 Release Deploy ssh à yum install

    <artefakt> + Properties umgebungsabhängig aus SCM ermitteln (Alternative: Spring Cloud Config) Releasebuild erzeugt RPM (z.B. mit Maven RPM Plugin) + Spring Boot Fat Jar + Startskript + Installationslogik (<preinstallScriptlet>)
  22. DEPLOYMENT 30.06.1 5 33 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>rpm-maven-plugin</artifactId> <configuration> <name>${project.name}</name> <mappings>

    <mapping> <directory>/opt/${project.name}/</directory> <sources> <source> <destination>${project.name}.jar</destination> <location>target/${project.artifactId}.jar</location> </source> </sources> </mapping> </mappings> </configuration> </plugin>
  23. 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
  24. LOGGING ElasticSearch + Logstash + Logstash Forwarder + Kibana Anwendung

    Forwarder Anwendung Forwarder Anwendung Forwarder Anwendung Forwarder Logstash
  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 ✔