从应用架构上,Spring Cloud 服务调用通常需要两个应用,一个为服务提供者 (Provider),一个为服务消费者(Consumer)。从技术上,传统的 Spring Cloud 服务通讯方式是基于 REST 实现的,包括两种内建实现方法,分别是 @LoadBalanced RestTemplate 以及 Open Feign,两者均作用于服务消费者,而服务提供者仅为 WebMVC 或者 WebFlux 应用(需注册到注册中心)。同时,还允许整合 Spring Cloud 负载均衡 API,实现自定义 REST 服务调用。
今天我们将使用RestTemplate来为大家演示如何进行服务调用
一、服务提供者添加 Web 服务
我们还在原来项目的基础上进行测试。在micro-provider应用的上ProviderController中增加web服务。
package com.gideon.provider.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class ProviderController {
@GetMapping("/provider")
public String provider(){
return "hello provider";
}
@GetMapping("/echo/{message}")
public String echo(@PathVariable("message") String message){
log.info("服务调用 message = {}", message);
return "echo: " + message;
}
}
二、消费着整合 RestTemplate 实现服务调用
- 在启动类中配置RestTemplate bean
package com.gideon.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class MicroConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MicroConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
-
消费应用micro-provider REST 服务/echo/{message}
服务调用成功。 -
我们将ip:port修改为服务名称测试调用
结果一致。
需要注意的是:如果我们在配置RestTemplate bean的时候不加@LoadBalanced注解的话,在调用的时候不能用服务名称。 具体原因可以参照我的下一篇Ribbon负载均衡