Статьи

Отдых клиентских звонков с Spring Cloud

Есть несколько интересных способов сделать клиентские вызовы REST с проектом Spring-Cloud . Поддержка отдыха Spring-Cloud основана на базовых библиотеках Netflix OSS, но абстрагирует их и упрощает использование библиотек.

RestTemplate

В качестве первого шага рассмотрим традиционный способ выполнения вызовов Rest через приложения на базе Spring с использованием RestTemplate :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class RestTemplateIntegrationTest {
 
    @Autowired
    private RestTemplate restTemplate;
 
    @Test
    public void testCallPongService() {
        ResponseEntity<MessageAcknowledgement> ack =
                restTemplate.exchange("http://servicehost/message",
                        HttpMethod.POST,
                        new HttpEntity<>(new Message("test", "hello")),
                        MessageAcknowledgement.class,
                        Collections.emptyMap());
        assertThat(ack.getBody().getPayload(), equalTo("Pong From Configuration Server"));
    }
}

В этом конкретном случае ожидается, что хост-часть URL-адреса будет полностью известна клиенту, а RestTemplate позаботится о том, чтобы упорядочить Java-объект для соответствующего типа мультимедиа, сделать вызов REST и отменить ответ обратно Java-объекту. ,

RestTemplate с лентой и эврикой

Netflix Ribbon предоставляет библиотеку для выполнения вызовов на основе REST, в то время как с RestTemplate хост, как ожидается, будет полностью известен клиенту, а с Ribbon хост обычно разрешается через централизованный сервер Netflix Eureka, а Ribbon заботится о балансировке нагрузки вызовов, если Для службы найдено несколько хостов. Если в пути к классам присутствуют библиотеки Spring-cloud и библиотеки, связанные с Ribbon, то Spring-Cloud расширяет RestTemplate так, чтобы он основывался на Ribbon, без дополнительной настройки, с Spring-Cloud на месте, вызов будет точно таким же, как раньше, с несколькими поворотами ,

1
2
3
4
5
6
ResponseEntity<MessageAcknowledgement> ack =
        restTemplate.exchange("http://sample-pong/message",
                HttpMethod.POST,
                new HttpEntity<>(new Message("test", "hello")),
                MessageAcknowledgement.class,
                Collections.emptyMap());

Суть в том, что имя хоста, которое в данном случае «sample-pong», является значительным, это не реальное имя хоста — вместо этого делается попытка найти список серверов с этим именем в качестве имени регистрации в Eureka и результирующий хост / порт используется для выполнения запроса.

Если требуются настройки, именованный клиент может быть снабжен специальными свойствами ленты, указанными для именованного клиента, по следующим направлениям:

1
2
3
4
5
6
ResponseEntity<MessageAcknowledgement> ack =
        restTemplate.exchange("http://samplepong/message",
                HttpMethod.POST,
                new HttpEntity<>(new Message("test", "hello")),
                MessageAcknowledgement.class,
                Collections.emptyMap());

Названный клиент выше — это «samplepong», а свойства ленты для этого клиента следующие:

1
2
3
4
5
6
samplepong:
  ribbon:
    DeploymentContextBasedVipAddresses: sample-pong
    NIWSServerListClassName: com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
    ReadTimeout: 5000
    MaxAutoRetries: 2
  • Если вы заинтересованы в более низкоуровневых конфигурациях для ленты, обратитесь сюда

Лента — это довольно сложный низкоуровневый способ выполнения вызова REST. RestTemplate абстрагирует реализацию ленты и облегчает ее просмотр с точки зрения клиентов.

Netflix Feign

Netflix Feign — это еще один упрощенный способ звонить в службы на основе REST, все, что ему требуется, — это интерфейс с соответствующими аннотациями, который лучше всего продемонстрировать на примере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import org.bk.consumer.domain.Message;
import org.bk.consumer.domain.MessageAcknowledgement;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@FeignClient("samplepong")
public interface PongClient {
 
    @RequestMapping(method = RequestMethod.POST, value = "/message",
            produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    MessageAcknowledgement sendMessage(@RequestBody Message message);
}

Однако аннотации специфичны для Spring, Spring-Cloud облегчает это, добавляя кодеры и декодеры, которые поддерживают аннотации Spring MVC.

@FeignClient аннотация на интерфейсе идентифицирует этот код FeignClient. @EnableFeignClients требуется в конфигурации Spring для загрузки всех таких FeignClient.

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class PingApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(PingApplication.class, args);
    }
}

Ресурсы

Ссылка: Позвоните отдыхающим с помощью Spring Cloud от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.