Inleiding tot Spring Cloud Rest Client met Netflix-lint

1. Inleiding

Netflix Ribbon is een Inter Process Communication (IPC) cloudbibliotheek. Ribbon biedt voornamelijk algoritmen voor taakverdeling aan de clientzijde.

Afgezien van de load balancing-algoritmen aan de clientzijde, biedt Ribbon ook andere functies:

  • Service Discovery-integratie - Ribbon load balancers bieden service-detectie in dynamische omgevingen zoals een cloud. Integratie met Eureka- en Netflix-servicedetectiecomponent is opgenomen in de lintbibliotheek
  • Fouttolerantie - de Ribbon API kan dynamisch bepalen of de servers actief zijn in een live-omgeving en kan die servers detecteren die niet beschikbaar zijn
  • Configureerbare regels voor taakverdeling - Ribbon ondersteunt RoundRobinRule, Beschikbaarheid Filterregel, WeightedResponseTimeRule out of the box en ondersteunt ook het definiëren van aangepaste regels

Ribbon API werkt op basis van het concept genaamd "Named Client". Bij het configureren van Ribbon in ons applicatieconfiguratiebestand geven we een naam op voor de lijst met servers die zijn opgenomen voor de taakverdeling.

Laten we het eens proberen.

2. Afhankelijkheidsbeheer

De Netflix Ribbon API kan aan ons project worden toegevoegd door de onderstaande afhankelijkheid toe te voegen aan ons pom.xml:

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

De nieuwste bibliotheken zijn hier te vinden.

3. Voorbeeldtoepassing

Om de werking van Ribbon API te zien, bouwen we een voorbeeld van een microservice-applicatie met Spring RestTemplate en we verbeteren het met Netflix Ribbon API samen met Spring Cloud Netflix API.

We gebruiken een van Ribbon's load-balancing-strategieën, WeightedResponseTimeRule, om de taakverdeling aan de clientzijde mogelijk te maken tussen 2 servers, die zijn gedefinieerd onder een genoemde client in het configuratiebestand, in onze applicatie.

4. Lintconfiguratie

Ribbon API stelt ons in staat om de volgende componenten van de load balancer te configureren:

  • Regel - Logische component die de regel voor taakverdeling specificeert die we in onze applicatie gebruiken
  • Ping - Een component die het mechanisme specificeert dat we gebruiken om de beschikbaarheid van de server in realtime te bepalen
  • Server lijst - kan dynamisch of statisch zijn. In ons geval gebruiken we een statische lijst met servers en daarom definiëren we ze rechtstreeks in het configuratiebestand van de applicatie

Laten we een eenvoudige configuratie voor de bibliotheek schrijven:

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

Merk op hoe we het WeightedResponseTimeRule regel om de server te bepalen en PingUrl mechanisme om de beschikbaarheid van de server in realtime te bepalen.

Volgens deze regel krijgt elke server een gewicht op basis van zijn gemiddelde reactietijd, hoe korter de reactietijd, hoe lager het gewicht. Deze regel selecteert willekeurig een server waarvan de mogelijkheid wordt bepaald door het gewicht van de server.

En de PingUrl zal elke URL pingen om de beschikbaarheid van de server te bepalen.

5. application.yml

Hieronder is de application.yml configuratiebestand dat we hebben gemaakt voor deze voorbeeldtoepassing:

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

In het bovenstaande bestand hebben we gespecificeerd:

  • Naam van de toepassing
  • Poortnummer van de applicatie
  • Benoemde client voor de lijst met servers: "ping-server"
  • Uitgeschakelde Eureka-service-detectiecomponent door eureka in te stellen: ingeschakeld naar false
  • De lijst met servers gedefinieerd die beschikbaar zijn voor taakverdeling, in dit geval 2 servers
  • De vernieuwingsfrequentie van de server geconfigureerd met ServerListRefreshInterval

6. RibbonClient

Laten we nu het hoofdfragment van de toepassingscomponenten instellen - waar we de RibbonClient om de taakverdeling mogelijk te maken in plaats van de vlakte RestTemplate:

@SpringBootApplication @RestController @RibbonClient (name = "ping-a-server", configuration = RibbonConfiguration.class) openbare klasse ServerLocationApp {@LoadBalanced @Bean RestTemplate getRestTemplate () {retourneer nieuwe RestTemplate (); } @Autowired RestTemplate restTemplate; @RequestMapping ("/ server-location") public String serverLocation () {return this.restTemplate.getForObject ("// ping-server / locaus", String.class); } openbare statische leegte hoofd (String [] args) {SpringApplication.run (ServerLocationApp.class, args); }}

We hebben een controllerklasse gedefinieerd met de annotatie @RestController; we hebben ook de klas geannoteerd met @BuienRadarNL met een naam en een configuratieklasse.

De configuratieklasse die we hier hebben gedefinieerd, is dezelfde klasse die we eerder hebben gedefinieerd, waarin we de gewenste Ribbon API-configuratie voor deze applicatie hebben geleverd.

Merk op dat we ook de RestTemplate met @LoadBalanced wat suggereert dat we willen dat dit wordt gebalanceerd en in dit geval met Ribbon.

7. Storingsveerkracht in lint

Zoals we eerder in dit artikel hebben besproken, biedt Ribbon API niet alleen load balancing-algoritmen aan de clientzijde, maar heeft het ook een ingebouwde storingsbestendigheid.

Zoals eerder vermeld, kan de Ribbon API de beschikbaarheid van de server bepalen door constant met regelmatige tussenpozen servers te pingen en heeft de mogelijkheid om servers over te slaan die niet live zijn.

Daarnaast implementeert het ook een Circuit Breaker-patroon om de servers uit te filteren op basis van gespecificeerde criteria.

Het Circuit Breaker-patroon minimaliseert de impact van een serverstoring op de prestaties door snel een verzoek aan die server af te wijzen zonder te wachten op een time-out. We kunnen deze Circuit Breaker-functie uitschakelen door de eigenschap in te stellen niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped naar false.

Als alle servers niet beschikbaar zijn, is er dus geen server beschikbaar om het verzoek te verwerken, de pingUrl () zal mislukken en we krijgen een uitzondering java.lang.IllegalStateException met een bericht "Er zijn geen instanties beschikbaar om aan het verzoek te voldoen".

8. Conclusie

In dit artikel hebben we de Netflix Ribbon API en de implementatie ervan in een eenvoudige voorbeeldtoepassing besproken.

De volledige broncode voor het hierboven beschreven voorbeeld is te vinden op de GitHub-repository.