REST mikroszolgáltatások létrehozása Javalinnal

1. Bemutatkozás

A Javalin egy könnyű webkeret, amelyet Java és Kotlin számára írtak. A Jetty webszerver tetejére van írva, ami nagy teljesítményt nyújt. A Javalint a koa.js-től szorosan mintázzák, ami azt jelenti, hogy az alapoktól fogva meg van írva, hogy egyszerűen érthető és építhető legyen rajta.

Ebben az oktatóanyagban végigvezetjük az alapvető REST mikroszolgáltatás felépítésének lépéseit ezzel a könnyű keretrendszerrel.

2. Függőségek hozzáadása

Egy alapvető alkalmazás létrehozásához csak egy függőségre van szükségünk - maga Javalin:

 io.javalin javalin 1.6.1 

A jelenlegi verzió itt található.

3. Javalin beállítása

Javalin megkönnyíti az alapvető alkalmazások beállítását. Kezdjük azzal, hogy meghatározzuk fő osztályunkat és felállítunk egy egyszerű „Hello World” alkalmazást.

Hozzunk létre egy új fájlt az alapcsomagunkban JavalinApp.java.

A fájl belsejében létrehozunk egy fő módszert, és hozzáadjuk a következőket egy alapalkalmazás beállításához:

Javalin alkalmazás = Javalin.create () .port (7000) .start (); app.get ("/ hello", ctx -> ctx.html ("Hello, Javalin!"));

Létrehozunk egy új Javalin példányt, meghallgatjuk a 7000-es porton, majd elindítjuk az alkalmazást.

Beállítjuk az első végpont hallgatásunkat is a KAP kérés a /Helló végpont.

Futtassuk ezt az alkalmazást, és látogassuk meg a // localhost: 7000 / hello oldalt az eredmények megtekintéséhez.

4. A. Létrehozása UserController

A „Hello World” példa remekül használható egy téma bemutatásához, de valódi alkalmazás esetén nem előnyös. Vizsgáljuk meg a Javalin reálisabb használati esetét.

Először létre kell hoznunk egy modellt arról az objektumról, amelyikkel dolgozunk. Azzal kezdjük, hogy létrehozunk egy csomagot felhasználó a gyökérprojekt alatt.

Ezután hozzáadunk egy újat Felhasználó osztály:

public class Felhasználó {public final int id; nyilvános végleges karakterlánc neve; // konstruktorok}

Be kell állítanunk az adatelérési objektumunkat (DAO) is. A memóriában lévő objektum segítségével tároljuk felhasználóinkat ebben a példában.

Új osztályt hozunk létre a felhasználó becsomagolt hívott UserDao.java:

class UserDao {private List users = Arrays.asList (új felhasználó (0, "Steve Rogers"), új felhasználó (1, "Tony Stark"), új felhasználó (2, "Carol Danvers")); privát statikus UserDao userDao = null; private UserDao () {} statikus UserDao példány () {if (userDao == null) {userDao = new UserDao (); } return userDao; } Opcionális getUserById (int id) {return users.stream () .filter (u -> u.id == id) .findAny (); } Iterable getAllUsernames () {return users.stream () .map (user -> user.name) .collect (Collectors.toList ()); }}

A DAO-k szingulettként történő megvalósítása megkönnyíti a példában történő felhasználást. Kijelenthetjük azt is, mint főosztályunk statikus tagját, vagy használhatnánk függőségi injekciókat egy olyan könyvtárból, mint a Guice, ha akarjuk.

Végül szeretnénk létrehozni a kontroller osztályunkat. Javalin lehetővé teszi számunkra, hogy nagyon rugalmasak legyünk, amikor kijelentjük az útvonal-kezelőinket, így ez csak egy módszer a meghatározásukra.

Létrehozunk egy új osztályt UserController.java ban,-ben felhasználó csomag:

public class UserController {public static Handler fetchAllUsernames = ctx -> {UserDao dao = UserDao.instance (); Iterálható allUsers = dao.getAllUsernames (); ctx.json (allUsers); }; public static Handler fetchById = ctx -> {int id = Integer.parseInt (Objects.requireNonNull (ctx.param ("id"))); UserDao dao = UserDao.instance (); Felhasználói felhasználó = dao.getUserById (id); if (felhasználó == null) {ctx.html ("Nem található"); } else {ctx.json (felhasználó); }}; }

A kezelők statikusnak nyilvánításával biztosítjuk, hogy maga a vezérlő ne legyen állapotban. De bonyolultabb alkalmazásoknál érdemes lehet állapotot tárolni a kérések között, ebben az esetben el kell távolítanunk a statikus módosítót.

Vegye figyelembe azt is, hogy az egység tesztelése statikus módszerekkel nehezebb, ezért ha ezt a tesztelési szintet akarjuk, akkor nem statikus módszereket kell használnunk.

5. Útvonalak hozzáadása

Most már többféleképpen lehet adatokat lekérni a modellünkből. Az utolsó lépés ezeknek az adatoknak a REST végpontokon keresztül történő feltárása. Két új útvonalat kell regisztrálnunk a fő alkalmazásunkban.

Vegyük fel őket a fő alkalmazásosztályunkba:

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

Az alkalmazás összeállítása és futtatása után kérelmet intézhetünk az új végpontok mindegyikéhez. A // localhost: 7000 / users hívása felsorolja az összes felhasználót, és a // localhost: 7000 / users / 0 hívása megkapja az egyetlen User JSON objektumot, amelynek azonosítója 0. Felhasználó adat.

6. Útvonalak meghosszabbítása

Az adatok lekérése a legtöbb mikroszolgáltatás létfontosságú feladata.

Ugyanakkor tudnunk kell adatokat tárolni az adattárunkban is. A Javalin biztosítja a szolgáltatások felépítéséhez szükséges útvonalkezelők teljes készletét.

Láttunk egy példát KAP fent, de PATCH, POST, DELETE, és PUT lehetségesek is.

Továbbá, ha Jackson függőségként szerepel, akkor a JSON kérelem testeit automatikusan elemezhetjük modellosztályainkban. Például:

app.post ("/") {ctx -> Felhasználó felhasználó = ctx.bodyAsClass (Felhasználó.osztály); }

lehetővé tenné, hogy megragadjuk a JSON-t Felhasználó objektumot a kérelem törzséből, és fordítsa le a Felhasználó modell objektum.

7. Következtetés

Mindezeket a technikákat kombinálhatjuk mikroszolgáltatásunk elkészítéséhez.

Ebben a cikkben azt láttuk, hogyan állíthatjuk be a Javalint és hogyan készíthetünk egy egyszerű alkalmazást. Beszéltünk arról is, hogy a különféle HTTP-módszertípusok használatával hogyan tudják az ügyfelek kölcsönhatásba lépni a szolgáltatásunkkal.

A Javalin használatának fejlettebb példáihoz feltétlenül nézze meg a dokumentációt.

Továbbá, mint mindig, a kód megtalálható a GitHubon.