几种不同的服务消费方式
# 几种不同的服务消费方式
上文中我们使用RestTemplate进行了服务的调用,还有其他的方式进行
Nacos Discovery 适配了 Netflix Ribbon,可以使用 RestTemplate 或 OpenFeign 进行服务的调用,或者WebClient(Spring 5中引入的)
# RestTemplate
@Configuration
public class AppConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2
3
4
5
6
7
8
9
controller
@GetMapping(value = "/test/{str}")
public String echo(@PathVariable String str) {
System.out.println("path-str is:"+str);
return restTemplate.getForObject("http://127.0.0.1:8809/hello/" + str, String.class);
}
2
3
4
5
上述代码getForObject()
,第一个参数是 url ,第二个参数是接口返回的数据类型。
# Feign
- 在之前的基础上,引入对应pom坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2
3
4
- 配置feign实例 并通过注解
@FeignClient
来指定这个接口所要调用的服务名称
@FeignClient("service-provider")
public interface FeignConfig {
@GetMapping("/hello/{echo}")
String echoHello(@PathVariable("echo")String echo);
// 服务提供者--提供的接口
}
2
3
4
5
6
7
8
上述的接口,service-provider
,就是你注册到服务中心的微服务名称,下方的接口echoHello()
,就是服务注册中心-微服务service-provider
中对应的接口,请注意接口对应的返回值也要一致。
- 在启动类开启通过
@EnableFeignClients
注解开启扫描Spring Cloud Feign客户端的功能
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
2
3
4
5
6
7
8
- 进行服务调用 controller
@RestController
public class TestController {
@Autowired
FeignConfig feignConfig;
@GetMapping("/vc")
public String test() {
String result = feignConfig.echoHello("didi");
return "Return : " + result;
}
}
2
3
4
5
6
7
8
9
10
11
12
# WebClient
因为是使用的webflux下的webClient,因此需要引入新的pom坐标
- 引入webflux
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2
3
4
- 配置webClient
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
2
3
4
5
- controller——进行服务消费
@GetMapping(value = "/day")
public Mono<String> demo(){
System.out.println("使用WebClient 进行服务消费");
Mono<String> stringMono = webClientBuilder.build()
.get()
.uri("http://service-provider/hello/dev")
.retrieve()
.bodyToMono(String.class);
return stringMono;
}
2
3
4
5
6
7
8
9
10
# 总结
其中最常用的是RestTemplate
跟Feign
,它们各自的区别如下:
Feign:Feign是一个声明式的Web Service客户端(Feign是由Netflix公司开发的一个声明式的HTTP客户端),用于简化服务之间的通信。它使得写HTTP客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解支持,包括Feign注解和JAX-RS注解。
它有如下优点:
- 使用简单,进行服务消费可以像调用本地方法一般
- 支持自动处理异常:Feign可以自动处理异常,减少编写代码的工作量
- 支持负载均衡:Feign可以自动进行负载均衡,提高服务的可用性和性能
使用Spring Cloud Alibaba进行Feign调用时,需要引入以下POM文件依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>版本号</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>版本号</version>
</dependency>
2
3
4
5
6
7
8
9
10
RestTemplate:RestTemplate是Spring MVC中的一部分,用于发送HTTP请求。在Spring Cloud中,RestTemplate也可以用于微服务之间的通信。RestTemplate的缺点是需要手动处理异常,这可能会导致代码变得复杂。虽然RestTemplate的编程方式比Feign更低级一些,但是它具有更强的定制性。
更强的定制型体现为:RestTemplate提供了更多的API来设置请求和响应的细节,可以进行更细粒度的定制
- 提供了setRequestHeader()方法来设置请求头
- 提供了setEntity()方法来设置请求体
- 提供了getResponseBody()方法来获取响应体等