Úvod do aplikácie Spring Cloud Rest Client s páskou Netflix

1. Úvod

Netflix Ribbon je cloudová knižnica medzi procesmi (IPC). Ribbon primárne poskytuje algoritmy vyrovnávania zaťaženia na strane klienta.

Okrem algoritmov vyrovnávania záťaže na strane klienta Ribbon poskytuje aj ďalšie funkcie:

  • Integrácia vyhľadávania služieb - Vyrovnávače zaťaženia pásky poskytujú objavovanie služieb v dynamických prostrediach, ako je cloud. Integrácia s komponentmi Eureka a Netflix discovery service je obsiahnutá v knižnici stužkových
  • Odolnosť proti chybám - rozhranie Ribbon API dokáže dynamicky určiť, či sú servery funkčné v živom prostredí, a dokáže zistiť, ktoré servery sú nefunkčné
  • Konfigurovateľné pravidlá vyrovnávania zaťaženia - Stuhy podporuje RoundRobinRule, Pravidlo dostupnosti, WeightedResponseTimeRule po vybalení z krabice a tiež podporuje definovanie vlastných pravidiel

Ribbon API funguje na základe konceptu s názvom „Named Client“. Pri konfigurácii pásky v našom konfiguračnom súbore aplikácie poskytujeme názov zoznamu serverov zahrnutých do vyrovnávania zaťaženia.

Zoberme si to na otočku.

2. Správa závislostí

Netflix Ribbon API je možné pridať do nášho projektu pridaním nižšie uvedenej závislosti do nášho pom.xml:

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

Najnovšie knižnice nájdete tu.

3. Ukážka aplikácie

Aby sme videli fungovanie Ribbon API, vytvorili sme vzorovú aplikáciu mikroslužby s Spring RestTemplate a vylepšujeme ho o Netflix Ribbon API spolu s Spring Cloud Netflix API.

Použijeme jednu zo stratégií vyrovnávania zaťaženia Ribbon, WeightedResponseTimeRule, aby sme v našej aplikácii umožnili rozloženie záťaže na strane klienta medzi 2 servermi, ktoré sú definované v konfiguračnom súbore pod pomenovaným klientom.

4. Konfigurácia pásky

Ribbon API nám umožňuje konfigurovať nasledujúce komponenty nástroja na vyrovnávanie zaťaženia:

  • Pravidlo - Logická súčasť, ktorá určuje pravidlo vyrovnávania zaťaženia, ktoré používame v našej aplikácii
  • Ping - Komponent, ktorý špecifikuje mechanizmus, ktorý používame na určenie dostupnosti servera v reálnom čase
  • Zoznam serverov - môže byť dynamický alebo statický. V našom prípade používame statický zoznam serverov, a preto ich definujeme priamo v konfiguračnom súbore aplikácie

Poďme napísať jednoduchú konfiguráciu pre knižnicu:

verejná trieda RibbonConfiguration {@Autowired IClientConfig ribbonClientConfig; @Bean public IPing ribbonPing (IClientConfig config) {vrátiť nový PingUrl (); } @Bean public IRule ribbonRule (IClientConfig config) {return new WeightedResponseTimeRule (); }}

Všimnite si, ako sme použili WeightedResponseTimeRule pravidlo na určenie servera a PingUrl mechanizmus na zisťovanie dostupnosti servera v reálnom čase.

Podľa tohto pravidla je každému serveru pridelená váha podľa jeho priemerného času odozvy, čím menšia doba odozvy dáva menšiu váhu. Toto pravidlo náhodne vyberie server, kde je možnosť určená váhou servera.

A PingUrl pomocou príkazu ping na každú adresu URL určí dostupnosť servera.

5. aplikácia.yml

Nižšie je aplikácia.yml konfiguračný súbor, ktorý sme vytvorili pre túto vzorovú aplikáciu:

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

Vo vyššie uvedenom súbore sme zadali:

  • Názov aplikácie
  • Číslo portu aplikácie
  • Pomenovaný klient pre zoznam serverov: „ping-server“
  • Zakázaná súčasť zisťovania služieb Eureka nastavením Eureka: povolené do nepravdivé
  • Definoval zoznam serverov dostupných pre vyrovnávanie zaťaženia, v tomto prípade 2 servery
  • Konfiguroval obnovovaciu frekvenciu servera pomocou ServerListRefreshInterval

6. RibbonClient

Poďme teraz nastaviť útržok hlavnej súčasti aplikácie - kde použijeme RibbonClient aby bolo možné vyrovnať zaťaženie namiesto obyčajného RestTemplate:

@SpringBootApplication @RestController @RibbonClient (name = "ping-a-server", configuration = RibbonConfiguration.class) verejná trieda 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); }}

Definovali sme triedu radiča s anotáciou @RestController; triedu sme tiež anotovali @RibbonClient s menom a konfiguračnou triedou.

Trieda konfigurácie, ktorú sme tu definovali, je rovnaká trieda, ktorú sme definovali predtým, v ktorej sme pre túto aplikáciu poskytli požadovanú konfiguráciu rozhrania Ribbon API.

Všimnite si, že sme tiež anotovali RestTemplate s @LoadBalanced čo naznačuje, že chceme, aby to bolo vyvážené v tomto prípade v prípade pásky Ribbon.

7. Odolnosť proti zlyhaniu na páse s nástrojmi

Ako sme už diskutovali vyššie v tomto článku, Ribbon API poskytuje nielen algoritmy vyrovnávania zaťaženia na strane klienta, ale tiež má zabudovanú odolnosť proti zlyhaniu.

Ako už bolo uvedené, Ribbon API dokáže určovať dostupnosť servera neustálym pingovaním serverov v pravidelných intervaloch a má schopnosť preskočiť servery, ktoré nie sú aktívne.

Okrem toho implementuje aj istič na filtrovanie serverov na základe zadaných kritérií.

Vzor ističa minimalizuje dopad zlyhania servera na výkon rýchlym odmietnutím požiadavky na zlyhávajúci server bez čakania na vypršanie časového limitu. Túto funkciu ističa môžeme deaktivovať nastavením vlastnosti niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped do nepravdivé.

Keď sú všetky servery nefunkčné, žiadny server nie je k dispozícii na vybavenie žiadosti, pingUrl () zlyhá a dostaneme výnimku java.lang.IllegalStateException so správou „Na vybavenie žiadosti nie sú k dispozícii žiadne inštancie.“.

8. Záver

V tomto článku sme diskutovali o rozhraní Netflix Ribbon API a jeho implementácii v jednoduchej ukážkovej aplikácii.

Celý zdrojový kód pre príklad opísaný vyššie nájdete v úložisku GitHub.


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