Containerized Software: Spring Boot

Andere delen in de serie:

Spring Boot maakt het gemakkelijk om stand-alone Spring-gebaseerde applicaties van productiekwaliteit te creëren die we ‘gewoon kunnen draaien’ en geeft de voorkeur aan conventie boven configuratie. We kunnen Spring Boot gebruiken om Java-applicaties te maken die kunnen worden gestart met java -jar. We kunnen een op zichzelf staande HTTP-server maken met embedded Tomcat, Jetty of Undertow (merk op dat we ook Spring Boot-applicaties kunnen implementeren in elke Servlet 3.0+ compatibele container). De meeste webapplicaties zullen de spring-boot-starter-web module gebruiken om snel aan de slag te gaan. De Spring Boot-starters (in het bijzonder spring-boot-starter-web) gebruiken Tomcat standaard als een embedded container. Diverse eigenschappen kunnen worden opgegeven in het bestand application.properties of als schakelopties voor de opdrachtregel.

Set-up Spring Boot

Om Spring Boot op te zetten, beginnen we met het Maven POM-bestand, bijvoorbeeld

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>
 
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.M3</version>
    </parent>
 
    <!-- Add dependencies -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-jmx</artifactId>
        </dependency>
    </dependencies>
 
    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>
</project>

Starter-POM’s zijn een reeks handige afhankelijkheidsdescriptors die we in de applicatie kunnen opnemen. We krijgen een one-stop-shop voor alle Spring en aanverwante technologie die we nodig hebben, zonder door voorbeeldcode te hoeven zoeken en ladingen van afhankelijkheidsdescriptorelementen te kopiëren en plakken:

  • spring-boot-starter-web: ondersteuning voor full-stack webontwikkeling, inclusief de embedded servlet container Tomcat en spring-webmvc.
  • spring-boot-starter-actuator: productieklare functies om te helpen bij het bewaken en beheren van de applicatie.

Spring Integration biedt abstracties over berichten en ook andere transporten zoals HTTP, TCP enzovoort. Statistieken zullen over JMX worden gepubliceerd als spring-integration-jmx ook op het klassenpad staat (meer informatie is hier te vinden).

Voorbeeld

Als voorbeeld gebruiken we de volgende code

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.Random;
 
@RestController
@EnableAutoConfiguration
public class Example {
 
    private Random generator = new Random();
 
    @RequestMapping("/")
    String home() {
        return Long.toString(Math.abs(generator.nextLong()), 36);
    }
 
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
}

De eerste annotatie, @RestController, staat bekend als een stereotype annotatie. Het biedt hints voor mensen die de code lezen, en voor Spring, dat de klasse een specifieke rol speelt. In dit geval is de klasse een web @Controller, dus Spring zal er rekening mee houden bij het afhandelen van inkomende webverzoeken. De annotatie @RequestMapping biedt routeringsinformatie. Het vertelt Spring dat elk HTTP-verzoek met het pad / moet worden toegewezen aan de home-methode. De @RestController-annotatie vertelt Spring om de resulterende string direct terug te geven aan de caller. Meer informatie vind je hier.

De tweede annotatie op klasseniveau is @EnableAutoConfiguration. Deze annotatie vertelt Spring Boot om te ‘raden’ hoe we Spring willen configureren, op basis van de jar-afhankelijkheden die we hebben toegevoegd. Sinds spring-boot-starter-web Tomcat en Spring MVC heeft toegevoegd, gaat de automatische configuratie ervan uit dat we een webapplicatie ontwikkelen en stelt Spring dienovereenkomstig in.

Het laatste deel van de applicatie is de belangrijkste methode. Dit is slechts een standaardmethode die de Java-conventie volgt voor een toepassingsingangspunt. Onze belangrijkste methode delegeert naar de SpringApplication-klasse van Spring Boot door run aan te roepen. SpringApplication zal onze applicatie opstarten, waarbij Spring wordt gestart, die op zijn beurt de automatisch geconfigureerde Tomcat-webserver start. We moeten Example.class als argument doorgeven aan de run-methode om SpringApplication te vertellen wat de primaire Spring-component is. De args-array wordt ook doorgegeven om eventuele opdrachtregelargumenten weer te geven.

Creëer een deployment artefact

Om een deployment artefact te maken, maken we een MANIFEST.MF met de volgende inhoud

Manifest-Version: 1.0
Class-Path: spring-webmvc-4.2.0.RELEASE.jar spring-integration-core-4.
 2.0.M2.jar spring-boot-starter-validation-1.3.0.M3.jar jackson-core-2
 .6.1.jar log4j-over-slf4j-1.7.12.jar logback-classic-1.1.3.jar jackso
 n-databind-2.6.1.jar jcl-over-slf4j-1.7.12.jar spring-boot-starter-to
 mcat-1.3.0.M3.jar tomcat-embed-core-8.0.23.jar aopalliance-1.0.jar sp
 ring-aop-4.2.0.RELEASE.jar spring-boot-starter-1.3.0.M3.jar spring-bo
 ot-autoconfigure-1.3.0.M3.jar spring-boot-1.3.0.M3.jar jackson-annota
 tions-2.6.1.jar spring-expression-4.2.0.RELEASE.jar spring-tx-4.2.0.R
 ELEASE.jar spring-context-4.2.0.RELEASE.jar tomcat-embed-el-8.0.23.ja
 r hibernate-validator-5.2.1.Final.jar spring-integration-jmx-4.2.0.M2
 .jar tomcat-embed-logging-juli-8.0.23.jar spring-web-4.2.0.RELEASE.ja
 r jul-to-slf4j-1.7.12.jar snakeyaml-1.15.jar spring-retry-1.1.2.RELEA
 SE.jar logback-core-1.1.3.jar classmate-1.1.0.jar validation-api-1.1.
 0.Final.jar spring-core-4.2.0.RELEASE.jar jboss-logging-3.2.1.Final.j
 ar slf4j-api-1.7.12.jar spring-boot-starter-actuator-1.3.0.M3.jar spr
 ing-beans-4.2.0.RELEASE.jar spring-boot-actuator-1.3.0.M3.jar tomcat-
 embed-websocket-8.0.23.jar spring-messaging-4.2.0.RELEASE.jar spring-
 boot-starter-web-1.3.0.M3.jar spring-boot-starter-logging-1.3.0.M3.ja
 r
Main-Class: Example
 

Het resulterende .jar-bestand heeft de volgende inhoud

/META-INF
    MANIFEST.MF
Example.class

Om het .jar-bestand uit te voeren kunnen we het volgende gebruiken

./java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /opt/docker/custom-containers/springboot-example/jars/springboot.jar

waarin de opties Flight Recorder en JMX zijn toegevoegd voor monitoringdoeleinden.

Scroll to Top