Spring Boot Application as a Service

1. Oversikt

Denne artikkelen utforsker noen alternativer for å kjøre Spring Boot-applikasjoner som en tjeneste.

For det første skal vi forklare webapplikasjoners emballasjealternativer og systemtjenester. I de påfølgende delene undersøker vi forskjellige alternativer vi har når vi setter opp en tjeneste for både Linux og Windows-baserte systemer.

Til slutt vil vi avslutte med noen referanser til ytterligere informasjonskilder.

2. Prosjektoppsett og byggeinstruksjoner

2.1. Emballasje

Nettapplikasjoner er tradisjonelt pakket som et webapplikasjonsarkiv (WAR) og distribuert til en webserver.

Spring Boot-applikasjoner kan pakkes både som WAR- og JAR-filer. Sistnevnte innebærer en webserver i en JAR-fil, som lar deg kjøre applikasjoner uten behov for installasjon og konfigurasjon av en applikasjonsserver.

2.2. Maven-konfigurasjon

La oss starte med å definere konfigurasjonen til vår pom.xml fil:

jar org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE .... org.springframework.boot spring-boot-maven-plugin true 

Emballasjen må være satt til krukke. Vi bruker den siste stabile versjonen av Spring Boot i skrivende stund, men alle versjoner etter 1.3 vil være nok. Du finner mer informasjon om tilgjengelige versjoner her.

Legg merke til at vi har satt inn parameter til ekte for spring-boot-maven-plugin gjenstand. Dette sørger for at en MANIFEST.MF filen blir lagt til JAR-pakken. Dette manifestet inneholder en Hovedklasse oppføring som spesifiserer hvilken klasse som definerer hovedmetoden for applikasjonen din.

2.3. Bygg søknaden din

Kjør følgende kommando i programmets rotkatalog:

$ mvn ren pakke

Den kjørbare JAR-filen er nå tilgjengelig i mål katalog, og vi kan starte applikasjonen ved å utføre følgende kommando på kommandolinjen:

$ java -jar din-app.jar

På dette punktet må du fremdeles påberope Java-tolk med -krukke alternativ. Det er mange grunner til at det er å foretrekke å starte appen din ved å kunne påkalle den som en tjeneste.

3. På Linux

For å kjøre et program som bakgrunnsprosess, kunne vi ganske enkelt bruke nohup Unix-kommando, men dette er heller ikke den foretrukne måten av forskjellige grunner. En god forklaring er gitt i denne tråden.

I stedet skal vi demonisere prosessen vår. Under Linux kan vi velge å konfigurere en demon enten med en tradisjonell System V init manus eller med en Systemd konfigurasjonsfil. Førstnevnte er tradisjonelt det mest kjente alternativet, men blir gradvis erstattet av sistnevnte.

Du kan finne mer detaljer om denne forskjellen her.

For forbedret sikkerhet oppretter vi først en bestemt bruker for å kjøre tjenesten med, og endrer de kjørbare JAR-filtillatelsene tilsvarende:

$ sudo useradd baeldung $ sudo passwd baeldung $ sudo chown baeldung: baeldung your-app.jar $ sudo chmod 500 your-app.jar

3.1. System V Init

En JAR-fil som kan kjøres med Spring Boot, gjør installasjonsprosessen for tjenesten veldig enkel:

$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app

Ovennevnte kommando oppretter en symbolsk lenke til den kjørbare JAR-filen. Du må bruke hele banen til den kjørbare JAR-filen, ellers fungerer ikke den symbolske lenken som den skal. Denne lenken lar deg starte applikasjonen som en tjeneste:

$ sudo service din app start

Skriptet støtter standardtjenesten start, Stoppe, omstart og status kommandoer. Videre:

  • det starter tjenestene som kjører under brukeren baeldung vi har nettopp opprettet
  • den sporer applikasjonens prosess-ID inn /var/run/your-app/your-app.pid
  • den skriver konsollogger til /var/log/your-app.log, som du kanskje vil sjekke i tilfelle søknaden din ikke starter riktig

3.2. Systemd

De systemd serviceoppsett er også veldig enkelt. For det første lager vi et skript som heter your-app.service ved hjelp av følgende eksempel og legg det inn / etc / systemd / system katalog:

[Unit] Description = A Spring Boot application After = syslog.target [Service] User = baeldung ExecStart = / path / to / your-app.jar SuccessExitStatus = 143 [Install] WantedBy = multi-user.target

Husk å endre Beskrivelse, Bruker og ExecStart felt for å matche søknaden din. Du bør være i stand til å utføre de ovennevnte standard servicekommandoer på dette tidspunktet også.

I motsetning til System V init fremgangsmåten beskrevet i forrige avsnitt, bør prosess-ID-filen og konsollloggfilen konfigureres eksplisitt ved hjelp av passende felt i tjenesteskriptet. En uttømmende liste over alternativer finner du her.

3.3. Oppstart

Upstart er en hendelsesbasert tjenesteleder, en potensiell erstatning for System V init som gir mer kontroll over oppførselen til de forskjellige demonene.

Nettstedet har gode installasjonsinstruksjoner som skal fungere for nesten alle Linux-distribusjoner. Når du bruker Ubuntu, har du sannsynligvis den allerede installert og konfigurert (sjekk om det er jobber med et navn som begynner med "oppstart" i / etc / init).

Vi skaper en jobb your-app.conf for å starte vår støvelapplikasjon:

# Plasser i /home/{user}/.config/upstart beskrivelse "Some Spring Boot application" respawn # forsøk omstart av tjenesten hvis stopp brått utfører java -jar /path/to/your-app.jar 

Kjør nå "start appen din" og tjenesten din starter.

Upstart tilbyr mange jobbkonfigurasjonsalternativer, du finner de fleste av dem her.

4. På Windows

I denne delen presenterer vi et par alternativer som kan brukes til å kjøre en Java JAR som en Windows-tjeneste.

4.1. Windows Service Wrapper

På grunn av vanskeligheter med GPL-lisensen til Java Service Wrapper (se neste underavsnitt) i kombinasjon med f.eks. MIT-lisensen til Jenkins, Windows Service Wrapper-prosjektet, også kjent som winsw, ble unnfanget.

Winsw gir programmatiske metoder for å installere / avinstallere / starte / stoppe en tjeneste. I tillegg kan den brukes til å kjøre alle slags kjørbare filer som en tjeneste under Windows, mens Java Service Wrapper, som antydet av navnet, bare støtter Java-applikasjoner.

Først laster du ned binærfiler her. Deretter konfigurasjonsfilen som definerer Windows-tjenesten vår, MyApp.xml, skal se slik ut:

 MyApp MyApp Dette kjører Spring Boot as a Service. java -Xmx256m -jar "% BASE% \ MyApp.jar" roterer 

Til slutt må du gi nytt navn til winsw.exe til MyApp.exe slik at navnet samsvarer med MyApp.xml konfigurasjonsfil. Deretter kan du installere tjenesten slik:

$ MyApp.exe installere

På samme måte kan du bruke avinstallere, start, Stoppe, etc.

4.2. Java Service Wrapper

Hvis du ikke har noe imot GPL-lisensiering av Java Service Wrapper-prosjektet, kan dette alternativet løse dine behov for å konfigurere JAR-filen din som en Windows-tjeneste like godt. I utgangspunktet krever Java Service Wrapper at du spesifiserer i en konfigurasjonsfil som spesifiserer hvordan du skal kjøre prosessen som en tjeneste under Windows.

Denne artikkelen forklarer på en veldig detaljert måte hvordan du konfigurerer en slik kjøring av en JAR-fil som en tjeneste under Windows, så vi trenger ikke å gjenta informasjonen.

5. Ytterligere referanser

Spring Boot-applikasjoner kan også startes som Windows-tjeneste ved hjelp av Procrun av Apache Commons Daemon-prosjektet. Procrun er et sett med applikasjoner som lar Windows-brukere pakke Java-applikasjoner som Windows-tjenester. En slik tjeneste kan settes til å starte automatisk når maskinen starter og vil fortsette å kjøre uten at noen brukere er pålogget.

Mer informasjon om å starte Spring Boot-applikasjoner under Unix finner du her. Det er også detaljerte instruksjoner om hvordan du endrer Systemd-enhetsfiler for Redhat-baserte systemer. Endelig

Til slutt, denne raske howto beskriver hvordan du kan innlemme et Bash-skript i JAR-filen, slik at den blir en kjørbar selv!

6. Konklusjon

Tjenester lar deg administrere søknadstilstanden din veldig effektivt, og som vi har sett, er serviceoppsett for Spring Boot-applikasjoner nå enklere enn noensinne.

Bare husk å følge de viktige og enkle sikkerhetstiltakene for brukertillatelser for å kjøre tjenesten din.