1. Feign简介
Feign [feɪn] 译文 伪装。Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解。不再需要拼接URL,参数等操作。项目主页:https://github.com/OpenFeign/feign 。
2. 快速入门
使用Feign替代RestTemplate发送Rest请求。
实现步骤:
1. 导入feign依赖
2. 编写Feign客户端接口
3. 消费者启动引导类开启Feign功能注解
4. 访问接口测试
实现过程:
(1)导入依赖
在user-consumer
中添加spring-cloud-starter-openfeign
依赖
org.springframework.cloud
spring-cloud-starter-openfeign
(2)创建Feign客户端
在user-consumer
中创建com.itheima.feign.UserClient
接口,代码如下:
解释:
Feign会通过动态代理,帮我们生成实现类。
注解@FeignClient声明Feign的客户端,注解value指明服务名称
接口定义的方法,采用SpringMVC的注解。Feign会根据注解帮我们生成URL地址
注解@RequestMapping中的/user,不要忘记。因为Feign需要拼接可访问地址
(3)编写控制层
在user-consumer
中创建com.itheima.controller.ConsumerFeignController
,在Controller中使用@Autowired注入FeignClient,代码如下:
@RestController
@RequestMapping(value = "/feign")
public class ConsumerFeignController {
@Autowired
private UserClient userClient;
/****
* 使用Feign调用user-provider的方法
*/
@RequestMapping(value = "/{id}")
public User queryById(@PathVariable(value = "id")Integer id){
return userClient.findById(id);
}
}
(4)开启Feign
修改user-consumer
的启动类,在启动类上添加@EnableFeignClients
注解,开启Feign,代码如下:
(5)测试
请求
,效果如下:
3. 负载均衡
Feign自身已经集成了Ribbon,因此使用Feign的时候,不需要额外引入依赖。
Feign内置的ribbon默认设置了请求超时时长,默认是1000,可以修改
ribbon内部有重试机制,一旦超时,会自动重新发起请求。如果不希望重试可以关闭配置:
# 修改服务地址轮询策略,默认是轮询,配置之后变随机
user-provider:
ribbon:
#轮询
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
ConnectTimeout: 10000 # 连接超时时间
ReadTimeout: 2000 # 数据读取超时时间
MaxAutoRetries: 1 # 最大重试次数(第一个服务)
MaxAutoRetriesNextServer: 0 # 最大重试下一个服务次数(集群的情况才会用到)
OkToRetryOnAllOperations: false # 无论是请求超时或者socket read timeout都进行重试
4 熔断器支持
feign整合Hystrix熔断器
Feign默认也有对Hystrix的集成!
实现步骤:
1. 在配置文件application.yml中开启feign熔断器支持
2. 编写FallBack处理类,实现FeignClient客户端
3. 在@FeignClient注解中,指定FallBack处理类。
4. 测试
(1)开启Hystrix
在配置文件application.yml中开启feign熔断器支持:默认关闭
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
(2)熔断降级类创建
修改user-consumer
,创建一个类com.itheima.feign.fallback.UserClientFallback
,实现刚才编写的UserClient,作为FallBack的处理类,代码如下:
@Component
public class UserClientFallback implements UserClient{
/***
* 服务降级处理方法
* @param id
* @return
*/
@Override
public User findById(Integer id) {
User user = new User();
user.setUsername("Fallback,服务降级。。。");
return user;
}
}
(3)指定Fallback处理类
在@FeignClient注解中,指定FallBack处理类
(4)测试
关闭服务消费方,请求
,效果如下:
5 请求压缩
SpringCloudFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
通过配置开启请求与响应的压缩功能:
feign:
compression:
request:
enabled: true # 开启请求压缩
response:
enabled: true # 开启响应压缩
也可以对请求的数据类型,以及触发压缩的大小下限进行设置
# Feign配置
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
#以上数据类型,压缩大小下限均为默认值
6 Feign的日志级别配置
通过loggin.level.xx=debug来设置日志级别。然而这个对Feign客户端不会产生效果。因为@FeignClient注解修饰的客户端在被代理时,都会创建一个新的Feign.Logger实例。我们需要额外通过配置类的方式指定这个日志的级别才可以。
实现步骤:
1. 在application.yml配置文件中开启日志级别配置
2. 编写配置类,定义日志级别bean。
3. 在接口的@FeignClient中指定配置类
4. 重启项目,测试访问
实现过程:
(1)普通日志等级配置
在user-consumer
的配置文件中设置com.itheima包下的日志级别都为debug
# com.itheima 包下的日志级别都为Debug
logging:
level:
com.itheima: debug
(2)Feign日志等级配置
在user-consumer
中创建com.itheima.feign.util.FeignConfig
,定义日志级别
@Configuration
public class FeignConfig {
/***
* 日志级别
* @return
*/
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
日志级别说明:
Feign支持4中级别:
NONE:不记录任何日志,默认值
BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
HEADERS:在BASIC基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
(3)指定配置类
修改user-consumer
的com.itheima.feign.UserClient
指定上面的配置类,代码如下:
重启项目,即可看到每次访问的日志
Feign的作用:不再使用拼接URL的方式实现远程调用,以接口调用的方式实现远程调用,简化了远程调用的实现方式,增强了远程调用的功能,例如:增加了负载均衡、熔断、压缩、日志启用。
掌握Feign的使用过程
properties
1.引入Feign依赖包
2.创建Feign接口,feign接口中需要指定调用的服务名字
3.使用@EnabledFeignClients启用Feign功能
properties
在配置文件中配置
{spring.application.name}:ribbon:负载均衡属性配置
properties
1.在application.yml中开启Hystrix
2.给Feign接口创建一个实现类
3.给Feign指定fallback类
掌握Feign的压缩配置
properties
在application.yml中指定压缩属性即可
properties
1.在application.yml中开启普通日志等级
2.创建一个类,定义Feign日志等级
3.在Feign接口中指定定义日志的配置