[Microservizi con Spring Boot] Un API Gateway con Zuul Proxy

Un API Gateway, anche noto come Edge Service, consente di definire un’interfaccia unificata per una serie di microservizi che consente di nasconderne i dettagli implementativi. In poche parole ci consente di utilizzare tali servizi ma senza preoccuparci di come funzionano internamente, di come comunicano tra di loro, di come sono organizzati.

Tutta la complessità del sistema è completamente trasparente.

Questo è uno dei principali vantaggi a cui si aggiunge la possibilità di centralizzare aspetti fondamentali quali la sicurezza, il monitoraggio ecc.

Chiaramente il punto critico è rappresentato dal fatto che questo gateway può diventare un single point of failure minando l’intera architettura. Per cui andranno messi in campo tutti gli accorgimenti per garantirne l’high availability.

Anche in questo caso l’ecosistema di Spring ci offre una soluzione al problema. Si tratta di Zuul realizzato da Netflix.

A voler essere precisi il team della nota piattaforma di streaming ha sospeso lo sviluppo ufficiale e infatti ora ci si sta orientando verso un altro progetto: Spring Cloud Gateway.

Tuttavia Zuul resta ancora la soluzione più diffusa e matura.

Dunque vediamo come mettere in campo facilmente il nostro gateway.

Come sempre partiamo da un nuovo progetto Spring Boot in cui includiamo le dipendenze di Eureka Client e Netflix Zuul.

Aggiungiamo al file application.properties le seguenti proprietà

spring.application.name=zuul-gateway
server.port=8085
eureka.client.service-url.default-zone=http://localhost:8761
eureka.client.fetchRegistry=true

In particolare la eureka.client.fetchRegistry=true è fondamentale per consentire a Zuul di ottenere informazioni sui microservizi tramite il server Eureka.

Dal punto di vista del codice dobbiamo semplicemente aggiungere alla classe principale (che abbiamo chiamato ZuulProxyApplication) le annotazioni @EnableZuulProxy e @EnableDiscoveryClient per abilitare il proxy e fare in modo che si registri presso Eureka.

Facciamo un primo test avviando nell’ordine:

  1. Eureka
  2. Zuul
  3. microservice-demo

eureka-zuul

Apriamo nel browser la url http://localhost:8085/microservice-demo/hello

Prestiamo attenzione al fatto che sulla porta 8085 gira Zuul, quindi stiamo chiamando indirettamente il microservizio attraverso il suo nome (la property spring.application.name riportata nelle impostazioni del relativo progetto) senza conoscere esattamente il suo indirizzo fisico.

Tuttavia la chiamata dipende dal nome del servizio, mentre uno dei vantaggi di un API gateway è il completo disaccoppiamento: ovvero possiamo astrarre dalla infrastruttura definendo una serie di endpoint che verranno utilizzati dai client e saranno mappati sui vari microservizi.
Per intenderci possiamo definire un endpoint /api/demo e mapparlo sul microservice-demo. Nel caso in cui decidessimo di associarlo ad un differente microservice-demo2 questo non avrebbe alcun impatto sui client che continuerebbe ad utilizzare esclusivamente /api/demo.

Passiamo alle impostazioni specifiche di Zuul.
Di default tutti i servizi registrati con Eureka sono esposti, quindi per prima cosa disabilitiamo questa opzione con zuul.ignored-services=* in modo da poter definire con maggiore granularità quali gestire tramite il gateway.

Possiamo impostare un prefisso

zuul.prefix=/api

quindi definire gli endpoint con

zuul.routes.microservicedemo.path=/demo/**
zuul.routes.microservicedemo.serviceId=microservice-demo

indicando il path utilizzato nel browser e il microservizio ad esso associato.

In particolare la stringa “microservicedemo” riportata dopo “routes” può essere scelta arbitrariamente. L’importante è che corrisponda in entrambe le proprietà “path” e “serviceId” per una corretta associazione.
Non ci sono limiti al numero di route definibili.

A questo punto possiamo modificare l’url del browser in http://localhost:8085/api/demo/hello ottenendo una risposta da microservice-demo

zuul-microservice

Il primo passo è fatto. Vedremo in seguito ulteriori configurazioni dell’API gateway.

Il codice è disponibile su GitHub.

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

Utilizzando il sito, accetti l'invio dei cookies da parte nostra. Maggiori informazioni

Questo sito utilizza i cookies per fornire la migliore esperienza di navigazione possibile. Continuando ad utilizzarlo senza modificare le impostazioni o cliccando su "Accetta" acconsenti al loro utilizzo.

Chiudi