什么是Feign?
- Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。不用再拼接url,拼接参数等等操作,一切都交给Feign去做。
为什么要用Feign
- 简化 远程代码调用
- 不用Feign,需要编写类似的大量重复代码,格式基本相同,无非参数不一样
- 远程调用方式更优雅
怎么使用Feifn?
- 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 启动类加入注解
@EnableFeignClients // 开启Feign功能
- 定义客户端接口
@FeignClient("服务名")
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") integer id);
}
- 注入改接口,直接远程调用里面的访问方法.
附录:
-
RestTemplate注册可以被删除。Feign中已经自动集成了Ribbon负载均衡,因此不需要自己定义RestTemplate.
-
Feign中本身已经集成了Ribbon依赖和自动配置
- Ribbon全局配置:对所有服务都生效
# 加上服务名可以局部配置 ribbon: ConnectTimeout: 250 # 连接超时时间(ms) ReadTimeout: 1000 # 通信超时时间(ms) OkToRetryOnAllOperations: true # 是否对所有操作重试 MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数 MaxAutoRetries: 1 # 同一实例的重试次数
-
Hystix支持
- 默认情况关闭,手动开启
feign: hystrix: enabled: true # 开启Feign的熔断功能
- Fallback配置
- 定义一个类,实现FeignClient接口,作为fallback的处理类
@Component public class UserFeignClientFallback implements UserFeignClient { @Override public User queryUserById(Long id) { User user = new User(); user.setName("用户查询出现异常!"); return user; } }
- 然后在FeignClient接口中,指定编写的实现类
@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class) public interface UserFeignClient {
-
请求压缩
- GZIP压缩:
Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压啊 缩功能
feign:
compression:
request:
enabled: true # 开启请求压缩
response:
enabled: true # 开启响应压缩
同时,可以对请求的数据类型,以及触发压缩的大小下限进行设置:
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
注:上面的数据类型、压缩大小下限均为默认值。