引言
本篇博客简单介绍 Feign 的基础知识和基本应用,以前一篇博客《Spring Cloud Alibaba——Nacos实现服务治理》为代码基础,实现更简单的微服务调用方式。
一、什么是Feign
restTemplate 实现的微服务调用方式:
// 调用商品微服务,查询商品信息
Product prod = restTemplate.getForObject("http://" + prodService.getHost() + ":" + prodService.getPort() + "/product/" + pid, Product.class);
依然存在一些不尽如人意的地方:
1、代码可读性不好
2、编码风格不统一。调用本地服务使用 @Autowired 注入的方式,而调用远程的服务是使用 restTemplate 调用。
基于以上两点问题,就出现了新的 Spring Cloud 组件 —— Feign。
Feign 是 Spring Cloud 提供的一个声明式伪 HTTP 客户端。它使得调用远程服务就像调用本地服务一样优雅,只需要创建一个接口并添加一个注解即可。
Nacos 很好的兼容了 Feign ,Feign 默认集成了 Ribbon,所以在 Nacos 下使用 Feign 默认就实现了负载均衡的效果。
二、Feign 的使用
微服务调用关系图:
上图中微服务调用关系是 通过 订单微服务 调用 商品微服务 查询商品信息,因此关于 Feign 的相关编码也都是在 shop-order 微服务上。
1、添加 Feign 依赖
<!--Feign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在主类上添加 @EnableFeignClients 注解
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {...
3、创建 Feign 接口类
@FeignClient("service-product")
public interface ProductService {@GetMapping("/product/{pid}")public Product findByPid(@PathVariable("pid") Integer pid);
}
4、将调用方式从 restTemplate 改为 Feign:
然后启动订单和商品微服务,请求http://localhost:8091/order/prod/{pid} 接口发送下单请求:
可以看到商品信息无误,说明订单微服务已经成功获取到商品信息。
说明,以上案例的代码做了大量的省略,主要是去掉了一些数据库操作和配置等不必要的编码展示,具体操作都已经写在《Spring Cloud Alibaba——Nacos实现服务治理》中。