Статьи

Клиент Spring Cloud Rest с лентой Netflix — Основы

В одном из предыдущих постов в блоге я рассказал о различных возможностях REST-клиента в мире Spring Cloud . Все параметры охватывают компонент Netflix OSS, называемый Ribbon, который управляет аспектами, связанными с балансировкой нагрузки между вызовами между различными экземплярами, на которых размещается служба, обработкой отказов, тайм-аутов и т. Д. Здесь я расскажу о нескольких способах настройки поведения базовых компонентов Ribbon, когда используется с Spring Cloud и дополните его более обширными настройками.

Создание отдыха клиента

Напомним, сначала рассмотрим случай, когда нужно вызвать простой сервис:

SampleServiceCall

Типичный способ сделать этот вызов с использованием Spring — это вставить в RestTemplate и использовать его для выполнения этого вызова следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public class RestTemplateBasedPongClient implements PongClient {
 
    @Autowired
    private RestTemplate restTemplate;
 
    @Override
    public MessageAcknowledgement sendMessage(Message message) {
        String pongServiceUrl = "http://serviceurl/message";
        HttpEntity<Message> requestEntity = new HttpEntity<>(message);
        ResponseEntity<MessageAcknowledgement> response =  this.restTemplate.exchange(pongServiceUrl, HttpMethod.POST, requestEntity, MessageAcknowledgement.class, Maps.newHashMap());
        return response.getBody();
    }
 
}

Здесь нет ничего особенного. Однако при использовании Spring Cloud один и тот же код ведет себя по-разному, теперь RestTemplate внутренне использует библиотеки ленты Netflix OSS для выполнения вызова. Это помогает, поскольку типичный поток вызовов состоит в том, чтобы сначала найти экземпляры, выполняющие службу, а затем распределить между вызовами нагрузки и поддерживать это состояние.

Отдых клиента с лентой

Позвольте мне немного отвлечься, чтобы коснуться ленты. В ленте используется абстракция, называемая «Именованный клиент», для управления поведением вызова удаленной службы — имя, под которым служба зарегистрирована в Eureka, время ожидания для вызовов службы, сколько повторных попыток в случаи сбоев и т. д. Они указываются в файлах конфигурации, и записи, как правило, располагаются в этих строках, обратите внимание, что здесь «именованный клиент» — это «samplepong», а свойства имеют префикс:

1
2
3
4
5
6
7
8
9
samplepong.ribbon.MaxAutoRetries=2
samplepong.ribbon.MaxAutoRetriesNextServer=2
samplepong.ribbon.OkToRetryOnAllOperations=true
samplepong.ribbon.ServerListRefreshInterval=2000
samplepong.ribbon.ConnectTimeout=5000
samplepong.ribbon.ReadTimeout=90000
samplepong.ribbon.EnableZoneAffinity=false
samplepong.ribbon.DeploymentContextBasedVipAddresses=sample-pong
samplepong.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList

Возвращаясь к Spring Cloud, он очень умно поддерживает концепцию «именованного клиента» через имя хоста Url, поэтому вызов RestTemplate теперь будет выглядеть так:

1
ResponseEntity<MessageAcknowledgement> response =  this.restTemplate.exchange("http://samplepong/message", HttpMethod.POST, requestEntity, MessageAcknowledgement.class, Maps.newHashMap());

«Samplepong» в URL-адресе — это «именованный клиент», и любую настройку поведения базовой ленты можно выполнить, указав свойства с помощью этого префикса. Поскольку это приложения Spring Cloud, свойства могут быть точно определены в формате yaml по следующим строкам:

1
2
3
4
5
samplepong:
  ribbon:
    DeploymentContextBasedVipAddresses: sample-pong
    ReadTimeout: 5000
    MaxAutoRetries: 2

Вывод

Это охватывает основы того, как Spring Cloud абстрагирует базовые библиотеки Ribbon, чтобы обеспечить интуитивно понятный интерфейс для выполнения вызовов удаленных служб в облачной среде. Я рассмотрел некоторые детали некоторых настроек, о которых я расскажу в новом посте.

Ссылка: Spring Cloud Rest Client с Netflix Ribbon — основы от нашего партнера JCG Биджу Кунджуммена в блоге « все и вся» .