Pytanie bazuję na następujących założeniach:
- Mikroserwisy są zazwyczaj wdrażane w ten sposób, że każdy serwis to osobne repo
- Jednym z założeń mikroserwisów jest umożliwienie niezależnego od siebie wersjonowania i wdrażania komponentów aplikacji. Gdyby korzystać z "tradycyjnego" modelu, tj. jedno repo z wieloma projektami kompilowanymi jako biblioteki (np. .dllki), to każda zmiana w danej bibliotece pociąga za sobą konieczność podniesienia wersji i wdrożenia wszystkich bibliotek (oraz oczywiście samego exeka), które zależą od tej biblioteczki, która uległa zmianie. Nie dzieje się tak, jeśli zamiast bibliotek mamy osobne pliki wykonywalne, które są kompilowane niezależnie od siebie.
- Mikroserwisy komunikują się ze sobą za pomocą serializacji i mechanizmów takich, jak REST API. Wymaga to, by komunikujące się ze sobą mikroserwisy korzystały z tego samego modelu danych
Przedstawiłem swój "mental model", bo wiele razy się orientowałem, że pytania, które chcę zadać są oparte na niepoprawnym rozumieniu zagadnienia - jeśli teraz też tak jest, to może dzięki temu uda się uniknąć konfuzji.
Teraz właściwe pytanie.
Załóżmy, że mamy mikroserwis A oraz mikroserwis B i A przesyła jakieś dane B.
Wobec tego w A będziemy mieć klasę jakąś taką:
public class ModelDanych
{
public string JakisNapis {get; set;}
public int JakasLiczba {get; set;}
public List<PodModel> JakasKolekcja {get; set;}
}
public class PodModel
{
public double // ...
/*
...
*/
}
(Javowców przepraszam za C#, niestety ten język na razie znam najlepiej, z pewnością jednak zagadnienie jest analogiczne w Javie)
Serwis A zserializuje tę klasę do np. JSONa, wyśle ją do serwisu B, który otrzyma JSONa i zdeserializuje go do klasy jakiejś takiej:
public class ModelDanych
{
public string JakisNapis {get; set;}
public int JakasLiczba {get; set;}
public List<PodModel> JakasKolekcja {get; set;}
}
public class PodModel
{
public double // ...
/*
...
*/
}
Tak, zrobiłem tu Ctrl+C Ctrl+V podczas pisania pytania. Analogiczny Ctrl+C Ctrl+V trzeba by zrobić podczas pisania tych mikroserwisów. A tymczasem Ctrl+C Ctrl+V jest operacją podobno zakazaną podczas programowania?
W przypadku monolitu zamiast serwisów A i B mielibyśmy biblioteki A i B i one zależałyby od klasy ModelDanych
, która siedziałaby pewnie w jakiejś wspólnej bibliotece Modele.dll
czy coś w tym stylu. Dlatego zawartość tej klasy nie byłaby przeklejona. A jak uniknąć duplikacji w przypadku mikroserwisów?