Есть несколько интересных способов сделать клиентские вызовы 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 = 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 = HttpMethod.POST, new HttpEntity<>( new Message( "test" , "hello" )), MessageAcknowledgement. class , Collections.emptyMap()); |
Суть в том, что имя хоста, которое в данном случае «sample-pong», является значительным, это не реальное имя хоста — вместо этого делается попытка найти список серверов с этим именем в качестве имени регистрации в Eureka и результирующий хост / порт используется для выполнения запроса.
Если требуются настройки, именованный клиент может быть снабжен специальными свойствами ленты, указанными для именованного клиента, по следующим направлениям:
1
2
3
4
5
6
|
ResponseEntity<MessageAcknowledgement> ack = 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 Документация
- Блог Джоша Лонга о регистрации и обнаружении микросервисов с помощью Spring Cloud и Eureka от Netflix
Ссылка: | Позвоните отдыхающим с помощью Spring Cloud от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry. |