Uvod u Spring Cloud Rest klijenta s Netflix vrpcom

1. Uvod

Netflix Ribbon je knjižnica u oblaku međuprocesne komunikacije (IPC). Vrpca prvenstveno pruža algoritme za uravnoteženje opterećenja na strani klijenta.

Osim algoritama za uravnoteženje opterećenja na strani klijenta, Ribbon nudi i druge značajke:

  • Integracija otkrivanja usluga - Uređaji za uravnoteženje vrpce pružaju otkrivanje usluga u dinamičnim okruženjima poput oblaka. Integracija s komponentom za otkrivanje usluga Eureka i Netflix uključena je u biblioteku vrpci
  • Tolerancija kvarova - Ribbon API može dinamički utvrditi rade li poslužitelji u aktivnom okruženju i može otkriti one poslužitelje koji su u kvaru
  • Podesiva pravila uravnoteženja opterećenja - Nosači vrpce RoundRobinRule, Pravilo raspoloživosti filtriranja, WeightedResponseTimeRule izvan okvira, a također podržava definiranje prilagođenih pravila

Ribbon API djeluje na temelju koncepta nazvanog "Imenovani klijent". Tijekom konfiguriranja vrpce u našoj konfiguracijskoj datoteci aplikacije pružamo naziv za popis poslužitelja uključenih za uravnoteženje opterećenja.

Uzmimo to za spin.

2. Upravljanje ovisnostima

API trake Netflix može se dodati našem projektu dodavanjem donje ovisnosti našem pom.xml:

 org.springframework.cloud proljeće-oblak-starter-netflix-vrpca 

Najnovije knjižnice možete pronaći ovdje.

3. Primjer prijave

Kako bismo vidjeli rad Ribbon API-ja, s Springom izrađujemo uzorak mikroservisne aplikacije RestTemplate i poboljšavamo ga Netflix Ribbon API-jem zajedno s Spring Cloud Netflix API-jem.

Koristit ćemo jednu od Ribbon-ovih strategija uravnoteženja opterećenja, WeightedResponseTimeRule, kako bismo omogućili uravnoteženje opterećenja na strani klijenta između 2 poslužitelja, koja su definirana pod imenovanim klijentom u konfiguracijskoj datoteci, u našoj aplikaciji.

4. Konfiguracija vrpce

Ribbon API omogućuje nam konfiguriranje sljedećih komponenata uravnoteživača tereta:

  • Pravilo - Logička komponenta koja određuje pravilo uravnoteženja tereta koje koristimo u našoj aplikaciji
  • Ping - Komponenta koja određuje mehanizam koji koristimo za određivanje dostupnosti poslužitelja u stvarnom vremenu
  • Popis poslužitelja - mogu biti dinamički ili statični. U našem slučaju koristimo statički popis poslužitelja i stoga ih izravno definiramo u datoteci za konfiguraciju aplikacije

Napišimo jednostavnu konfiguraciju za knjižnicu:

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

Primijetite kako smo koristili WeightedResponseTimeRule pravilo za određivanje poslužitelja i PingUrl mehanizam za određivanje dostupnosti poslužitelja u stvarnom vremenu.

Prema ovom pravilu, svaki poslužitelj dobiva težinu u skladu sa svojim prosječnim vremenom odziva, što manje vrijeme odziva daje manju težinu. Ovo pravilo nasumično odabire poslužitelj gdje se mogućnost određuje težinom poslužitelja.

I PingUrl će pingati svaki URL kako bi utvrdio dostupnost poslužitelja.

5. primjena.iml

Ispod je primjena.iml konfiguracijsku datoteku koju smo stvorili za ovaj uzorak aplikacije:

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

U gornjoj datoteci naveli smo:

  • Naziv aplikacije
  • Broj porta aplikacije
  • Imenovani klijent za popis poslužitelja: “ping-server”
  • Onemogućena komponenta otkrivanja usluge Eureka postavljanjem eureke: omogućeno do lažno
  • Definirao je popis poslužitelja dostupnih za uravnoteženje opterećenja, u ovom slučaju 2 poslužitelja
  • Konfigurirao je brzinu osvježavanja poslužitelja s ServerListRefreshInterval

6. RibbonClient

Postavimo sada isječak glavne komponente aplikacije - tamo gdje koristimo RibbonClient kako bi se omogućilo uravnoteženje tereta umjesto ravnice RestTemplate:

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

S napomenom smo definirali klasu kontrolera @RestController; također smo razred označili s @RibbonClient s imenom i konfiguracijskom klasom.

Klasa konfiguracije koju smo ovdje definirali ista je klasa koju smo definirali prije u kojoj smo pružili željenu konfiguraciju vrpce API za ovu aplikaciju.

Obavijest da smo također označili RestTemplate s @LoadBalanced što sugerira da želimo da ovo bude uravnoteženo s opterećenjem, a u ovom slučaju s vrpcom.

7. Otpornost na neuspjeh na vrpci

Kao što smo ranije raspravljali u ovom članku, Ribbon API ne samo da pruža algoritme za uravnoteženje opterećenja na strani klijenta, već ima i ugrađenu otpornost na kvarove.

Kao što je prethodno rečeno, Ribbon API može odrediti dostupnost poslužitelja stalnim pinganjem poslužitelja u redovitim intervalima i ima mogućnost preskakanja poslužitelja koji nisu aktivni.

Uz to, također implementira obrazac prekidača za filtriranje poslužitelja na temelju određenih kriterija.

Uzorak prekidača minimalizira utjecaj kvara poslužitelja na performanse brzim odbijanjem zahtjeva tom poslužitelju koji ne uspije bez čekanja na vremensko ograničenje. Ovu značajku prekidača možemo onemogućiti postavljanjem svojstva niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped do lažno.

Kada su svi poslužitelji u kvaru, stoga nijedan poslužitelj nije dostupan za usluživanje zahtjeva, pingUrl () neće uspjeti i dobit ćemo iznimku java.lang.IllegalStateException s porukom "Nije dostupan nijedan slučaj za uručenje zahtjeva".

8. Zaključak

U ovom smo članku razgovarali o Netflix Ribbon API-ju i njegovoj implementaciji u jednostavnom uzorku aplikacije.

Kompletni izvorni kod za gore opisani primjer može se naći na spremištu GitHub.


$config[zx-auto] not found$config[zx-overlay] not found