简介
Feign是spring cloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。
feign的入门应用
user-consumer
- 依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- UserApplication
在主函数上添加**@EnableFeignClients** 注解
删除restTemplate的相关代码, 无需自己手动请求
- UserClient
添加feignclient, 这边feign就会替我们拼接 http://user-service/user/{id}的链接, 并请求
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}")
public User queryById(@PathVariable Integer id);
}
- UserController
不在使用我们之前的手动拼接服务的方式
@Autowired
private UserClient userClient;
@GetMapping("/{id}")
@HystrixCommand
public User queryById(@PathVariable Integer id){
if (id == 1) {
throw new RuntimeException("出现异常了");
}
User user = userClient.queryById(id);
return user;
}
- 启动
我们访问: http://127.0.0.1:8081/user/2 访问正常
feign的负载均衡
user-service
- UserController
添加一个带有睡眠时间的网络请求
/**
* 给feign的ribbon超时设置测试
* @param id
* @return
*/
@GetMapping("/timeout/{id}")
public User queryByIdTimeout(@PathVariable Integer id){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
User user = userService.queryById(id);
return user;
}
user-consumer
- 配置文件
设置了超时时间, 然后使用feign去请求, 超过2s的请求按理说都应该是错误的
# feign中ribbon的配置
ribbon:
ConnectTimeout: 1000 # 连接超时时长
ReadTimeout: 2000 # 数据通信超时时长
MaxAutoRetries: 0 # 当前服务器的重试次数
MaxAutoRetriesNextServer: 0 # 重试多少次服务
OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试
- UserClient
@GetMapping("/user/timeout/{id}")
public User queryByIdTimeout(@PathVariable Integer id);
- UserController
@GetMapping("/timeout/{id}")
@HystrixCommand
public User queryByIdTimeout(@PathVariable Integer id){
User user = userClient.queryByIdTimeout(id);
return user;
}
- 启动
我们发现 访问http://127.0.0.1:8081/user/timeout/2, 此时feign调用是超时的
feign的熔断
user-consumer
- 配置文件
开启Feign的熔断功能
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
- UserApplication
删除@EnableCircleBreak注解, 这个是我们之前单独使用hystrix时添加的注解
- UserClientFallback
编写服务降级类
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryById(Integer id) {
User user = new User();
user.setUid(-1);
return user;
}
@Override
public User queryByIdTimeout(Integer id) {
User user = new User();
user.setUid(-1);
return user;
}
}
- UserClient
修改注解, 指定fallback类
@FeignClient(value= "user-service", fallback = UserClientFallback.class)
- 启动
访问 http://127.0.0.1:8081/user/timeout/2, 我们发现返回是的
{"uid":-1,"username":null,"age":null,"gender":null}
feign的请求压缩
改造user-comsumer
- 配置文件
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
min-request-size: 2048 # 设置触发压缩的大小下限
response:
enabled: true
feign的日志记录
改造user-comsumer
- 配置文件
logging:
level:
top.itkaoti.user.feign: debug
- FeignConfig
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
//记录所有请求和响应的明细
return Logger.Level.FULL;
}
}
- UserClient
在@FeignClient 中添加 configruation配置
@FeignClient(value= "user-service", fallback = UserClientFallback.class, configuration = FeignConfig.class)
- 启动
访问 http://127.0.0.1:8081/user/2, 我们查看控制台