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.