1. 概述
1.1. 简介
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。
- Feign 和 Ribbon 的区别
- Ribbon :是通过微服务的名字来调用微服务
- Feign : 是通过接口和注解来调用微服务
1.2. 作用
- Feign 旨在使得编写 Java Http 客户端变得更容易
- 在前面使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 Http 请求的封装处理,形成了一套模板化的调用方法。但是实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以, Feign 在此基础上,做了进一步封装,由它来帮助我们定义和实现依赖服务接口,在 Feign 的实现下,我们只需要创建一个接口,并使用注解的方式来配置它即可完成对服务提供方发接口绑定,简化了使用 SpringCloud Ribbon 时,自动封装服务调用客户端的开发量。
2. 使用
-
新建一个模块 :springcloud-03-consumer-dept-feign-8084
把前文中的 springcloud-03-consumer-dept-8082 模块的内容都复制过来(除了自定义负载均衡相关的)
修改一下端口号
-
在 SpringCloud-01-API-8080 和 springcloud-03-consumer-dept-feign-8084 两个项目中引入 Feign 的依赖
<!--Feign--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.0.RELEASE</version> </dependency>
-
在 SpringCloud-01-API-8080 模块中添加一个 service 包,以及一个 DeptClientService 接口
/** * @FeignClient 标注这是一个微服务,可以被调用 * * value : 微服务的名字 */ @Component @FeignClient(value = "SpringCloud-02-provider") public interface DeptClientService { /**增加 * @param dept * @return */ @PostMapping("/addDept") public boolean addDept(Dept dept); /** 按照 id 查询 * @param id * @return */ @GetMapping("/queryDeptById/{id}") public Dept queryDeptById(@PathVariable("id")Long id); /** 查询所有 * @return */ @GetMapping("/queryDepts") public List<Dept> queryDepts(); }
这里 Mapping 的路径,应该是提供者服务的请求路径
-
修改 springcloud-03-consumer-dept-feign-8084 项目的 controller
@RestController public class DeptConsumerController2 { @Autowired private DeptClientService service = null; @RequestMapping("/consumer/getDeptById/{id}") public Dept getDeptById(@PathVariable("id")Long id){ return this.service.queryDeptById(id); } @RequestMapping("/consumer/getDepts") public List<Dept> getDepts(){ return this.service.queryDepts(); } @RequestMapping("/consumer/addDept") public Boolean addDept(Dept dept){ return this.service.addDept(dept); } }
-
在 springcloud-03-consumer-dept-feign-8084 的启动类上添加一个 Feign 注解的扫描
//扫描 Feign 注解的包 @EnableFeignClients(basePackages = {"com.demo"})
-
启动测试
发送请求,得到结果