Mikroslužby: protokoly a nástroje pro komunikaci
Mikroslužby si vyměňují zprávy ve dvou modelech: synchronním přes přímé HTTP požadavky na metody jiného servisu a asynchronním přes zprostředkovatele jako Kafka nebo RabbitMQ. V synchronním modelu odesílatel čeká na odpověď a zná URL i endpointy příjemce. Asynchronní model ukládá zprávy do témat bez přímé interakce.
Synchronní model je ideální pro scénáře požadavek-odpověď, asynchronní pro události, kde je důležitější doručení než rychlost.
Synchronní HTTP klienti
Pro přímé volání se používají tyto nástroje:
- RestTemplate: blokující klient, jednoduchý, ale zastaralý pro nové projekty kvůli blokování vláken.
- WebClient: reaktivní na Project Reactor, neblokující, vhodný pro vysoce zatížené systémy s asynchronní zpracováním.
- Feign Client: deklarativní, rozhraní s anotacemi generuje Spring implementaci HTTP klienta. Synchronní, s podporou cachování, minimalizuje boilerplate kód.
Feign zjednodušuje kód: definujete rozhraní s @GetMapping, @PostMapping – klient je hotový. WebClient vyniká v propustnosti díky non-blocking I/O.
Reaktivní programování v WebClientu
Reaktivita na Project Reactor používá Mono (jedna hodnota) a Flux (proud hodnot). Klíčové rozdíly oproti běžné asynchronii:
- Zpracování proudů dat v čase s backpressure: spotřebitel signalizuje dodavateli připravenost.
- Deklarativní operátory: map, filter, flatMap, buffer pro transformace.
- Lenivá evaluace: operace se spustí až při přihlášení.
Příklad zpracování uživatelů z repozitáře:
Flux<User> users = userRepository.findAll();
Flux<String> names = users
.filter(u -> u.getAge() > 18)
.map(User::getName)
.take(10);
names.subscribe(name -> {
System.out.println("Získáno jméno: " + name);
});
Zde se požadavky na DB spustí až na .subscribe(). Reactor se integruje se Spring WebFlux pro reaktivní webové aplikace. Používejte při vysokých zátěžích nebo streamovém zpracování, pro CRUD stačí synchronní nástroje.
WebSocket pro událostní výměnu
WebSocket naváže trvalé spojení pro obousměrnou výměnu událostí bez opakovaných požadavků. Žádný request-response cyklus: servisy posílají zprávy do otevřeného kanálu.
Vhodné pro:
- Chaty a notifikace v reálném čase.
- Hry a burzovní kurzy s okamžitými aktualizacemi.
- Proudy časových řad bez pollingu.
Nevýhoda: žádná záruka doručení při přerušení spojení. Zaměřeno na rychlost, ne spolehlivost.
Kafka: asynchronní zprostředkovatel zpráv
Kafka je distribuovaný systém pro ukládání a šíření událostí. Producer posílá do topicu (partitionovaný log), Consumer čte z partitionů.
Záruky doručení:
- At-least-once: zpráva doručena minimálně jednou (duplicity možné při selhání commitu).
- Exactly-once: přes idempotentní producenty a transakce.
Idempotence zajišťuje stejný výsledek opakovaných požadavků. Replikace na brokerech zabraňuje ztrátám. Pořadí se zachovává v partitionu podle klíče (např. user ID).
Consumer groups rozkládají zátěž: více consumerů paralelně zpracovává partitiony.
Scénáře pro Kafku:
- Asynchronní události: e-maily, analýzy, bonusy.
- Přečítání historie pro přepočty.
- Streaming (Kafka Streams, CDC z DB).
Nevýhody: složitá konfigurace klastru (KRaft místo ZooKeeper zjednodušuje), latence vyšší než HTTP.
Co je důležité
- Vyberte Feign pro jednoduché synchronní volání s minimem kódu.
- WebClient je nutností pro reaktivní high-load systémy s Flux/Mono.
- WebSocket pro real-time obousměrnou komunikaci bez záruk doručení.
- Kafka pro spolehlivou asynchronní event-driven výměnu s historií.
- Kombinujte: synchronní pro CRUD, asynchronní pro události.
— Editorial Team
Zatím žádné komentáře.