Opprette REST-mikrotjenester med Javalin

1. Introduksjon

Javalin er et lett nettrammeverk skrevet for Java og Kotlin. Den er skrevet på Jetty-webserveren, noe som gjør den svært effektiv. Javalin er modellert tett utenfor koa.js, noe som betyr at den er skrevet fra grunnen av for å være enkel å forstå og bygge videre på.

I denne opplæringen går vi gjennom trinn for å bygge en grunnleggende REST-mikrotjeneste ved hjelp av dette lette rammeverket.

2. Legge til avhengigheter

For å lage en grunnleggende applikasjon trenger vi bare en avhengighet - Javalin selv:

 io.javalin javalin 1.6.1 

Den nåværende versjonen finner du her.

3. Sette opp Javalin

Javalin gjør det enkelt å sette opp en grunnleggende applikasjon. Vi begynner med å definere hovedklassen vår og sette opp en enkel “Hello World” -applikasjon.

La oss lage en ny fil i basepakken vår kalt JavalinApp.java.

Inne i denne filen lager vi en hovedmetode og legger til følgende for å sette opp en grunnleggende applikasjon:

Javalin app = Javalin.create () .port (7000) .start (); app.get ("/ hallo", ctx -> ctx.html ("Hei, Javalin!"));

Vi oppretter en ny forekomst av Javalin, får den til å lytte på port 7000 og starter applikasjonen.

Vi setter også opp vårt første sluttpunkt for å lytte etter en forespørsel på /Hallo endepunkt.

La oss kjøre dette programmet og gå til // localhost: 7000 / hallo for å se resultatene.

4. Opprette en UserController

Et "Hello World" -eksempel er bra for å introdusere et emne, men det er ikke gunstig for en reell applikasjon. La oss se på et mer realistisk brukstilfelle for Javalin nå.

Først må vi lage en modell av objektet vi jobber med. Vi starter med å lage en pakke som heter bruker under rotprosjektet.

Deretter legger vi til en ny Bruker klasse:

public class User {public final int id; offentlig slutt Strengnavn; // konstruktører}

Vi må også sette opp vårt datatilgangsobjekt (DAO). Vi bruker et objekt i minnet til å lagre brukerne våre i dette eksemplet.

Vi oppretter en ny klasse i bruker pakket kalt UserDao.java:

klasse UserDao {private List brukere = Arrays.asList (ny bruker (0, "Steve Rogers"), ny bruker (1, "Tony Stark"), ny bruker (2, "Carol Danvers")); privat statisk UserDao userDao = null; privat UserDao () {} statisk UserDao-forekomst () {hvis (userDao == null) {userDao = ny UserDao (); } returner userDao; } Valgfritt getUserById (int id) {return users.stream () .filter (u -> u.id == id). FindAny (); } Iterable getAllUsernames () {return users.stream () .map (user -> user.name) .collect (Collectors.toList ()); }}

Implementering av DAO som singleton gjør det enklere å bruke i eksemplet. Vi kan også erklære det som et statisk medlem av hovedklassen vår eller bruke avhengighetsinjeksjon fra et bibliotek som Guice hvis vi ville.

Endelig ønsker vi å lage kontrollerklassen vår. Javalin tillater oss å være veldig fleksible når vi erklærer våre rutebehandlere, så dette er bare en måte å definere dem på.

Vi oppretter en ny klasse som heter UserController.java i bruker pakke:

public class UserController {public static Handler fetchAllUsernames = ctx -> {UserDao dao = UserDao.instance (); Iterable allUsers = dao.getAllUsernames (); ctx.json (allUsers); }; offentlig statisk håndterer fetchById = ctx -> {int id = Integer.parseInt (Objects.requireNonNull (ctx.param ("id"))); UserDao dao = UserDao.instance (); Brukerbruker = dao.getUserById (id); hvis (bruker == null) {ctx.html ("Ikke funnet"); } annet {ctx.json (bruker); }}; }

Ved å erklære håndtererne som statiske, sørger vi for at kontrolleren selv ikke har noen tilstand. Men i mer komplekse applikasjoner kan det være lurt å lagre tilstanden mellom forespørslene, i så fall må vi fjerne den statiske modifisereren.

Vær også oppmerksom på at enhetstesting er vanskeligere med statiske metoder, så hvis vi vil ha det testnivået, må vi bruke ikke-statiske metoder.

5. Legge til ruter

Vi har nå flere måter å hente data fra modellen vår på. Det siste trinnet er å eksponere disse dataene via REST-endepunkter. Vi må registrere to nye ruter i hovedapplikasjonen.

La oss legge dem til i vår viktigste applikasjonsklasse:

app.get ("/ brukere", UserController.fetchAllUsernames); app.get ("/ brukere /: id", UserController.fetchById);

Etter å ha samlet og kjørt applikasjonen, kan vi be om et av disse nye sluttpunktene. Ringer // localhost: 7000 / brukere vil liste opp alle brukere og ringer // localhost: 7000 / brukere / 0 vil få enkeltbruker-JSON-objektet med ID 0. Vi har nå en mikroservice som lar oss hente Bruker data.

6. Utvide ruter

Å hente data er en viktig oppgave for de fleste mikrotjenester.

Vi må imidlertid også kunne lagre data i datalageret vårt. Javalin tilbyr hele settet med stihåndterere som kreves for å bygge tjenester.

Vi så et eksempel på ovenfor, men PATCH, POST, SLETT, og SETTE er mulig også.

Hvis vi inkluderer Jackson som en avhengighet, kan vi også analysere JSON-forespørsler automatisk i modellklassene våre. For eksempel:

app.post ("/") {ctx -> Brukerbruker = ctx.bodyAsClass (User.class); }

ville tillate oss å ta tak i JSON Bruker objekt fra anmodningsorganet og oversette det til Bruker modellobjekt.

7. Konklusjon

Vi kan kombinere alle disse teknikkene for å lage vår mikroservice.

I denne artikkelen så vi hvordan du setter opp Javalin og bygger en enkel applikasjon. Vi snakket også om hvordan du bruker de forskjellige HTTP-metodetyper for å la klienter samhandle med tjenesten vår.

For mer avanserte eksempler på hvordan du bruker Javalin, må du sjekke ut dokumentasjonen.

Som alltid kan koden bli funnet på GitHub.


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