Въведение в Spring Cloud Rest Client с лентата Netflix

1. Въведение

Лентата на Netflix е библиотека за облаци между процесите на комуникация (IP Process). Лентата предоставя предимно алгоритми за балансиране на натоварването от страна на клиента.

Освен алгоритмите за балансиране на натоварването от страна на клиента, Ribbon предлага и други функции:

  • Service Discovery Integration - лентовите балансиращи устройства осигуряват откриване на услуги в динамична среда като облак. Интеграцията с компонента за откриване на услугата Eureka и Netflix е включена в лентовата библиотека
  • Толерантност към неизправности - API на лентата може динамично да определи дали сървърите работят и работят в жива среда и може да открие тези сървъри, които не работят
  • Конфигурируеми правила за балансиране на натоварването - Лентата поддържа RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule от кутията и също така поддържа дефиниране на персонализирани правила

Ribbon API работи въз основа на концепцията, наречена „Име клиент“. Докато конфигурираме лентата в нашия конфигурационен файл на приложението, ние предоставяме име за списъка със сървъри, включени за балансиране на натоварването.

Нека го вземем за въртене.

2. Управление на зависимостта

API на лентата Netflix може да бъде добавен към нашия проект, като добавите зависимостта по-долу към нашия pom.xml:

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

Най-новите библиотеки можете да намерите тук.

3. Примерно приложение

За да видим работата на Ribbon API, ние създаваме примерно приложение за микросервиз с Spring RestTemplate и го подобряваме с API на лентата Netflix заедно с API на Cloud Cloud Netflix.

Ще използваме една от стратегиите за балансиране на натоварването на лентата, WeightedResponseTimeRule , за да дадем възможност за балансиране на натоварването от страна на клиента между 2 сървъра, които са дефинирани под име на клиента в конфигурационния файл, в нашето приложение.

4. Конфигурация на лентата

Ribbon API ни позволява да конфигурираме следните компоненти на балансиращия товар:

  • Правило - Логически компонент, който определя правилото за балансиране на натоварването, което използваме в нашето приложение
  • Ping - Компонент, който определя механизма, който използваме за определяне на наличността на сървъра в реално време
  • ServerList - може да бъде динамичен или статичен. В нашия случай използваме статичен списък със сървъри и следователно ги дефинираме директно в конфигурационния файл на приложението

Нека напишем проста конфигурация за библиотеката:

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

Забележете как използвахме правилото WeightedResponseTimeRule за определяне на сървъра и механизма PingUrl за определяне на наличността на сървъра в реално време.

Според това правило на всеки сървър се дава тегло според средното му време за реакция, по-малкото време за реакция дава по-малко тегло. Това правило избира произволно сървър, където възможността се определя от теглото на сървъра.

И PingUrl ще пинг на всеки URL, за да определи наличността на сървъра.

5. заявление.имм

По-долу е конфигурационният файл application.yml , който създадохме за това примерно приложение:

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

В горния файл посочихме:

  • Име на приложението
  • Номер на порта на приложението
  • Име на клиента за списъка със сървъри: “ping-server”
  • Деактивиран компонент за откриване на услугата Eureka, като зададете eureka: enabled на false
  • Определи списъка със сървъри, налични за балансиране на натоварването, в този случай 2 сървъра
  • Конфигуриран процент на опресняване на сървъра с ServerListRefreshInterval

6. RibbonClient

Нека сега настроим основния фрагмент на компонента на приложението - където използваме RibbonClient, за да активираме балансирането на товара вместо обикновения 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); } }

Дефинирахме клас на контролер с анотацията @RestController ; ние също коментирахме класа с @RibbonClient с име и клас за конфигурация.

Класът на конфигурация, който дефинирахме тук, е същият клас, който дефинирахме преди, в който предоставихме желаната конфигурация на лентата API за това приложение.

Забележете, че ние също коментирахме RestTemplate с @LoadBalanced, което предполага, че искаме това да бъде балансирано на натоварване и в този случай с лента.

7. Устойчивост на повреди в лентата

Както обсъждахме по-рано в тази статия, Ribbon API не само предоставя алгоритми за балансиране на натоварването от страна на клиента, но също така има вградена устойчивост на повреди.

Както беше посочено по-горе, Ribbon API може да определи наличността на сървъра чрез постоянното пингване на сървъри на редовни интервали и има възможност да пропуска сървърите, които не са активни.

В допълнение към това, той също така прилага Circuit Breaker pattern за филтриране на сървърите въз основа на определени критерии.

Моделът на прекъсвача намалява въздействието на отказ на сървъра върху производителността, като бързо отхвърля заявка към този сървър, която е неуспешна, без да изчака изчакване. Можем да деактивираме тази функция на прекъсвача, като зададем свойството niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped на false .

Когато всички сървъри не работят, поради което няма наличен сървър, който да обслужва заявката, pingUrl () ще се провали и ще получим изключение java.lang.IllegalStateException със съобщение „Няма налични екземпляри за обслужване на заявката“ .

8. Заключение

В тази статия обсъдихме приложния програмен интерфейс (API) на Netflix Ribbon и неговото внедряване в просто примерно приложение.

Пълният изходен код за описания по-горе пример може да бъде намерен в хранилището на GitHub.