Spring Cloud Alibaba:常用的服务消费方式(RestTemplate、OpenFeign)
简介
通过上一篇博客,我们已经初次尝试的使用Nacos作为服务注册中心实现服务的注册与发现。在测试服务消费过程中,我们使用的是RestTemplate组件,但是这种方式相对而言会比较复杂,每次调用服务接口都需要指定服务id,调用接口路径,处理返回内容等,对于开发人员来说非常的不友好。所以本文主要记录常用的远程服务消费方式,主要有两种,分别是RestTemplate和OpenFeign,下面就来看看他们是怎么使用的把。
一、使用RestTemplate
使用RestTemplet能够方便的使用REST资源,RestTemplate提供了多种调用远程服务的便捷式方法。因为Spring Cloud Alibaba默认引用了Ribbon,所以使用RestTemplate不仅可以简单实现远程服务调用,同时如果给Bean ResttTemplate添加注解@LoadBalanced注解,它还具备负载均衡的功能。
主要使用方式如下所示:
@Autowired
@LoadBalanced
private RestTemplate restTemplate;
@GetMapping("sale")
public String sale() {
log.info("订单服务, 开始下单售卖商品");
String stockServiceName = "stock-service";
String stackUrl = String.format("http://stock-service/stock/allocation", stockServiceName);
String forObject = restTemplate.getForObject(stackUrl, String.class);
System.out.println(String.format("订单服务,商品完成售卖:%s", forObject));
return "订单服务,商品完成售卖";
}
测试使用情况:
二、使用OpenFeign
相较restTrmplet,Feign使用@FeignClient注解来指定接口,接口中定义的函数可以通过Spring MVC的注解来绑定服务提供方的REST接口。需要消费服务时,只需要直接调用对应方法即可。
2.1 在pom.xml中增加openfeign的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 定义Feign客户端
这里我主要定义库存服务的客户端,这里只写了基础用法,通过feign可以实现更多高级的功能,例如异常处理等。库存服务客户端代码如下:
/**
* @ClassName: RestTemplateDemoController
* @Description: RestTemplate方式实现远程调用
* @Author oyc
* @Date 2021年02月04日 9:03
* @Version 1.0
*/
@RestController
@RequestMapping("rest")
@Slf4j
public class RestTemplateDemoController {
@Autowired
@LoadBalanced
private RestTemplate restTemplate;
@GetMapping("sale")
public String sale() {
log.info("订单服务, 开始下单售卖商品");
String stockServiceName = "stock-service";
String stackUrl = String.format("http://stock-service/stock/allocation", stockServiceName);
String forObject = restTemplate.getForObject(stackUrl, String.class);
System.out.println(String.format("订单服务,商品完成售卖:%s", forObject));
return "订单服务,商品完成售卖";
}
}
2.3 使用Feign客户端
Feign客户端定义好了之后,可以直接将依赖注入使用,就像调用本地方法一样。使用案例代码如下:
/**
* @ClassName: OpenFeignDemoController
* @Description: OpenFeign 方式实现远程调用
* @Author oyc
* @Date 2021年02月04日 9:03
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("feign")
public class OpenFeignDemoController {
@Autowired
private StockOpenFeignClient stockClient;
@GetMapping("sale")
public String sale() {
log.info("订单服务, 开始下单售卖商品");
//使用openfeign方式实现对库存服务的远程调用,就行调用本地方法一样
String forObject = stockClient.sale();
System.out.println(String.format("订单服务,商品完成售卖:%s", forObject));
return "订单服务,商品完成售卖";
}
}