Feign详解与使用
一、什么是Feign
1、概念
学过了Ribbon和Hystrix的读者都知道,Ribbon实现客户端负载均衡是通过拦截RestTemplate进行相应的处理。而RestTemplate已经对Http请求进行了一系列模板式的封装,我们使用的时候,通常会基于RestTemplate进行封装,形成相应的业务接口。
但是,这个封装业务接口的过程,需要一定的工作量;如果能有声明式的调用那么就能在开发中大大减少开发量。于是,出现了Feign,这是基于Netflix Feign开源组件进行适配SpringMVC,添加了注解支持(一些地方会有小许差别)的组件,该组件即有客户端负载均衡的功能,也有熔断器的服务降级等功能。
在我看来,它最大的好处是基于声明式开发方式,能够使得代码优雅、简洁,开发量小。
2、实现依赖
上面,我们说了,它拥有客户端负载均衡、熔断器的服务降级等功能,那么,它是怎么实现的呢?其实,它是将Ribbon和Hystrix作为底层支持,进行高层封装,并且整合SpringMVC等功能实现的一个组件。
- Ribbon
- Hystrix
以上两个组件就是Feign的实现依赖。
二、Feign的使用
接下来,讲讲Feign的使用。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 启动类注册Bean
//添加这个注解
@EnableFeignClients
上面我一直在强调,Feign是声明式开发,接下来,就展示一下使用Feign的声明式开发究竟有多少优雅、简洁。
- 基于Feign的声明式开发可以分为如下三步:
- 创建业务消费接口
- 根据相应的消费接口进行参数的绑定
- 调用业务接口
创建业务接口:
@FeignClient(value = "provider")
public interface FeignService {
/**
* to server
*
* @return s
*/
@GetMapping("/zone")
String feignService();
/**
* @param id 通过参数请求
* @return 用户信息
*/
@GetMapping("/queryUserById")
User queryUserById(@RequestParam("id") String id);
}
//用户类
public class User {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
//以下是在控制层调用对应的业务方法
@AutoWired
private FeignService service;
@GetMapping("/consumer")
public String test() {
return service.feignService();
}
以上的例子就是feign在微服务中的入门级别应用,当然,Feign的使用是基于Ribbon和Hystrix,那么,我们是无需对Feign进行单独配置,只需要修改对应的Ribbon和Hystrix的配置即可。如果对于那两个组件不熟悉,可以看我关于那两个组件的文章,里面讲解得足够详细。
三、Feign配置
- 客户端配置
//这是最简单的客户端指定服务配置
@FeignClient(value = "provider")
- 客户端指定fallBack(服务降级)
//指定fallBack属性的实现类
@FeignClient(value = "provider",fallback = HystrixServiceCompenent.class)
public interface FeignService {
//这里要注意,value属性名不能省略,虽然在MVC中可以,但是在feign中不行。
@GetMapping(value="/zone")
String feignService();
@GetMapping(value="/queryUserById")
User queryUserById(@RequestParam String id);
}
//以下就是实现服务降级的组件。
@Component
publ