Uvod u Ratpack

1. Pregled

Ratpack je skup JVM temeljene na knjižnicama izgrađenim za moderne aplikacije visokih performansi u stvarnom vremenu. Izgrađen je na vrhu ugrađenog Netty mrežni mehanizam vođen događajima i u potpunosti je u skladu s uzorkom reaktivnog dizajna.

U ovom ćemo članku naučiti kako se koristiti Ratpack i pomoću njega ćemo stvoriti malu aplikaciju.

2. Zašto Ratpack?

Glavne prednosti Ratpacka:

  • vrlo je lagan, brz i skalabilan
  • troši manje memorije od ostalih okvira poput DropWizarda; zanimljiv rezultat usporedbe referentnih vrijednosti možete pronaći ovdje
  • budući da je izgrađen na vrhu Netty, Ratpack je u potpunosti vođen događajima i ne blokira svoju prirodu
  • ima potporu za Guice upravljanje ovisnostima
  • slično kao Proljeće Čizma, Ratpack ima vlastite biblioteke za brzo postavljanje test slučajeva

3. Izrada aplikacije

Da bismo razumjeli kako Ratpack djeluje, krenimo s izradom male aplikacije s njim.

3.1. Ovisnosti Mavena

Prvo, dodajmo sljedeće ovisnosti u našu pom.xml:

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

Najnoviju verziju možete provjeriti na Maven Central.

Imajte na umu da je, iako koristimo Maven kao naš sustav gradnje, prema preporuci Ratpacka, bolje koristiti Gradle kao alat za izgradnju, jer Ratpack ima prvoklasnu podršku Gradle koja se pruža putem Ratlekovog dodatka Gradle.

Možemo koristiti sljedeću graditeljsku skriptu:

buildscript {spremišta {jcenter ()} ovisnosti {classpath "io.ratpack: ratpack-gradle: 1.4.5"}} primijeni dodatak: "io.ratpack.ratpack-java" spremišta {jcenter ()} ovisnosti {testCompile 'junit: junit: 4.11 'runtime "org.slf4j: slf4j-simple: 1.7.21"} test {testLogging {događaji' započeti ',' prošli '}} 

3.2. Izrada aplikacije

Jednom kada je naše upravljanje gradnjom konfigurirano, moramo stvoriti klasu za pokretanje ugrađenog Netty poslužitelju i izgradite jednostavan kontekst za obradu zadanih zahtjeva:

javna klasa Aplikacija {public static void main (String [] args) baca iznimku {RatpackServer.start (server -> server.handlers (chain -> chain .get (ctx -> ctx.render ("Dobrodošli u Baeldung ratpack !!!) ")))); }}

Kao što vidimo, pomoću RatpackServer sada možemo pokrenuti poslužitelj (zadani port 5050). The rukovatelji () metoda uzima funkciju koja prima objekt Chain, koji preslikava sve odgovarajuće dolazne zahtjeve. Ovaj "API lanca rukovatelja" koristi se za izgradnju strategije upravljanja odgovorima.

Ako pokrenemo ovaj isječak koda i pritisnemo preglednik na // localhost: 5050, “Dobro došli u Baeldung ratpack !!!” treba prikazati.

Slično tome, možemo mapirati HTTP POST zahtjev.

3.3. Rukovanje parametrima puta URL-a

U sljedećem primjeru moramo u našoj aplikaciji uhvatiti neki parametar URL puta. U Ratpacku koristimo PathTokens kako bismo ih uhvatili:

RatpackServer.start (server -> server .handlers (chain -> chain .get (": name", ctx -> ctx.render ("Hello" + ctx.getPathTokens (). Get ("name") + "!! ! "))));

Evo, mapiramo Ime Parametar URL-a. Kad god se zahtjev poput // localhost: 5050 / John doći će, odgovor će biti "Zdravo John !!!".

3.4. Izmjena zaglavlja zahtjeva / odgovora sa / bez filtra

Ponekad moramo izmijeniti ugrađeno zaglavlje HTTP odgovora na temelju svojih potreba. Ratpack ima MutableHeaders za prilagodbu odlaznih odgovora.

Na primjer, u odgovoru moramo izmijeniti sljedeća zaglavlja: Access-Control-Allow-Origin, Prihvati-jezik, i Prihvati-Charset:

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

Pomoću PromjenjiveGlavice postavili smo postavljanje tri zaglavlja i njihovo guranje u Lanac.

Na isti način možemo provjeriti i zaglavlja dolaznih zahtjeva:

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

Isto se može postići stvaranjem filtra. Ratpack ima Rukovatelj sučelje, koja se može implementirati za stvaranje filtra. Ima samo jednu metodu handle (), koja uzima struju Kontekst kao parametar:

javna klasa RequestValidatorFilter implementira Handler {@Override javna ručka za prazninu (Context ctx) baca iznimku {MutableHeaders headers = ctx.getResponse (). getHeaders (); headers.set ("Access-Control-Allow-Origin", "*"); ctx.next (); }}

Ovaj filtar možemo koristiti na sljedeći način:

RatpackServer.start (server -> server.handlers (chain -> chain .all (new RequestValidatorFilter ()) .get (ctx -> ctx.render ("Dobrodošli u baeldung ratpack !!!")))); }

3.5. JSON Raščlanjivač

Ratpack interno koristi brži-jackson za JSON raščlanjivanje. Možemo koristiti Jackson modul za raščlanjivanje bilo kojeg objekta na JSON.

Stvorimo jednostavnu POJO klasu koja će se koristiti za raščlanjivanje:

zaposlenik u javnoj klasi {private Long id; privatni naslov niza; privatni naziv niza; // geteri i postavljači}

Ovdje smo stvorili jednu jednostavnu POJO klasu pod nazivom Zaposlenik, koji ima tri parametra: id, naslov, i Ime. Sad ćemo ovo iskoristiti Zaposlenik objekt koji treba pretvoriti u JSON i vratiti isti kada se pogodi određeni URL:

Popis zaposlenika = novi ArrayList (); zaposlenici.add (novi zaposlenik (1L, "Gospodin", "John Doe")); zaposlenici.add (novi zaposlenik (2L, "Gospodin", "Bijeli snijeg")); RatpackServer.start (poslužitelj -> server.handlers (lanac -> lanac .get ("podaci / zaposlenici", ctx -> ctx.render (Jackson.json (zaposlenici)))));

Kao što vidimo, ručno dodajemo dva Zaposlenik objekte na popis i raščlanjujući ih kao JSON pomoću Jackson modul. Čim se / podaci / zaposlenici URL je pogođen, vratit će se JSON objekt.

Ovdje valja napomenuti da je to ne koristimo ObjectMapper uopće budući da će Ratpackov Jackson modul učiniti potrebno u hodu.

3.6. Baza podataka u memoriji

Ratpack ima prvoklasnu podršku za baze podataka u memoriji. Koristi HikariCP za spremanje JDBC veza. Da bismo ga koristili, moramo dodati Ratpackovu ovisnost HikariCP modula u pom.xml:

 io.ratpack ratpack-hikari 1.4.5 

Ako koristimo Gradle, isto treba dodati u datoteku gradnje Gradle:

sastaviti ratpack.dependency ('hikari')

Sada moramo stvoriti SQL datoteku s DDL izrazima tablice tako da se tablice kreiraju čim poslužitelj bude pokrenut i pokrenut. Stvorit ćemo DDL.sql datoteku u src / glavni / resursi i dodajte u njega neke DDL izjave.

Budući da koristimo H2 bazu podataka, moramo dodati ovisnosti i za to.

Sada, pomoću HikariModule, možemo pokrenuti bazu podataka u vrijeme izvođenja:

RatpackServer.start (server -> server.registry (Guice.registry (vezovi -> bindings.module (HikariModule.class, config -> {config.setDataSourceClassName ("org.h2.jdbcx.JdbcDataSource"); config.addDataSource URL "," jdbc: h2: mem: baeldung; INIT = RUNSCRIPT FROM 'classpath: /DDL.sql' ");}))). Handlers (...));

4. Ispitivanje

Kao što je ranije spomenuto, Ratpack ima prvoklasnu podršku za jUnit test slučajeve. Korištenjem MainClassApplicationUnderTest lako možemo stvoriti test slučajeve i testirati krajnje točke:

@RunWith (JUnit4.class) javna klasa ApplicationTest {MainClassApplicationUnderTest appUnderTest = new MainClassApplicationUnderTest (Application.class); @Test javna praznina givenDefaultUrl_getStaticText () {assertEquals ("Dobrodošli u baeldung ratpack !!!", appUnderTest.getHttpClient (). GetText ("/")); } @Test javna praznina givenDynamicUrl_getDynamicText () {assertEquals ("Zdravo dummybot !!!", appUnderTest.getHttpClient (). GetText ("/ dummybot")); } @Test public void givenUrl_getListOfEfficiee () baca JsonProcessingException {Popis zaposlenika = novi ArrayList (); Mapa ObjectMapper = novi ObjectMapper (); zaposlenici.add (novi zaposlenik (1L, "Gospodin", "John Doe")); zaposlenici.add (novi zaposlenik (2L, "Gospodin", "Bijeli snijeg")); assertEquals (mapper.writeValueAsString (zaposlenici), appUnderTest.getHttpClient (). getText ("/ podaci / zaposlenici")); } @Nakon isključenja javne praznine () {appUnderTest.close (); }}

Napominjemo da moramo ručno prekinuti pokretanje MainClassApplicationUnderTest instancu pozivanjem Zatvoriti() metoda jer nepotrebno može blokirati JVM resurse. Zato smo koristili @Nakon napomena za prisilni prekid instance nakon izvršavanja testnog slučaja.

5. Zaključak

U ovom smo članku vidjeli jednostavnost korištenja Ratpacka.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.