Wzorzec Kompozycji API jest używany, gdy dane dla frontendu lub zewnętrznej usługi muszą być agregowane z różnych mikroserwisów. Realizuje się to przez warstwę koordynacyjną (API Composer), która zbiera potrzebne dane za pomocą oddzielnych zapytań do odpowiednich usług i formuje ostateczną odpowiedź.
Często ta warstwa jest realizowana jako osobna usługa, Gateway lub BFF (Backend For Frontend), zapewniająca agregację, transformację i obsługę błędów. Takie rozwiązanie redukuje nadmiarowe wywołania sieciowe i izoluje klientów od zmian wewnętrznych API.
Przykład kodu (na Node.js + Express):
const axios = require('axios'); app.get('/user-details/:id', async (req, res) => { const user = await axios.get(`http://usersvc/user/${req.params.id}`); const orders = await axios.get(`http://ordersvc/orders/user/${req.params.id}`); res.json({ user: user.data, orders: orders.data }); });
Kluczowe cechy:
Czy kompozycja API zawsze jest najlepszym sposobem łączenia danych z mikroserwisów?
Nie, przy dużej liczbie powiązanych encji i wolnych połączeniach wydajność może ucierpieć. W niektórych przypadkach lepiej jest używać CQRS lub usług agregatorów danych.
Czy można bezpośrednio odwoływać się z frontu do każdego mikroserwisu?
W małych systemach jest to możliwe, ale wraz z rozwojem systemu pojawiają się kwestie bezpieczeństwa, zarządzania schematami, skalowalności i obciążenia frontu logiką agregacji. Dlatego preferowana jest zcentralizowana warstwa agregacji.
Czy kompozycja API zapewnia transakcyjną integralność między usługami?
Nie. Ten wzorzec agreguje tylko dane dla zapytania. Transakcyjność należy realizować za pomocą sag lub mechanizmów zdarzeń.