A Ratpack bemutatása

1. Áttekintés

A Ratpack egy sor JVM alapú könyvtárak a modern korokhoz, nagy teljesítményű, valós idejű alkalmazásokhoz. Beágyazott tetejére épül Netty eseményvezérelt hálózati motor, és teljes mértékben megfelel a reaktív tervezési mintának.

Ebben a cikkben megtanuljuk, hogyan kell használni a Ratpack alkalmazást, és egy kis alkalmazást készítünk annak felhasználásával.

2. Miért Ratpack?

A Ratpack fő előnyei:

  • nagyon könnyű, gyors és méretezhető
  • kevesebb memóriát fogyaszt, mint más keretek, például a DropWizard; egy érdekes benchmark összehasonlító eredmény található itt
  • mivel a tetejére épül Netty, A Ratpack teljesen eseményvezérelt és nem blokkoló jellegű
  • támogatja Guice függőségkezelés
  • akárcsak Tavaszi Csomagtartó, A Ratpack saját tesztkönyvtárakkal rendelkezik a tesztesetek gyors beállításához

3. Alkalmazás létrehozása

A Ratpack működésének megértéséhez kezdjük egy kis alkalmazás létrehozásával.

3.1. Maven-függőségek

Először adjuk hozzá a következő függőségeket a mi pom.xml:

 io.ratpack ratpack-core 1.4.5 io.ratpack ratpack-test 1.4.5 

A legújabb verziót a Maven Central oldalon ellenőrizheti.

Vegye figyelembe, hogy bár a Maven-t használjuk építési rendszerünkként, a Ratpack ajánlása szerint jobb használni Gradle építési eszközként, mivel a Ratpack első osztályú Gradle támogatást nyújt a Ratpack Gradle pluginján keresztül.

A következő build Gradle szkriptet használhatjuk:

buildscript {adattárak {jcenter ()} függőségek {classpath "io.ratpack: ratpack-gradle: 1.4.5"}} plugin: "io.ratpack.ratpack-java" tárolók {jcenter ()} függőségek {testCompile 'junit: junit: 4.11 'futásidejű' org.slf4j: slf4j-simple: 1.7.21 "} teszt {testLogging {események 'elindult', 'átment'}} 

3.2. Az alkalmazás kiépítése

Miután konfiguráltuk a buildkezelésünket, létre kell hoznunk egy osztályt a beágyazás elindításához Netty szervert, és hozzon létre egy egyszerű kontextust az alapértelmezett kérések kezeléséhez:

public class Alkalmazás {public static void main (String [] args) dobja a Kivételt {RatpackServer.start (server -> server.handlers (chain -> chain .get (ctx -> ctx.render) "" Üdvözli a Baeldung ratpack !!! ")))); }}

Mint láthatjuk, a használatával RatpackServer most elindíthatjuk a szervert (alapértelmezett 5050-es port). A kezelők () A method egy olyan funkciót vesz fel, amely egy Lánc objektumot fogad, amely feltérképezi az összes bejövő kérést. Ez a „Handler Chain API” a válaszkezelési stratégia felépítésére szolgál.

Ha futtatjuk ezt a kódrészletet, és a // localhost: 5050 címen találjuk meg a böngészőt, „Üdvözöljük a Baeldung ratpack-ben !!!” kell megjeleníteni.

Hasonlóképpen feltérképezhetünk egy HTTP POST kérést is.

3.3. Az URL elérési útjának paramétereinek kezelése

A következő példában meg kell ragadnunk néhány URL-elérési paramétert az alkalmazásunkban. A Ratpack-ben PathTokens-t használunk, hogy megörökítsük őket:

RatpackServer.start (szerver -> szerver .kezelők (lánc -> lánc .get (": név", ctx -> ctx.render ("Hello" + ctx.getPathTokens (). Get ("név") + "!! ! "))));

Itt feltérképezzük a név URL param. Amikor egy kérés tetszik // localhost: 5050 / John jönne, a válasz „Hello John !!!” lesz.

3.4. Kérés / válasz fejléc módosítása szűrővel / anélkül

Időnként szükség esetén módosítanunk kell a soros HTTP válasz fejlécét. A Ratpack MutableHeaders programmal rendelkezik a kimenő válaszok testreszabására.

Például meg kell változtatnunk a következő fejléceket a válaszban: Access-Control-Allow-Origin, Elfogadás-Nyelv, és Accept-Charset:

RatpackServer.start (szerver -> server.handlers (lánc -> chain.all (ctx -> {MutableHeaders fejlécek = ctx.getResponse (). GetHeaders (); headers.set ("Access-Control-Allow-Origin", " * "); headers.set (" Accept-Language "," en-us "); headers.set (" Accept-Charset "," UTF-8 "); ctx.next ();}). get (" : név ", ctx -> ctx .render (" Hello "+ ctx.getPathTokens (). get (" név ") +" !!! "))));

Használva MutableHeaders beállítottuk a három fejléc beállítását és a Lánc.

Ugyanígy ellenőrizhetjük a beérkező kérések fejléceit is:

ctx.getRequest (). getHeaders (). get ("// TODO")

Ugyanez érhető el egy szűrő létrehozásával. Ratpack rendelkezik egy Handler felület, amely megvalósítható szűrő létrehozására. Csak egy módszere van fogantyú(), amely felveszi az áramot Kontextus paraméterként:

public class RequestValidatorFilter megvalósítja a Handler {@Orride public void handle (Context ctx) dobás Kivétel {MutableHeaders fejlécek = ctx.getResponse (). getHeaders (); headers.set ("Access-Control-Allow-Origin", "*"); ctx.next (); }}

Ezt a szűrőt a következő módon használhatjuk:

RatpackServer.start (szerver -> kiszolgáló.kezelők (lánc -> lánc. Összes (új RequestValidatorFilter ()) .get (ctx -> ctx.render ("Üdvözöljük a baeldung ratpack-ben !!!")))); }

3.5. JSON elemző

A Ratpack belsőleg használja gyorsabb-jackson a JSON elemzéséhez. Használhatjuk a Jackson modult bármely objektum elemzésére a JSON-ra.

Hozzunk létre egy egyszerű POJO osztályt, amelyet elemzésre használunk:

public class Alkalmazott {private Long id; privát húr cím; privát karakterlánc neve; // szerelők és beállítók}

Itt létrehoztunk egy egyszerű POJO osztályt, amelynek neve Munkavállaló, amelynek három paramétere van: id, cím, és név. Most ezt fogjuk használni Munkavállaló objektum, amelyet JSON-vá kell konvertálni, és ugyanazt visszaadja, ha egy bizonyos URL eltalált:

Alkalmazottak listája = new ArrayList (); alkalmazottai.add (új alkalmazott (1L, "Mr", "John Doe")); alkalmazottai.add (új alkalmazott (2L, "Mr", "Fehér hó")); RatpackServer.start (szerver -> szerver.kezelők (lánc -> lánc .get ("adatok / alkalmazottak", ctx -> ctx.render (Jackson.json (alkalmazottak)))));

Mint láthatjuk, manuálisan kettőt adunk hozzá Munkavállaló objektumokat egy listába, és JSON-ként elemzi őket a Jackson modul. Amint a / adatok / alkalmazottak Az URL eltalált, a JSON objektum visszaküldésre kerül.

Fontos megjegyezni, hogy itt van nem használjuk ObjectMapper egyáltalán mivel Ratpack Jackson modulja menet közben elvégzi a szükséget.

3.6. Memóriában lévő adatbázis

A Ratpack rendelkezik az első osztályú támogatással a memóriában lévő adatbázisokhoz. A HikariCP-t használja a JDBC kapcsolat-poolinghoz. Használatához hozzá kell adnunk a Ratpack HikariCP modulfüggőségét a pom.xml:

 io.ratpack ratpack-hikari 1.4.5 

Ha használjuk Gradle, ugyanezt hozzá kell adni a Gradle build fájlhoz:

fordítsd össze a ratpack.dependency-t ('hikari')

Most létre kell hoznunk egy SQL fájlt a tábla DDL utasításokkal, hogy a táblák létrejöjjenek, amint a kiszolgáló beindul. Létrehozzuk a DDL.sql fájl a src / main / resources könyvtárba, és adjon hozzá néhány DDL utasítást.

Mivel H2 adatbázist használunk, ehhez is hozzá kell adnunk a függőségeket.

A HikariModule használatával inicializálhatjuk az adatbázist futás közben:

RatpackServer.start (kiszolgáló -> server.registry (Guice.registry (kötések -> bindings.module (HikariModule.class, config -> {config.setDataSourceClassName ("org.h2.jdbcx.JdbcDataSource")); config.addDataSourceProperty (" URL "," jdbc: h2: mem: baeldung; INIT = RUNSCRIPT FROM 'classpath: /DDL.sql' ");}))).. Kezelők (...));

4. Tesztelés

Mint korábban említettük, a Ratpack első osztályú támogatást nyújt a jUnit tesztesetekhez. A MainClassApplicationUnderTest használatával könnyen létrehozhatunk teszteseteket és tesztelhetjük a végpontokat:

@RunWith (JUnit4.class) public class ApplicationTest {MainClassApplicationUnderTest appUnderTest = new MainClassApplicationUnderTest (Application.class); @Test public void givenDefaultUrl_getStaticText () {assertEquals ("Üdvözöljük a baeldung ratpack !!!" -ben, appUnderTest.getHttpClient (). GetText ("/")); } @Test public void givenDynamicUrl_getDynamicText () {assertEquals ("Hello dummybot !!!", appUnderTest.getHttpClient (). GetText ("/ dummybot")); } @Test public void givenUrl_getListOfEmployee () dobja a JsonProcessingException {List alkalmazottak = new ArrayList (); ObjectMapper mapper = új ObjectMapper (); alkalmazottai.add (új alkalmazott (1L, "Mr", "John Doe")); alkalmazottai.add (új alkalmazott (2L, "Mr", "Fehér hó")); assertEquals (mapper.writeValueAsString (alkalmazottak), appUnderTest.getHttpClient (). getText ("/ adatok / alkalmazottak")); } @A nyilvános void leállítása után () {appUnderTest.close (); }}

Felhívjuk figyelmét, hogy manuálisan le kell állítanunk a futást MainClassApplicationUnderTest például a Bezárás() módszer, mivel feleslegesen blokkolhatja a JVM erőforrásait. Ezért használtuk @Utána jelölés a példány erőteljes megszüntetésére a teszteset végrehajtása után.

5. Következtetés

Ebben a cikkben láttuk a Ratpack használatának egyszerűségét.

Mint mindig, a teljes forráskód elérhető a GitHubon.