Uvod u Vert.x

1. Pregled

U ovom ćemo članku raspraviti Vert.x, pokriti njegove temeljne koncepte i stvoriti s njim jednostavnu RESTfull web uslugu.

Započet ćemo pokrivanjem temeljnih koncepata o alatu, polako prijeći na HTTP poslužitelj i zatim izgraditi RESTfull uslugu.

2. O Vertu.x

Vert.x je alat za razvoj softvera otvorenog koda, reaktivni i poliglot od programera Eclipsea.

Reaktivno programiranje je programska paradigma, povezana s asinkronim tokovima, koji reagiraju na bilo kakve promjene ili događaje.

Slično tome, Vert.x koristi sabirnicu događaja za komunikaciju s različitim dijelovima aplikacije i asinhrono prosljeđuje događaje voditeljima kada su dostupni.

Zovemo ga poliglot zbog podrške za više JVM i ne-JVM jezika kao što su Java, Groovy, Ruby, Python i JavaScript.

3. Postavljanje

Da bismo koristili Vert.x, moramo dodati ovisnost Mavena:

 io.vertx vertx-core 3.4.1 

Najnoviju verziju ovisnosti možete pronaći ovdje.

3. Vertikuli

Vertikli su dijelovi koda koje izvršava motor Vert.x. Komplet alata pruža nam mnogo klasa apstraktnih vertikala, koje možemo proširiti i implementirati kako želimo.

Budući da su poligloti, vertikli se mogu pisati na bilo kojem od podržanih jezika. Aplikacija se obično sastoji od više vertikala koji se izvode u istoj instanci Vert.x i međusobno komuniciraju pomoću događaja putem sabirnice događaja.

Da bi stvorila vertikul u JAVA-i, klasa mora implementirati io.vertx.core.Verticle sučelje ili bilo koja od njegovih potklasa.

4. Bus događaja

To je živčani sustav bilo koje aplikacije Vert.x.

Budući da su reaktivni, vertikuli ostaju uspavani dok ne prime poruku ili događaj. Vertikli međusobno komuniciraju sabirnicom događaja. Poruka može biti bilo što, od niza do složenog objekta.

Rukovanje porukama je idealno asinkrono, poruke se stavljaju u red čekanja na sabirnicu događaja, a kontrola se vraća pošiljatelju. Kasnije se prebacuje u vertikal slušanja. Odgovor se šalje pomoću Budućnost i uzvratiti poziv metode.

5. Jednostavna aplikacija Vert.x.

Stvorimo jednostavnu aplikaciju s vertikulom i rasporedimo je pomoću a vertx primjer. Da bismo stvorili svoju vertikalu, proširit ćemo

Da bismo stvorili svoju vertikalu, proširit ćemo io.vertx.core.AbstractVerticle klase i nadjačati početak() metoda:

javna klasa HelloVerticle proširuje AbstractVerticle {@Preuzmi javni void start (buduća budućnost) {LOGGER.info ("Dobrodošli u Vertx"); }}

The početak() metodu će pozvati vertx primjer kada je vertikal raspoređen. Metoda traje io.vertx.core.Future kao parametar koji se može koristiti za otkrivanje statusa asinkronog postavljanja vertikla.

Sada rasporedimo verticle:

javna statička void glavna (String [] args) {Vertx vertx = Vertx.vertx (); vertx.deployVerticle (novi HelloVerticle ()); }

Slično tome, možemo nadjačati Stop() metoda iz SažetakVrtlica klase, koja će se pozivati ​​tijekom isključivanja vertikla:

@Preuzmi javno void stop () {LOGGER.info ("Isključivanje aplikacije"); }

6. HTTP poslužitelj

Sada zavrtimo HTTP poslužitelj koristeći verticle:

@Override public void start (Buduća budućnost) {vertx.createHttpServer () .requestHandler (r -> r.response (). End ("Welcome to Vert.x Intro");}) .listen (config (). GetInteger ( "http.port", 9090), rezultat -> {if (result.succeeded ()) {future.complete ();} else {future.fail (result.cause ());}}); }

Nadjačali smo početak() metoda za stvaranje HTTP poslužitelja i na njega je priključio obrađivač zahtjeva. The requestHandler () metoda poziva se svaki put kad poslužitelj primi zahtjev.

Napokon, poslužitelj je vezan za port i AsyncResult rukovatelj se predaje na slušati() metoda bez obzira je li veza ili pokretanje poslužitelja uspješno korišteno future.complete () ili future.fail () u slučaju bilo kakvih pogrešaka.

Imajte na umu da: config.getInteger () metoda, čita vrijednost za konfiguraciju HTTP porta koja se učitava s vanjskog conf.json datoteka.

Isprobajmo naš poslužitelj:

@Test public void whenReceivedResponse_thenSuccess (TestContext testContext) {Async async = testContext.async (); vertx.createHttpClient () .getNow (port, "localhost", "/", response -> {response.handler (responseBody -> {testContext.assertTrue (responseBody.toString (). contains ("Hello")); async. dovršiti ();});}); }

Za test upotrijebimo vertx-unit zajedno s JUnit .:

 io.vertx vertx-jedinica 3.4.1 test 

Najnoviju verziju možemo dobiti ovdje.

Vertikal je raspoređen i u a vertx primjer u postaviti() metoda jediničnog ispitivanja:

@ Prije postavljanja javne praznine (TestContext testContext) {vertx = Vertx.vertx (); vertx.deployVerticle (SimpleServerVerticle.class.getName (), testContext.asyncAssertSuccess ()); }

Slično tome, vertx instanca zatvorena u @AfterClass tearDown () metoda:

@Nakon javne praznine tearDown (TestContext testContext) {vertx.close (testContext.asyncAssertSuccess ()); }

Primijetite da Postavljanje @BeforeClass () metoda uzima an TestContext argument. To pomaže u kontroli i testiranju asinkronog ponašanja testa. Na primjer, postavljanje vertikale je asinkronizirano, tako da u osnovi ne možemo ništa testirati ako nije pravilno raspoređeno.

Imamo drugi parametar za deployVerticle () metoda, testContext.asyncAssertSuccess (). Tnjegova se koristi da bi se znalo je li poslužitelj pravilno postavljen ili su se dogodili kvarovi. Čeka se future.complete () ili future.fail () u vertikalu poslužitelja koji treba pozvati. U slučaju kvara, ne uspije na testu.

7. RESTful WebService

Stvorili smo HTTP poslužitelj, dopuštamo sada da ga koristi za hostiranje RESTfull WebService. Da bismo to učinili trebat će nam još jedan modul Vert.x pod nazivom vertx-web. To povrh daje puno dodatnih značajki za web razvoj vertx-jezgra.

Dodajmo ovisnost našem pom.xml:

 io.vertx vertx-web 3.4.1 

Najnoviju verziju možemo pronaći ovdje.

7.1. Usmjerivač i Rute

Stvorimo a usmjerivač za našu WebService. Ovaj usmjerivač će ići jednostavnim putem GET metode i metode rukovatelja getArtilces ():

Usmjerivač usmjerivača = Router.router (vertx); router.get ("/ api / baeldung / articles / article /: id") .handler (this :: getArticles);

The getArticle () metoda je jednostavna metoda koja vraća novo Članak objekt:

private void getArticles (RoutingContext routingContext) {String articleId = routingContext.request () .getParam ("id"); Članak članka = novi članak (articleId, "Ovo je uvod u vertx", "baeldung", "01-02-2017", 1578); routingContext.response () .putHeader ("vrsta sadržaja", "application / json") .setStatusCode (200) .end (Json.encodePrettily (članak)); }

A Usmjerivač, kada primi zahtjev, traži odgovarajuću rutu i dalje prosljeđuje zahtjev. The rute s tim da je povezana metoda rukovatelja koja radi zbrajanje zahtjeva.

U našem slučaju, voditelj poziva getArticle () metoda. Prima usmjeravanjeKontekst objekt kao argument. Izvodi parametar puta iskaznica, i stvara Članak prigovarati s tim.

U posljednjem dijelu metode pozovimo odgovor() metoda na usmjeravanjeKontekst objekt i stavite zaglavlja, postavite HTTP kod odgovora i završite odgovor pomoću kodiranog JSON-a članak objekt.

7.2. Dodavanje Usmjerivač na poslužitelj

Sad dodajmo usmjerivač, stvoren u prethodnom odjeljku za HTTP poslužitelj:

vertx.createHttpServer () .requestHandler (router :: accept) .listen (config (). getInteger ("http.port", 8080), result -> {if (result.succeeded ()) {future.complete (); } else {budućnost.neuspjeh (rezultat.uzrok ());}});

Primijetite da smo dodali requestHandler (usmjerivač :: prihvaća) na poslužitelj. Ovo upućuje poslužitelj da pozove prihvatiti() od usmjerivač prigovoriti kad se zaprimi bilo koji zahtjev.

Ajmo sada testirati našu WebService:

@Test javna praznina givenId_whenReceivedArticle_thenSuccess (TestContext testContext) {Async async = testContext.async (); vertx.createHttpClient () .getNow (8080, "localhost", "/ api / baeldung / articles / article / 12345", response -> {response.handler (responseBody -> {testContext.assertTrue (responseBody.toString (). sadrži ("\" id \ ": \" 12345 \ "")); async.complete ();});}); }

8. Pakiranje aplikacije Vert.x.

Da bismo paket zapakirali kao raspoloživu Java Archive (.jar), upotrijebimo dodatak Maven Shade i konfiguracije u izvršenje označiti:

    io.vertx.core.Starter com.baeldung.SimpleServerVerticle $ {project.build.directory} / $ {project.artifactId} - $ {project.version} -app.jar 

U manifestEntries, Glavna okomica označava početnu točku prijave i Glavna klasa je klasa Vert.x koja stvara vertx instancu i postavlja Glavna okomica.

9. Zaključak

U ovom uvodnom članku raspravljali smo o alatu Vert.x i njegovim temeljnim konceptima. Vidio sam kako stvoriti i HTTP poslužitelj s Vert.x-om i također RESTFull WebService i pokazao kako ih testirati pomoću vertx-jedinica.

Napokon je zapakirao aplikaciju kao izvršnu jar.

Kompletna implementacija isječaka koda dostupna je na GitHubu.