Stvaranje REST mikrousluga s Javalinom

1. Uvod

Javalin je lagani mrežni okvir napisan za Javu i Kotlin. Napisan je na vrhu web poslužitelja Jetty, što ga čini vrlo performansnim. Javalin je usko modeliran od koa.js, što znači da je napisan od temelja kako bi ga bilo jednostavno razumjeti i na njemu nadograditi.

U ovom uputstvu proći ćemo kroz korake izgradnje osnovne REST mikro usluge koristeći ovaj light framework.

2. Dodavanje ovisnosti

Da bismo stvorili osnovnu aplikaciju, potrebna nam je samo jedna ovisnost - sam Javalin:

 io.javalin javalin 1.6.1 

Trenutnu verziju možete pronaći ovdje.

3. Postavljanje Javalina

Javalin olakšava postavljanje osnovne aplikacije. Krenut ćemo s definiranjem naše glavne klase i postavljanjem jednostavne aplikacije "Hello World".

Stvorimo novu datoteku u našem osnovnom paketu pod nazivom JavalinApp.java.

Unutar ove datoteke izrađujemo glavnu metodu i dodajemo sljedeće za postavljanje osnovne aplikacije:

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

Stvaramo novu instancu Javalina, tjeramo je da preslušava na portu 7000, a zatim pokrećemo aplikaciju.

Također postavljamo svoju prvu krajnju točku za preslušavanje a DOBITI zahtjev na /zdravo krajnja točka.

Pokrenimo ovu aplikaciju i posjetimo // localhost: 7000 / hello da vidimo rezultate.

4. Stvaranje a UserController

Primjer "Hello World" izvrstan je za uvođenje teme, ali nije koristan za stvarnu aplikaciju. Pogledajmo sada realniji slučaj upotrebe Javalina.

Prvo, moramo stvoriti model objekta s kojim radimo. Počinjemo s izradom paketa tzv korisnik pod korijenskim projektom.

Zatim dodajemo novu Korisnik razred:

korisnik javne klase {javni konačni int id; javni konačni naziv niza; // konstruktori}

Također, moramo postaviti svoj objekt za pristup podacima (DAO). U ovom ćemo primjeru za pohranu naših korisnika upotrijebiti objekt u memoriji.

Stvaramo novu klasu u korisnik upakirano nazvano UserDao.java:

klasa UserDao {privatni popis korisnika = Arrays.asList (novi korisnik (0, "Steve Rogers"), novi korisnik (1, "Tony Stark"), novi korisnik (2, "Carol Danvers")); privatni statički UserDao userDao = null; private UserDao () {} statička instanca UserDao () {if (userDao == null) {userDao = new UserDao (); } vratiti userDao; } Izborni getUserById (int id) {return users.stream () .filter (u -> u.id == id) .findAny (); } Iterable getAllUsernames () {return users.stream () .map (user -> user.name) .collect (Collectors.toList ()); }}

Implementacija našeg DAO-a kao singletona olakšava upotrebu u primjeru. Mogli bismo ga deklarirati i kao statičnog člana naše glavne klase ili koristiti injekciju ovisnosti iz knjižnice poput Guicea ako bismo to htjeli.

Napokon, želimo stvoriti našu klasu kontrolera. Javalin nam omogućuje da budemo vrlo fleksibilni kada deklariramo voditelje ruta, tako da je ovo samo jedan od načina da ih definiramo.

Stvaramo novu klasu pod nazivom UserController.java u korisnik paket:

javna klasa UserController {javni statički rukovatelj fetchAllUsernames = ctx -> {UserDao dao = UserDao.instance (); Iterable allUsers = dao.getAllUsernames (); ctx.json (sviKorisnici); }; javni statički rukovatelj fetchById = ctx -> {int id = Integer.parseInt (Objects.requireNonNull (ctx.param ("id"))); UserDao dao = UserDao.instance (); Korisnik korisnik = dao.getUserById (id); if (user == null) {ctx.html ("Nije pronađeno"); } else {ctx.json (korisnik); }}; }

Deklariranjem obrađivača kao statičnih, osiguravamo da sam kontroler nema nikakvo stanje. Ali, u složenijim aplikacijama, možda ćemo htjeti pohraniti stanje između zahtjeva, u tom ćemo slučaju morati ukloniti statički modifikator.

Također imajte na umu da je jedinstveno testiranje teže sa statičkim metodama, pa ako želimo tu razinu testiranja, morat ćemo se koristiti nestatičnim metodama.

5. Dodavanje ruta

Sada imamo više načina za dohvaćanje podataka iz našeg modela. Posljednji je korak izlaganje ovih podataka putem REST krajnjih točaka. Moramo registrirati dvije nove rute u našoj glavnoj aplikaciji.

Dodajmo ih u našu glavnu klasu aplikacije:

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

Nakon sastavljanja i pokretanja aplikacije, možemo uputiti zahtjev za svaku od ovih novih krajnjih točaka. Pozivanje // localhost: 7000 / korisnici će navesti sve korisnike, a pozivanje // localhost: 7000 / users / 0 dobit će pojedinačni JSON objekt s id-om 0. Sada imamo mikro uslugu koja nam omogućuje dohvaćanje Korisnik podaci.

6. Proširenje ruta

Dohvat podataka vitalni je zadatak većine mikroservisa.

Međutim, također moramo biti u mogućnosti pohraniti podatke u našu podatkovnu trgovinu. Javalin pruža cjeloviti set rukovatelja stazama potrebnih za izgradnju usluga.

Vidjeli smo primjer DOBITI gore, ali PATCH, POST, DELETE, i STAVITI su također mogući.

Također, ako uključimo Jacksona kao ovisnost, možemo automatski raščlaniti JSON tijela zahtjeva u naše klase modela. Na primjer:

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

bi nam omogućio da zgrabimo JSON Korisnik objekt iz tijela zahtjeva i prevedite ga u Korisnik objekt modela.

7. Zaključak

Sve ove tehnike možemo kombinirati kako bismo napravili svoju mikro uslugu.

U ovom smo članku vidjeli kako postaviti Javalin i izraditi jednostavnu aplikaciju. Također smo razgovarali o tome kako koristiti različite vrste HTTP metoda kako bismo klijentima omogućili interakciju s našom uslugom.

Za naprednije primjere upotrebe Javalina svakako pogledajte dokumentaciju.

Također, kao i uvijek, kod se može naći na GitHub-u.