一、简介
-
Feign 是声明式的 web service 客户端,它让微服务之间的调用变得更简单,类似 controller 调用 service。
-
Spring Cloud 集成了 Ribbon 和 Eureka,可在使用 Feign 时提供负载均衡的 http 客户端。
-
只需要创建一个接口,然后添加注解即可。
Feign 能干什么?
- Feign 旨在使编写 Java Http 客户端变得更容易。
- 前面在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 Http 请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign 在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。
- 在 Feign 的实现下,我们只需要创建一个接口并使用注解的方式来配置它(类似于以前 Dao 接口上标注 Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解即可。
- 简化了使用 Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
Feign 集成了 Ribbon
利用 Ribbon 维护了 springcloud 的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与 Ribbon 不同的是,通过 Feign 只需要定义服务绑定接口且以声明式的方法,优雅而且简单的实现了服务调用。
二、使用步骤
(1)新建 springcloud-consumer-dept-feign
将 springcloud-consumer-dept-80 的内容都拷贝到 feign 项目中,修改对应名称。
(2)修改 pom.xml , 添加对 Feign 的支持
<!--Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
(3)修改 springcloud-api 工程
新建 Service 包,编写接口 DeptClientService,并增加新的注解 @FeignClient
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
@GetMapping("/{id}")
Dept getDeptById(@PathVariable("id") int id);
@GetMapping("/")
List<Dept> getAll();
@PostMapping("/")
boolean addDept(Dept dept);
}
(4)springcloud-consumer-dept-feign 工程修改 Controller,添加上一步新建的 DeptClientService
@RestController
public class DeptConsumerController {
@Resource
private DeptClientService deptClientService;
@GetMapping("/{id}")
public Dept getDeptById(@PathVariable("id") int id){
return this.deptClientService.getDeptById(id);
}
@GetMapping("/")
public List getAll(){
return this.deptClientService.getAll();
}
@PostMapping("/")
public boolean addDept(Dept dept){
return this.deptClientService.addDept(dept);
}
}
(5)修改主启动类,开启 Feign 使用
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.wlgzs.springcloud"})
public class DeptConsumer_feign {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_feign.class,args);
}
}
三、小结
- Feign 通过接口的方法调用 Rest 服务 ( 之前是 Ribbon+RestTemplate )。
- 该请求发送给 Eureka 服务器。
- 通过 Feign 直接找到服务接口,由于在进行服务调用的时候融合了 Ribbon 技术,所以也支持负载均衡作用!
- feign 其实不是做负载均衡的,负载均衡是 ribbon 的功能,feign 只是集成了 ribbon 而已。
- feign 的作用是替代 RestTemplate,性能比较低,但是可以使代码可读性变强。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于