Wzorce MSA: Ambasador (Ambassador Pattern)

W architekturze mikroserwisów (MSA) bardzo często mikroserwisy muszą komunikować się z zewnętrznymi usługami lub innymi mikroserwisami. W takich przypadkach kluczowe jest zapewnienie stabilności, bezpieczeństwa i odpowiedniej kontroli nad ruchem wychodzącym.
Jednym z rozwiązań ułatwiających te zadania jest Ambassador Pattern (wzorzec ambasador), który pozwala na odciążenie głównej logiki mikroserwisu i lepsze zarządzanie połączeniami z innymi systemami.



W tym artykule omówię:

  • Jak działa wzorzec ambasador?
  • Kiedy warto go stosować?
  • Przykłady implementacji w Kubernetes i Spring Cloud

Jak działa wzorzec Ambassador?

Ambassador Pattern zakłada, że zamiast bezpośredniego łączenia się z zewnętrznymi usługami, mikroserwis deleguje połączenia do specjalnej warstwy proxy (ambasadora). Proxy obsługuje komunikację, dodając dodatkowe funkcjonalności, takie jak:
Monitoring i logowanie ruchu
Buforowanie żądań
Circuit Breaker dla zwiększenia odporności
Autoryzacja i kontrola dostępu
Obsługa retrysów i time-outów

Z perspektywy mikroserwisu, ambasador działa jak lokalny serwis, a w rzeczywistości przekazuje żądania do rzeczywistego odbiorcy.

Kiedy warto stosować wzorzec Ambasador?

🔹 Gdy mikroserwis komunikuje się z zewnętrznymi API lub usługami
🔹 Gdy chcemy dodać mechanizmy odporności, np. Circuit Breaker lub Retry Logic
🔹 Gdy chcemy przechwycić ruch i logować zdarzenia na poziomie proxy
🔹 Gdy chcemy uprościć kod mikroserwisu i uniknąć bezpośredniej integracji z komponentami sieciowymi

Dzięki oddzieleniu odpowiedzialności za komunikację, możemy utrzymać czysty kod mikroserwisu, a konfiguracja ambasadora może być łatwo zmieniana bez konieczności ingerencji w główny serwis.

Przykład implementacji w Kubernetes – Ambassador Sidecar

W środowisku Kubernetes, wzorzec ambasador jest najczęściej realizowany za pomocą kontenera sidecar, który działa obok mikroserwisu w tym samym podzie.

Przykładowy manifest dla ambasadora w Kubernetes (Envoy Proxy)


apiVersion: v1 kind: Pod metadata: name: my-microservice labels: app: my-microservice spec: containers: - name: my-microservice image: my-microservice:latest ports: - containerPort: 8080 - name: ambassador image: envoyproxy/envoy:latest ports: - containerPort: 9901 volumeMounts: - name: envoy-config mountPath: /etc/envoy volumes: - name: envoy-config configMap: name: envoy-config

🔹 Pierwszy kontener (my-microservice) to aplikacja biznesowa.
🔹 Drugi kontener (ambasador – Envoy Proxy) przejmuje ruch wychodzący i zarządza komunikacją.

Dzięki temu mikroserwis nie musi zajmować się takimi aspektami jak retry logic, circuit breaker czy monitoring – wszystkim zarządza ambasador.

Przykład w Spring Cloud – Ambassador Pattern z Resilience4j

W Spring Cloud możemy zaimplementować wzorzec Ambasador za pomocą Resilience4j, który zapewnia obsługę Circuit Breaker, Retry i Rate Limiting.


@CircuitBreaker(name = "externalService", fallbackMethod = "fallbackResponse") @Retry(name = "externalService", maxAttempts = 3) public String callExternalService() { return restTemplate.getForObject("https://api.external.com/data", String.class); } public String fallbackResponse(Exception e) { return "Fallback: Serwis niedostępny"; }

Circuit Breaker – zapobiega przeciążeniu systemu, blokując wywołania do usługi, gdy wykryje jej awarię.
Retry Logic – podejmuje kilka prób ponownego wykonania żądania w przypadku błędu.

Dzięki temu mikroserwis nie musi samodzielnie obsługiwać problemów z siecią, a cała logika odpornościowa jest zarządzana przez warstwę ambasadora.

Korzyści z zastosowania wzorca Ambasador

Lepsza separacja odpowiedzialności – mikroserwis skupia się na logice biznesowej, a ambasador zarządza komunikacją.
Odporność na błędy sieciowe – retry logic, circuit breaker i load balancing poprawiają stabilność systemu.
Bezpieczeństwo – ambasador może obsługiwać autoryzację i szyfrowanie ruchu.
Łatwiejsza skalowalność – warstwa proxy może być dynamicznie konfigurowana i skalowana niezależnie od mikroserwisów.

Ambassador a API Gateway

Być może zwróciłeś uwagą na podobieństwo wzorca Ambasador do omawianego przeze mnie innego wzorca MSA - API Gateway. Jednak wzorce te, mają różne zastosowania i uzupełniają się w architekturze mikroserwisów.

Podsumowanie

🔹 Ambassador Pattern to skuteczny sposób na zarządzanie komunikacją mikroserwisów z zewnętrznymi usługami.
🔹 W Kubernetes ambasador jest często realizowany jako sidecar proxy, np. Envoy Proxy.
🔹 W Spring Cloud można wykorzystać Resilience4j do obsługi circuit breaker i retry logic.
🔹 Wzorzec ambasador pozwala na odporność, monitoring i bezpieczeństwo połączeń wychodzących, co znacząco zwiększa stabilność systemów opartych na MSA.

Komentarze