2016-08-10 12 views
6

że dwa microservices:Jak obsługiwać ścieżki API REST, gdy powiązane zasoby należą do różnych mikroserwisów?

  • UserService, który wyznacza ścieżkę jak użytkowników// użytkowników/id;
  • MessageService, która definiuje ścieżki takie jak/messages,/messages /: id.

Ponadto każda wiadomość w MessageService ma atrybut user_id, który odwołuje się do użytkownika w UserService.

Teraz możemy powiedzieć, że chcę wyświetlić wszystkie wiadomości danego użytkownika. Teraz mogę myśleć z następujących metod:

  1. Ścieżka takich jak /users/id/Komunikaty Wydaje się, że najlepszym podejściem, jeśli chcę śledzić najlepszych praktyk REST API. Jednak wydaje mi się, że nie mogłem zdefiniować takiej ścieżki wewnątrz usługi MessageService, ponieważ byłbym ściśle powiązany z usługą UserService. Wierzę, że ścieżki zaczynające się od/users powinny należeć tylko do UserService.
  2. /messages? Id_użytkownika =: id, więc mógłbym użyć istniejącej ścieżki/wiadomości i dodać filtr według atrybutu (user_id). Nie jestem pewien, czy to dobra praktyka.
  3. Umieść bramkę API przed mikroserwisami i utwórz serwer proxy od /users /: id/messages do /messages? Id_użytkownika =: id. Dzięki temu klienci mogą korzystać z najbardziej przyjaznej dla REST ścieżki, jednocześnie utrzymując luźno połączone mikroserwisy.

Które z tych podejść byłoby najbardziej odpowiednie?

Odpowiedz

3

Nie ma dobrej lub złej odpowiedzi na to pytanie. IMO, zależy to od tego, czy wiadomości są autonomicznymi zasobami lub są częścią zasobu użytkownika w logice domeny.

Jeśli wiadomości zawsze należą do pojedynczego użytkownika, możesz przeglądać wiadomości użytkownika jako pod-zasób lub hierarchiczny podział w zbiorze wiadomości i prawdopodobnie wolałbym pierwszy schemat URI. W tym przypadku prawdopodobnie użyłbym ścieżki takiej jak /user/:id/messages zamiast liczby mnogiej "użytkownicy". Lub umieść identyfikator użytkownika za wiadomościami takimi jak: /messages/user/:id

Jeśli wiadomości są jednostką samodzielnie w domenie lub mogą należeć do wielu użytkowników (np. Wiadomości e-mail), bardziej sensowne byłoby filtrowanie wiadomości za pomocą schematu ciągów zapytań.

+0

Tak, wiadomości zawsze należą do jednego użytkownika. Czy dobrą praktyką jest mieć ścieżkę zaczynającą się od/user w mikroserwisie, które nie przechowuje użytkowników, tylko odniesienie do nich? – vitorsdcs

+0

Myślę, że w tym przypadku wszystko jest w porządku. Jeśli twoja usługa udostępnia zasoby o nazwie "users" (liczba mnoga), spodziewam się, że będę mógł wykonywać na nim operacje CRUD. W tym przypadku widzę to jako hierarchiczny podział kolekcji wiadomości. Ale jeśli ci się nie spodoba, możesz również umieścić użytkownika za kolekcją wiadomości, w ten sposób: '/ messages/user /: id' – MvdD

3

Jeśli już zaprojektowałeś swoją mikro usługę, w której użytkownicy i wiadomości stanowią dwie różne usługi domenowe/mikro, najlepiej będzie zaprojektować usługę krawędziową, która łączy obie usługi i zapewni to, czego klient potrzebuje. Na przykład, usługa może być

/messages_by_user/:id 

Pamiętaj mikro usługa będzie przede wszystkim zapewnienie CRUD operacji na zasobie domeny, ale klient będzie potrzebował więcej niż operacje tylko CRUD w zasobie i w tym przypadku zawsze należy rozważyć utworzenie krawędzi usługi ułatwiające klientom.

Jeśli jeszcze nie wdrożyłeś usług, sugerowałbym umieszczenie zarówno użytkowników, jak i wiadomości w tej samej mikro usłudze i uznanie użytkownika za pod-zasób wiadomości. W takim przypadku wszystkie ścieżki mieszkowe są prawidłowe.

Projektując usługę mikroprzedsiębiorstw trzeba zachować równowagę, co ma większy sens. Chociaż teoretycznie każdy zasób i jego operacja powinny mieć oddzielną usługę mikro, ale praktycznie można połączyć kilka powiązanych zasobów i uczynić je sub-zasobem, o ile nie narusza to skalowalności, wydajności usługi.

Powiązane problemy