Introduzione a Spring Cloud Rest Client con Netflix Ribbon

1. Introduzione

Netflix Ribbon è una libreria cloud Inter Process Communication (IPC). Ribbon fornisce principalmente algoritmi di bilanciamento del carico lato client.

Oltre agli algoritmi di bilanciamento del carico lato client, Ribbon fornisce anche altre funzionalità:

  • Integrazione dell'individuazione dei servizi: i sistemi di bilanciamento del carico della barra multifunzione forniscono l'individuazione dei servizi in ambienti dinamici come un cloud. L'integrazione con Eureka e il componente di rilevamento del servizio Netflix è inclusa nella libreria della barra multifunzione
  • Tolleranza agli errori : l'API della barra multifunzione può determinare dinamicamente se i server sono attivi e in esecuzione in un ambiente live e può rilevare quei server che sono inattivi
  • Regole di bilanciamento del carico configurabili : la barra multifunzione supporta RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule e supporta anche la definizione di regole personalizzate

Ribbon API funziona in base al concetto chiamato "Named Client". Durante la configurazione della barra multifunzione nel file di configurazione dell'applicazione, forniamo un nome per l'elenco dei server inclusi per il bilanciamento del carico.

Facciamo un giro.

2. Gestione delle dipendenze

L'API della barra multifunzione di Netflix può essere aggiunta al nostro progetto aggiungendo la seguente dipendenza al nostro pom.xml:

 org.springframework.cloud spring-cloud-starter-netflix-ribbon 

Le ultime biblioteche possono essere trovate qui.

3. Applicazione di esempio

Per vedere il funzionamento dell'API Ribbon, creiamo un'applicazione di microservizi di esempio con Spring RestTemplate e la miglioriamo con Netflix Ribbon API insieme all'API Spring Cloud Netflix.

Useremo una delle strategie di bilanciamento del carico di Ribbon, WeightedResponseTimeRule , per abilitare il bilanciamento del carico lato client tra 2 server, che sono definiti in un client con nome nel file di configurazione, nella nostra applicazione.

4. Configurazione del nastro

L'API della barra multifunzione ci consente di configurare i seguenti componenti del bilanciamento del carico:

  • Regola : componente logico che specifica la regola di bilanciamento del carico che stiamo utilizzando nella nostra applicazione
  • Ping : un componente che specifica il meccanismo che utilizziamo per determinare la disponibilità del server in tempo reale
  • ServerList : può essere dinamico o statico. Nel nostro caso, stiamo usando un elenco statico di server e quindi li stiamo definendo direttamente nel file di configurazione dell'applicazione

Scriviamo una semplice configurazione per la libreria:

public class RibbonConfiguration { @Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } @Bean public IRule ribbonRule(IClientConfig config) { return new WeightedResponseTimeRule(); } }

Si noti come abbiamo utilizzato la regola WeightedResponseTimeRule per determinare il server e il meccanismo PingUrl per determinare la disponibilità del server in tempo reale.

Secondo questa regola, ad ogni server viene assegnato un peso in base al suo tempo medio di risposta, minore è il tempo di risposta minore sarà il peso. Questa regola seleziona casualmente un server in cui la possibilità è determinata dal peso del server.

E il PingUrl eseguirà il ping di ogni URL per determinare la disponibilità del server.

5. application.yml

Di seguito è riportato il file di configurazione application.yml che abbiamo creato per questa applicazione di esempio:

spring: application: name: spring-cloud-ribbon server: port: 8888 ping-server: ribbon: eureka: enabled: false listOfServers: localhost:9092,localhost:9999 ServerListRefreshInterval: 15000

Nel file sopra, abbiamo specificato:

  • Nome dell'applicazione
  • Numero di porta dell'applicazione
  • Client denominato per l'elenco dei server: "ping-server"
  • Componente di rilevamento del servizio Eureka disabilitato, impostando eureka: enabled su false
  • Definito l'elenco dei server disponibili per il bilanciamento del carico, in questo caso 2 server
  • Configurazione della frequenza di aggiornamento del server con ServerListRefreshInterval

6. RibbonClient

Configuriamo ora lo snippet del componente dell'applicazione principale, in cui utilizziamo RibbonClient per abilitare il bilanciamento del carico invece del semplice RestTemplate :

@SpringBootApplication @RestController @RibbonClient( name = "ping-a-server", configuration = RibbonConfiguration.class) public class ServerLocationApp { @LoadBalanced @Bean RestTemplate getRestTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/server-location") public String serverLocation() { return this.restTemplate.getForObject( "//ping-server/locaus", String.class); } public static void main(String[] args) { SpringApplication.run(ServerLocationApp.class, args); } }

Abbiamo definito una classe controller con l'annotazione @RestController ; abbiamo anche annotato la classe con @RibbonClient con un nome e una classe di configurazione.

La classe di configurazione che abbiamo definito qui è la stessa classe che abbiamo definito prima in cui abbiamo fornito la configurazione API Ribbon desiderata per questa applicazione.

Si noti che abbiamo anche annotato RestTemplate con @LoadBalanced che suggerisce che vogliamo che questo sia bilanciato dal carico e in questo caso con Ribbon.

7. Resilienza ai guasti nel nastro

Come discusso in precedenza in questo articolo, l'API Ribbon non solo fornisce algoritmi di bilanciamento del carico lato client, ma ha anche una resilienza agli errori incorporata.

Come affermato in precedenza, l'API della barra multifunzione può determinare la disponibilità del server tramite il ping costante dei server a intervalli regolari e ha la capacità di ignorare i server che non sono attivi.

Oltre a ciò, implementa anche il pattern Circuit Breaker per filtrare i server in base a criteri specificati.

Il pattern Circuit Breaker riduce al minimo l'impatto di un errore del server sulle prestazioni rifiutando rapidamente una richiesta a quel server che non riesce senza attendere un timeout. Possiamo disabilitare questa funzione Circuit Breaker impostando la proprietà niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped su false .

Quando tutti i server sono inattivi , quindi nessun server è disponibile per servire la richiesta, pingUrl () fallirà e riceviamo un'eccezione java.lang.IllegalStateException con un messaggio "Nessuna istanza disponibile per servire la richiesta" .

8. Conclusione

In questo articolo, abbiamo discusso l'API Ribbon di Netflix e la sua implementazione in una semplice applicazione di esempio.

Il codice sorgente completo per l'esempio descritto sopra può essere trovato nel repository GitHub.