Spring Boot-applikation som en service

1. Oversigt

Denne artikel udforsker nogle muligheder for at køre Spring Boot-applikationer som en tjeneste.

For det første skal vi forklare webapplikationers emballeringsmuligheder og systemtjenester. I de efterfølgende afsnit undersøger vi forskellige alternativer, vi har, når vi opretter en service til både Linux som Windows-baserede systemer.

Endelig vil vi afslutte med nogle henvisninger til yderligere informationskilder.

2. Projektopsætning og byggeinstruktioner

2.1. Emballage

Webapplikationer er traditionelt pakket som et webapplikationsarkiv (WAR) og distribueret til en webserver.

Spring Boot-applikationer kan pakkes både som WAR- og JAR-filer. Sidstnævnte integrerer en webserver i en JAR-fil, som giver dig mulighed for at køre applikationer uden behov for installation og konfiguration af en applikationsserver.

2.2. Maven-konfiguration

Lad os starte med at definere konfigurationen af ​​vores pom.xml fil:

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

Emballagen skal indstilles til krukke. Vi bruger den seneste stabile version af Spring Boot i skrivende stund, men enhver version efter 1.3 vil være nok. Du kan finde flere oplysninger om tilgængelige versioner her.

Bemærk, at vi har indstillet parameter til rigtigt til spring-boot-maven-plugin artefakt. Dette sørger for, at en MANIFEST.MF fil tilføjes til JAR-pakken. Dette manifest indeholder en Hovedklasse post, der angiver, hvilken klasse der definerer hovedmetoden til din applikation.

2.3. Opbygning af din applikation

Kør følgende kommando inde i dit programs rodmappe:

$ mvn ren pakke

Den eksekverbare JAR-fil er nu tilgængelig i mål katalog, og vi starter muligvis applikationen ved at udføre følgende kommando på kommandolinjen:

$ java -jar din-app.jar

På dette tidspunkt skal du stadig påberåbe Java-tolk med -krukke mulighed. Der er mange grunde til, at det ville være at foretrække at få din app startet ved at kunne påberåbe den som en tjeneste.

3. På Linux

For at køre et program som baggrundsproces kunne vi simpelthen bruge nohup Unix-kommando, men dette er heller ikke den foretrukne måde af forskellige årsager. En god forklaring findes i denne tråd.

I stedet for skal vi dæmonisere vores proces. Under Linux kan vi vælge at konfigurere en dæmon enten med en traditionel System V init script eller med en Systemd konfigurationsfil. Førstnævnte er traditionelt den mest kendte mulighed, men erstattes gradvist af sidstnævnte.

Du kan finde flere detaljer om denne forskel her.

For forbedret sikkerhed opretter vi først en bestemt bruger til at køre tjenesten med og ændrer de eksekverbare JAR-filtilladelser i overensstemmelse hermed:

$ sudo-bruger tilføj 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, der kan køre med Spring Boot, gør processen med opsætning af service meget let:

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

Ovenstående kommando opretter et symbolsk link til din eksekverbare JAR-fil. Du skal bruge den fulde sti til din eksekverbare JAR-fil, ellers fungerer det symbolske link ikke korrekt. Dette link giver dig mulighed for at starte applikationen som en tjeneste:

$ sudo service din-app start

Scriptet understøtter standardtjenesten Start, hold op, genstart og status kommandoer. I øvrigt:

  • det starter de tjenester, der kører under brugeren baeldung vi lige har oprettet
  • det sporer applikationens proces-id i /var/run/your-app/your-app.pid
  • det skriver konsollogfiler til /var/log/your-app.log, som du måske vil kontrollere, hvis din applikation ikke starter korrekt

3.2. Systemd

Det systemd serviceopsætning er også meget enkel. For det første opretter vi et script med navnet din-app.service ved hjælp af følgende eksempel og læg det i / etc / systemd / system vejviser:

[Enhed] Beskrivelse = En Spring Boot-applikation Efter = syslog.target [Service] Bruger = baeldung ExecStart = / sti / til / din-app.jar SuccessExitStatus = 143 [Install] WantedBy = multi-user.target

Husk at ændre Beskrivelse, Bruger og ExecStart felter, der passer til din ansøgning. Du skal også være i stand til at udføre de ovennævnte standard servicekommandoer på dette tidspunkt.

I modsætning til System V init fremgangsmåde beskrevet i det foregående afsnit, skal proces-ID-filen og konsol-logfilen konfigureres eksplicit ved hjælp af passende felter i servicescriptet. En udtømmende liste over muligheder kan findes her.

3.3. Opstart

Upstart er en begivenhedsbaseret servicemanager, en mulig erstatning for System V init der giver mere kontrol over de forskellige dæmoners opførsel.

Webstedet har gode installationsinstruktioner, der skal fungere i næsten enhver Linux-distribution. Når du bruger Ubuntu, har du sandsynligvis det allerede installeret og konfigureret (kontroller om der er job med et navn, der starter med "upstart" i / etc / init).

Vi skaber et job din-app.conf at starte vores Spring Boot-applikation:

# Placer i /home/{user}/.config/upstart beskrivelse "Nogle Spring Boot-applikationer" respawn # forsøg service genstart, hvis stop brat udfører java -jar /path/to/your-app.jar 

Kør nu "start din app", og din service starter.

Upstart tilbyder mange jobkonfigurationsmuligheder, du kan finde de fleste af dem her.

4. På Windows

I dette afsnit præsenterer vi et par muligheder, der kan bruges til at køre en Java JAR som en Windows-tjeneste.

4.1. Windows Serviceindpakning

På grund af vanskeligheder med GPL-licensen til Java Service Wrapper (se næste underafsnit) i kombination med f.eks. MIT-licensen fra Jenkins, Windows Service Wrapper-projektet, også kendt som vinder, blev undfanget.

Winsw giver programmatiske midler til at installere / afinstallere / starte / stoppe en tjeneste. Derudover kan den bruges til at køre enhver form for eksekverbar som en tjeneste under Windows, mens Java Service Wrapper, som antydet af dens navn, kun understøtter Java-applikationer.

Først downloader du binærfilerne her. Dernæst konfigurationsfilen, der definerer vores Windows-tjeneste, MyApp.xml, skal se sådan ud:

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

Endelig skal du omdøbe winsw.exe til MyApp.exe så navnet stemmer overens med MyApp.xml konfigurationsfil. Derefter kan du installere tjenesten sådan:

$ MyApp.exe installation

På samme måde kan du bruge afinstallere, Start, hold op, etc.

4.2. Java Service Wrapper

Hvis du ikke har noget imod GPL-licensering af Java Service Wrapper-projektet, kan dette alternativ imødekomme dine behov for at konfigurere din JAR-fil som en Windows-tjeneste lige så godt. Dybest set kræver Java Service Wrapper, at du angiver i en konfigurationsfil, der specificerer, hvordan du kører din proces som en tjeneste under Windows.

Denne artikel forklarer på en meget detaljeret måde, hvordan man opretter en sådan udførelse af en JAR-fil som en tjeneste under Windows, så vi behøver ikke gentage info.

5. Yderligere referencer

Spring Boot-applikationer kan også startes som Windows-service ved hjælp af Procrun fra Apache Commons Daemon-projektet. Procrun er et sæt applikationer, der giver Windows-brugere mulighed for at pakke Java-applikationer som Windows-tjenester. En sådan tjeneste kan indstilles til at starte automatisk, når maskinen starter og vil fortsætte med at køre uden at nogen bruger er logget på.

Flere detaljer om start af Spring Boot-applikationer under Unix kan findes her. Der er også detaljerede instruktioner om, hvordan du ændrer Systemd-enhedsfiler til Redhat-baserede systemer. Langt om længe

Endelig beskriver denne hurtige howto, hvordan man indarbejder et Bash-script i din JAR-fil, så det selv bliver en eksekverbar!

6. Konklusion

Tjenester giver dig mulighed for at administrere din applikationstilstand meget effektivt, og som vi har set, er serviceopsætning til Spring Boot-applikationer nu nemmere end nogensinde.

Husk bare at følge de vigtige og enkle sikkerhedsforanstaltninger for brugertilladelser til at køre din service.


$config[zx-auto] not found$config[zx-overlay] not found