Mikroszolgáltatások kiépítése az Eclipse MicroProfile segítségével

1. Áttekintés

Ebben a cikkben az Eclipse MicroProfile alapú mikroszolgáltatás építésére összpontosítunk.

Megvizsgáljuk, hogyan lehet RESTful webalkalmazást írni JAX-RS, CDI és JSON-P API-k segítségével.

2. A Microservice architektúra

Egyszerűen fogalmazva: a mikroszolgáltatások egy szoftverarchitektúra-stílus, amely egy teljes rendszert alkot több független szolgáltatás gyűjteményeként.

Mindegyik egy funkcionális körzetre összpontosít, és nyelvi-agnosztikai protokollal, például REST-lel kommunikál a többiekkel.

3. Eclipse MicroProfile

Az Eclipse MicroProfile egy olyan kezdeményezés, amelynek célja az Enterprise Java optimalizálása a Microservices architektúrához. A Jakarta EE WebProfile API-k egy részhalmazán alapul, így MicroProfile alkalmazásokat építhetünk úgy, mint a Jakarta EE alkalmazásokat.

A MicroProfile célja, hogy meghatározzon szabványos API-kat a mikroszolgáltatások kiépítéséhez, és hordozható alkalmazásokat juttasson el több MicroProfile futási időn keresztül.

4. Maven-függőségek

Az Eclipse MicroProfile alkalmazás elkészítéséhez szükséges összes függőséget ez a BOM (Bill Of Materials) függőség biztosítja:

 org.eclipse.microprofile mikroprofil 1.2 pom biztosított 

A hatókör a következő biztosítani mert a MicroProfile futásideje már tartalmazza az API-t és a megvalósítást.

5. Ábrázolási modell

Kezdjük egy gyors erőforrásosztály létrehozásával:

public class Könyv {private String id; privát karakterlánc neve; magánhúr-szerző; privát egész oldalak; // ...}

Mint láthatjuk, erről nincs megjegyzés Könyv osztály.

6. A CDI használata

Egyszerűen fogalmazva, a CDI egy olyan API, amely függőség-injektálást és életciklus-kezelést biztosít. Leegyszerűsíti az Enterprise bab használatát a webalkalmazásokban.

Most hozzunk létre egy CDI által kezelt babot a könyvábrázolás tárolására:

@ApplicationScoped nyilvános osztály BookManager {private ConcurrentMap inMemoryStore = new ConcurrentHashMap (); public String add (Book book) {// ...} public Book get (String id) {// ...} public List getAll () {// ...}} 

Ezt az osztályt azzal jegyezzük fel @ApplicationScoped mert csak egy példányra van szükségünk, amelynek állapotát minden ügyfél megosztja. Ehhez a ConcurrentMap mint egy típusbiztos memóriatároló. Ezután hozzáadtuk a CRUD tevékenységek.

A babunk CDI-készen áll, és be lehet injektálni a babba BookEndpoint használatával a @ Injekció annotáció.

7. JAX-RS API

A JAX-RS alkalmazással létrehozott REST alkalmazás létrehozásához létre kell hoznunk egy Alkalmazás osztály jegyzetekkel @ApplicationPath és egy erőforrással annotált @Pálya.

7.1. JAX RS alkalmazás

A JAX-RS alkalmazás azonosítja az alap URI-t, amely alatt az erőforrást kitesszük egy webalkalmazásba.

Hozzuk létre a következő JAX-RS alkalmazást:

@ApplicationPath ("/ library") nyilvános osztály A LibraryApplication kiterjeszti az alkalmazást {}

Ebben a példában a webalkalmazás összes JAX-RS erőforrásosztálya társítva van a LibraryApplication így ugyanazok könyvtár útvonal, ez az értéke ApplicationPath kommentár.

Ez a megjegyzéssel ellátott osztály azt mondja a JAX RS futásidejének, hogy automatikusan meg kell találnia az erőforrásokat, és ki kell tennie őket.

7.2. JAX RS végpont

An Végpont osztály, más néven Forrás osztálynak meg kell határoznia egy erőforrást, bár technikailag sok azonos típus lehetséges.

Minden Java osztály a következővel volt jelölve @Pályavagy legalább egy módszerrel van jelölve @Path vagy @HttpMethod egy Végpont.

Most létrehozunk egy JAX-RS végpontot, amely kiteszi ezt az ábrázolást:

@Path ("books") @RequestScoped public class BookEndpoint {@Inject private BookManager bookManager; @GET @Path ("{id}") @Produces (MediaType.APPLICATION_JSON) nyilvános válasz getBook (@PathParam ("id") String id) {return Response.ok (bookManager.get (id)). Build (); } @GET @Produces (MediaType.APPLICATION_JSON) nyilvános válasz getAllBooks () {return Response.ok (bookManager.getAll ()). Build (); } @POST @Consumes (MediaType.APPLICATION_JSON) public Response add (Könyvkönyv) {String bookId = bookManager.add (könyv); return Response.created (UriBuilder.fromResource (this.getClass ()) .path (bookId) .build ()) .build (); }} 

Ezen a ponton elérhetjük a BookEndpoint Erőforrás a / könyvtár / könyvek elérési útja a webalkalmazásban.

7.3. JAX RS JSON hordozótípus

A JAX RS számos médiatípust támogat a REST kliensekkel való kommunikációhoz, de Az Eclipse MicroProfile korlátozza a JSON használatát mivel meghatározza a JSOP-P API használatát. Mint ilyen, meg kell jegyeznünk a módszereinket @Fogyaszt (MediaType.APPLICATION_JSON) és @Termel (MediaType.APPLICATION_JSON).

A @Fogyaszt az annotáció korlátozza az elfogadott formátumokat - ebben a példában csak a JSON adatformátumot fogadják el. A HTTP kérés fejléce Tartalom típus kellene alkalmazás / json.

Ugyanez az ötlet rejlik a @Termékek annotáció. A JAX RS futásidejének meg kell határoznia a választ a JSON formátumra. A kérés HTTP fejléce Elfogad kellene alkalmazás / json.

8. JSON-P

A JAX RS Runtime már a dobozból támogatja a JSON-P-t, hogy használhassuk JsonObject mint módszer bemeneti paraméter vagy visszatérési típus.

De a való világban gyakran POJO osztályokkal dolgozunk. Tehát szükségünk van egy módra a közötti feltérképezésre JsonObject és POJO. Itt megy a JAX RS entitásszolgáltató játszani.

A JSON bemeneti adatfolyamának a Könyv POJO, ez egy erőforrás-metódust hív meg egy típusú paraméterrel Könyv, osztályt kell létrehoznunk BookMessageBodyReader:

@Provider @Consumes (MediaType.APPLICATION_JSON) public class BookMessageBodyReader implementates MessageBodyReader {@Override public boolean isReadable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } @Orride public Book readFrom (Class type, Type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) dobja az IOException, WebApplicationException {return BookMapper.map (entityStream); }} 

Ugyanezt a folyamatot tesszük szertelen a Könyv a JSON kimeneti adatfolyamhoz, ez egy erőforrás-módszert hív meg, amelynek visszatérési típusa Könyv, létrehozásával a BookMessageBodyWriter:

@Provider @Produces (MediaType.APPLICATION_JSON) public class BookMessageBodyWriter implementálja a MessageBodyWriter {@Override public boolean isWriteable (Class type, Type genericType, Annotation [] annotations, MediaType mediaType) {return type.equals (Book.class); } // ... @Orride public void writeTo (Book book, Class type, Type genericType, Annotation [] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) dobja az IOException, WebApplicationException {JsonWriter jsonCreaStream = Json. JsonObject jsonObject = BookMapper.map (könyv); jsonWriter.writeObject (jsonObject); jsonWriter.close (); }} 

Mint BookMessageBodyReader és BookMessageBodyWriter jelöléssel vannak ellátva @ Szolgáltató, automatikusan regisztrálja őket a JAX RS futásideje.

9. Az alkalmazás elkészítése és futtatása

A MicroProfile alkalmazás hordozható, és minden kompatibilis MicroProfile futásidejű futnia kell. Elmagyarázzuk, hogyan készíthetjük és futtathatjuk alkalmazásunkat az Open Liberty alkalmazásban, de bármilyen megfelelő Eclipse MicroProfile-t használhatunk.

Az Open Liberty futásidejét egy konfigurációs fájl segítségével konfiguráljuk server.xml:

  jaxrs-2.0 cdi-1.2 jsonp-1.0 

Adjuk hozzá a bővítményt liberty-maven-plugin a pom.xml fájlunkra:

  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} hamis projekt / $ {project.artifactId} - $ {project.version} .war 9080 9443 telepítő-kiszolgáló előkészítése-csomag telepítése-kiszolgáló létrehozása-kiszolgáló telepítése-szolgáltatása-kiszolgáló-alkalmazás-csomagokkal alkalmazások csomag-kiszolgáló 

Ez a beépülő modul konfigurálható, és a következő tulajdonságokkal rendelkezik:

  könyvtár $ {project.build.directory} / $ {app.name} -service.jar futtatható 

A fenti exec cél futtatható jar fájlt állít elő, így alkalmazásunk független mikroszolgáltatás lesz, amely külön telepíthető és futtatható. Telepíthetjük Docker képként is.

Futtatható jar létrehozásához futtassa a következő parancsot:

mvn csomag 

És a mikroszolgáltatásunk futtatásához ezt a parancsot használjuk:

java -jar target / library-service.jar

Ez elindítja az Open Liberty futási időt és telepíti a szolgáltatásunkat. Hozzáférhetünk végpontunkhoz, és minden könyvet megkapunk ezen az URL-en:

curl // localhost: 9080 / könyvtár / könyvek

Az eredmény egy JSON:

[{"id": "0001-201802", "isbn": "1", "name": "Mikroszolgáltatás kiépítése az Eclipse MicroProfile segítségével", "author": "baeldung", "pages": 420}] 

Egyetlen könyv beszerzéséhez kérjük ezt az URL-t:

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

Az eredmény pedig a JSON:

{"id": "0001-201802", "isbn": "1", "name": "Mikroszolgáltatás kiépítése az Eclipse MicroProfile segítségével", "author": "baeldung", "pages": 420}

Most hozzáadunk egy új könyvet az API használatával:

curl -H "Content-Type: application / json" -X POST -d '{"isbn": "22", "name": "Gradle in Action", "author": "baeldung", "pages": 420 } '// localhost: 9080 / könyvtár / könyvek 

Mint láthatjuk, a válasz állapota 201, jelezve, hogy a könyv sikeresen elkészült, és a Elhelyezkedés az az URI, amellyel elérhetjük:

<HTTP / 1.1 201 Létrehozva <Hely: // localhost: 9080 / library / books / 0009-201802

10. Következtetés

Ez a cikk bemutatta, hogyan lehet egy egyszerű mikroszolgáltatást felépíteni az Eclipse MicroProfile alapján, a JAX RS, a JSON-P és a CDI tárgyalásával.

A kód elérhető a Github oldalon; ez egy Maven-alapú projekt, ezért egyszerűnek kell lennie az importálás és a jelenlegi futtatás érdekében.