Zpět na domů

Nástroje komunikace mikroslužeb Kafka Feign

Článek rozebírá nástroje interakce mikroslužeb: synchronní HTTP klienti WebClient a Feign, real-time WebSocket, asynchronní brokeř Kafka. Popsána reaktivita na Reactor, záruky doručení, příklady kódu Flux. Doporučení k výběru pod zátěž a scénáře.

Jak mikroslužby komunikují: Kafka vs Feign vs WebClient
Advertisement 728x90

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:

Google AdInline article slot
  • 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:

Google AdInline article slot
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:

Google AdInline article slot
  • 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

Advertisement 728x90

Číst dál