Budovanie mikroslužieb s Eclipse MicroProfile

1. Prehľad

V tomto článku sa zameriame na budovanie mikroslužby založenej na Eclipse MicroProfile.

Pozrime sa na to, ako napísať webovú aplikáciu RESTful pomocou rozhraní JAX-RS, CDI a JSON-P.

2. Architektúra mikroslužieb

Zjednodušene povedané, mikroslužby sú štýl softvérovej architektúry, ktorý tvorí kompletný systém ako súbor niekoľkých nezávislých služieb.

Každý z nich sa zameriava na jeden funkčný obvod a s ostatnými komunikuje jazykovo-agnostickým protokolom, napríklad REST.

3. Mikroprofil Eclipse

Eclipse MicroProfile je iniciatíva, ktorej cieľom je optimalizácia Enterprise Java pre architektúru Microservices. Je založený na podmnožine Jakarta EE WebProfile API, takže môžeme vytvárať aplikácie MicroProfile, ako napríklad tie, ktoré staviame Jakarta EE.

Cieľom MicroProfile je definovať štandardné API pre vytváranie mikroslužieb a dodávať prenosné aplikácie v rámci viacerých runtime MicroProfile.

4. Maven závislosti

Všetky závislosti vyžadované na vytvorenie aplikácie Eclipse MicroProfile sú poskytované touto závislosťou BOM (Bill Of Materials):

 poskytnutý mikroprofil org.eclipse.mikroprofil 1,2 pom 

Rozsah je stanovený ako za predpokladu pretože runtime MicroProfile už obsahuje API a implementáciu.

5. Reprezentačný model

Začnime tým, že vytvoríme rýchlu triedu prostriedkov:

verejná trieda Book {private String id; súkromné ​​meno reťazca; súkromný autor reťazcov; súkromné ​​celé čísla; // ...}

Ako vidíme, nie je k tomu žiadna anotácia Kniha trieda.

6. Používanie CDI

Jednoducho povedané, CDI je API, ktoré poskytuje vkladanie závislostí a správu životného cyklu. Zjednodušuje to použitie fazule Enterprise vo webových aplikáciách.

Vytvorme teraz fazuľu riadenú CDI ako úložisko pre zastúpenie kníh:

@ApplicationScoped verejná trieda BookManager {private ConcurrentMap inMemoryStore = nový ConcurrentHashMap (); public String add (kniha kníh) {// ...} public Book get (String id) {// ...} public List getAll () {// ...}} 

Túto triedu anotujeme @ApplicationScoped pretože potrebujeme iba jednu inštanciu, ktorej stav zdieľajú všetci klienti. Na to sme použili a ConcurrentMap ako typovo bezpečné úložisko dát v pamäti. Potom sme pridali metódy pre CRUD operácie.

Teraz je naša fazuľa pripravená na CDI a dá sa do fazule vstreknúť BookEndpoint pomocou the @Inject anotácia.

7. JAX-RS API

Na vytvorenie aplikácie REST pomocou JAX-RS musíme vytvoriť Aplikácia trieda s poznámkami @ApplicationPath a zdroj s poznámkami @ Cesta.

7.1. Aplikácia JAX RS

Aplikácia JAX-RS identifikuje základný URI, pod ktorým vystavujeme zdroj vo webovej aplikácii.

Vytvorme nasledujúcu aplikáciu JAX-RS:

@ApplicationPath ("/ library") verejná trieda LibraryApplication rozširuje aplikáciu {}

V tomto príklade sú všetky triedy prostriedkov JAX-RS vo webovej aplikácii spojené s LibraryApplication robiť ich pod tým istým knižnica cesta, to je hodnota Anotácia ApplicationPath.

Táto anotovaná trieda hovorí modulu runtime JAX RS, že by mala zdroje nachádzať automaticky a sprístupňuje ich.

7.2. Koncový bod JAX RS

An Koncový bod triedy, tiež tzv Zdroj trieda, by mala definovať jeden zdroj, aj keď je technicky možné veľa rovnakých typov.

Každá trieda Java bola anotovaná @ Cestaalebo s najmenej jednou metódou anotovanou pomocou @Path alebo @HttpMethod je koncový bod.

Teraz vytvoríme koncový bod JAX-RS, ktorý odhaľuje toto znázornenie:

@Path („books“) @RequestScoped public class BookEndpoint {@Inject private BookManager bookManager; @GET @Path ("{id}") @Produces (MediaType.APPLICATION_JSON) public Response getBook (@PathParam ("id") String id) {return Response.ok (bookManager.get (id)). Build (); } @GET @Produces (MediaType.APPLICATION_JSON) public Response getAllBooks () {return Response.ok (bookManager.getAll ()). Build (); } @POST @Consumes (MediaType.APPLICATION_JSON) public Response add (kniha kníh) {String bookId = bookManager.add (kniha); návrat Response.created (UriBuilder.fromResource (this.getClass ()) .path (bookId) .build ()) .build (); }} 

V tomto okamihu môžeme získať prístup k BookEndpoint Zdroj pod / knižnica / knihy cesta vo webovej aplikácii.

7.3. Typ média JAX RS JSON

JAX RS podporuje mnoho typov médií pre komunikáciu s klientmi REST, ale Eclipse MicroProfile obmedzuje použitie JSON pretože špecifikuje použitie API JSOP-P. Preto musíme naše metódy anotovať @Consumes (MediaType.APPLICATION_JSON) a @Produkuje (MediaType.APPLICATION_JSON).

The @ Spotreby anotácia obmedzuje akceptované formáty - v tomto príklade je akceptovaný iba dátový formát JSON. Hlavička požiadavky HTTP Druh obsahu by mala byť aplikácia / json.

Rovnaká myšlienka sa skrýva za @Produkty anotácia. JAX RS Runtime by mal zaradiť odpoveď do formátu JSON. Hlavička HTTP požiadavky súhlasiť by mala byť aplikácia / json.

8. JSON-P

JAX RS Runtime podporuje JSON-P už od začiatku, aby sme ho mohli používať JsonObject ako vstupný parameter metódy alebo návratový typ.

Ale v skutočnom svete často pracujeme s triedami POJO. Potrebujeme teda spôsob, ako urobiť mapovanie medzi JsonObject a POJO. Tu hrá poskytovateľ entity JAX RS.

Na zaradenie vstupného toku JSON do servera Kniha POJO, to je vyvolanie metódy prostriedku s parametrom typu Rezervovať, musíme vytvoriť triedu BookMessageBodyReader:

@Provider @Consumes (MediaType.APPLICATION_JSON) verejná trieda BookMessageBodyReader implementuje MessageBodyReader {@Override public boolean isReadable (typ triedy, typ genericType, anotácie [] anotácie, MediaType mediaType) {návratový typ.equals (Book.class); } @Override public Book readFrom (Class type, Type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {return BookMapper.map (entityStream); }} 

Rovnaký postup robíme aj pri maršovaní a Kniha do výstupného toku JSON, to je vyvolanie metódy prostriedku, ktorého návratový typ je Rezervovať, vytvorením a BookMessageBodyWriter:

@Provider @Produces (MediaType.APPLICATION_JSON) verejná trieda BookMessageBodyWriter implementuje MessageBodyWriter {@Override public boolean isWriteable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } // ... @Override public void writeTo (Kniha, typ triedy, typ genericType, anotácie [] anotácie, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) hodí IOException, WebApplicationException {JsonWriter jsonWriter = Json.createWriter = Json.createWriter JsonObject jsonObject = BookMapper.map (kniha); jsonWriter.writeObject (jsonObject); jsonWriter.close (); }} 

Ako BookMessageBodyReader a BookMessageBodyWriter sú anotované s @ Poskytovateľ, sú automaticky zaregistrované počas behu JAX RS.

9. Vytvorenie a spustenie aplikácie

Aplikácia MicroProfile je prenosná a mala by bežať v akomkoľvek kompatibilnom runtime MicroProfile. Vysvetlíme, ako zostaviť a spustiť našu aplikáciu v Open Liberty, ale môžeme použiť akýkoľvek vyhovujúci Eclipse MicroProfile.

Konfigurujeme runtime Open Liberty cez konfiguračný súbor server.xml:

  jaxrs-2.0 cdi-1.2 jsonp-1.0 

Pridajme doplnok liberty-maven-plugin do nášho pom.xml:

  net.wasdev.wlp.maven.plugins liberty-maven-plugin 2.1.2 io.openliberty openliberty-runtime 17.0.0.4 zip $ {basedir} /src/main/liberty/config/server.xml $ {package.file} $ {packaging.type} false project / $ {project.artifactId} - $ {project.version} .war 9080 9443 install-server prepare-package install-server create-server install-feature package-server-with-apps package install- server aplikácií 

Tento doplnok je konfigurovateľný vďaka množine vlastností:

  knižnica $ {project.build.directory} / $ {app.name} -service.jar je spustiteľná 

Cieľ exec vyššie vytvorí spustiteľný súbor jar, takže naša aplikácia bude nezávislou mikroslužbou, ktorú je možné nasadiť a spustiť izolovane. Môžeme ho nasadiť aj ako Docker image.

Ak chcete vytvoriť spustiteľný súbor jar, spustite nasledujúci príkaz:

balíček mvn 

A na spustenie našej mikroslužby používame tento príkaz:

java -jar target / library-service.jar

Týmto sa spustí runtime Open Liberty a nasadí sa naša služba. K nášmu koncovému bodu a získaniu všetkých kníh môžeme získať prístup na tejto adrese URL:

zvlnenie // localhost: 9080 / knižnica / knihy

Výsledkom je JSON:

[{"id": "0001-201802", "isbn": "1", "name": "Budovanie mikroslužby s Eclipse MicroProfile", "autor": "baeldung", "stránky": 420}] 

Ak chcete získať jednu knihu, požadujeme túto adresu URL:

zvlnenie // localhost: 9080 / library / books / 0001-201802

A výsledkom je JSON:

{"id": "0001-201802", "isbn": "1", "name": "Budovanie mikroslužby s Eclipse MicroProfile", "autor": "baeldung", "stránky": 420}

Teraz pridáme novú knihu interakciou s API:

curl -H "Content-Type: application / json" -X POST -d '{"isbn": "22", "name": "Gradle v akcii", "autor": "baeldung", "stránky": 420 } '// localhost: 9080 / library / books 

Ako vidíme, stav odpovede je 201, čo naznačuje, že kniha bola úspešne vytvorená, a Poloha je URI, pomocou ktorého k nemu môžeme získať prístup:

<HTTP / 1.1 201 Vytvorené <Umiestnenie: // localhost: 9080 / library / books / 0009-201802

10. Záver

Tento článok demonštroval, ako vytvoriť jednoduchú mikroslužbu založenú na Eclipse MicroProfile, ktorá pojednáva o JAX RS, JSON-P a CDI.

Kód je k dispozícii na Github; toto je projekt založený na Maven, takže by mal byť jednoduchý na import a spustenie tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found