Hogyan lehet megosztani a DTO-t a mikroszolgáltatások között

1. Áttekintés

Az elmúlt években népszerűvé váltak a mikroszolgáltatások. A mikroszolgáltatások egyik alapvető jellemzője, hogy modulárisak, elszigeteltek és könnyen méretezhetők. A mikroszolgáltatásoknak együtt kell működniük és adatokat kell cserélniük. Ennek elérése érdekében DTO-knak nevezett megosztott adatátviteli objektumokat hozunk létre.

Ebben a cikkben bemutatjuk a DTO-k mikroszolgáltatások közötti megosztási módjait.

2. A tartományi objektumok megjelenítése DTO-ként

Az alkalmazás tartományát reprezentáló modelleket mikroszolgáltatások segítségével kezeljük. A tartományi modellek különböző aggályok, és elválasztjuk őket a DAO réteg adatmodelljeitől.

Ennek fő oka az, hogy nem akarjuk kiszolgáltatni domainünk összetettségét a szolgáltatások révén az ügyfelek számára. Ehelyett kitesszük DTO-k szolgáltatásaink között, amelyek az alkalmazás klienseit a REST API-k révén szolgálják ki. Míg a DTO-k áthaladnak ezek között a szolgáltatások között, átalakítjuk őket tartományi objektumokká.

A fenti szolgáltatásorientált architektúra sematikusan mutatja a DTO komponenseit és áramlását a Domain objektumok felé.

3. DTO megosztása a mikroszolgáltatások között

Vegyük példaként a vevő termékrendelésének folyamatát. Ez a folyamat a Vásárlói megrendelés modell. Nézzük a folyamatot a szolgáltatási architektúra oldaláról.

Tegyük fel, hogy az Ügyfélszolgálat a következő módon küldi el a kérési adatokat a Megrendelés szolgáltatásnak:

"rendelés": {"customerId": 1, "itemId": "A152"}

Az Ügyfél és a Megrendelés szolgáltatásai egymással kommunikálnak szerződések.A szerződés, amely egyébként szolgáltatási igény, JSON formátumban jelenik meg. Java modellként a RendelésDTO osztály képviseli az Ügyfélszolgálat és a Megrendelés szolgáltatás közötti szerződést:

public class OrderDTO {private int customerId; privát String itemId; // kivitelező, getters, setters}

3.1. A DTO megosztása kliens modulok (könyvtárak) használatával

A mikroszolgáltatáshoz bizonyos információk szükségesek a többi szolgáltatástól a kérelmek feldolgozásához. Tegyük fel, hogy van egy harmadik mikroszolgáltatás, amely megrendelés-fizetési kérelmeket fogad. A Order szolgáltatással ellentétben ez a szolgáltatás eltérő ügyféladatokat igényel:

public class ÜgyfélDTO {private String keresztnév; privát karakterlánc vezetéknév; privát String cardNumber; // kivitelező, getters, setters}

Ha hozzáadunk egy kézbesítési szolgáltatást is, akkor az ügyfélinformációk a következőket tartalmazzák:

public class ÜgyfélDTO {private String keresztnév; privát karakterlánc vezetéknév; privát String homeCím; privát karakterlánc contactNumber; // kivitelező, getters, setters}

Tehát, a ÜgyfélDTO osztály egy megosztott modulban már nem a rendeltetését szolgálja. Ennek megoldására egy másik módszert alkalmazunk.

Az egyes mikroszolgáltatási modulokon belül hozzunk létre egy kliens modult (könyvtárat)és mellette egy szerver modul:

order-service | __ order-client | __ order-server

A megrendelés-kliens modul az ügyfélszolgálattal megosztott DTO-t tartalmaz. Ezért a megrendelés-kliens modul a következő felépítésű:

order-service └──order-client OrderClient.java OrderClientImpl.java OrderDTO.java 

A OrderClient egy interfész, amely meghatározza a rendelés módszer a megrendelési kérelmek feldolgozására:

nyilvános felület OrderClient {OrderResponse order (OrderDTO orderDTO); }

A rendelés módszerrel, a RestTemplate objektum POST kérés elküldésére a Megrendelés szolgáltatáshoz:

String serviceUrl = "// localhost: 8002 / order-service"; OrderResponse orderResponse = restTemplate.postForObject (serviceUrl + "/ create", request, OrderResponse.class);

Mellett megrendelés-kliens modul használatra kész. Most a Független Könyvtárává válik Vevőszolgálat modul:

[INFO] --- maven-dependency-plugin: 3.1.2: list (alapértelmezett-cli) @ ügyfélszolgálat --- [INFO] A következő fájlok fel vannak oldva: [INFO] com.baeldung.orderservice: order- kliens: jar: 1.0-SNAPSHOT: fordítás

Természetesen ennek nincs célja a order-server modul a „/ create” szolgáltatás végpontjának a megrendelés kliens számára történő kiszolgáltatásához:

@PostMapping ("/ create") nyilvános OrderResponse createOrder (@RequestBody OrderDTO kérés)

Ennek a szolgáltatási végpontnak köszönhetően az Ügyfélszolgálat megrendelési kérelmet küldhet a megrendelőjén keresztül. A kliens modul használatával a mikroszolgáltatások izoláltabban kommunikálnak egymással. A DTO attribútumai frissülnek a kliens modulon belül. Ezért a szerződésszegés azokra a szolgáltatásokra korlátozódik, amelyek ugyanazt az ügyfélmodult használják.

4. Következtetés

Ebben a cikkben elmagyaráztuk a DTO objektumok megosztásának mikroszolgáltatások közötti módját. Legjobb esetben ezt úgy érjük el, hogy speciális szerződéseket kötünk mikroszolgáltatási kliens modulok (könyvtárak) részeként. Ily módon elválasztjuk a szolgáltatás klienst az API erőforrást tartalmazó kiszolgáló résztől. Ennek eredményeként vannak előnyei:

  • A DTO kódban nincs redundancia a szolgáltatások között
  • A szerződésszegés azokra a szolgáltatásokra korlátozódik, amelyek ugyanazt az ügyfélkönyvtárat használják

A Spring Boot alkalmazás kódmintája elérhető a GitHubon.