Feign替代了RestTemplate, 进行网络请求的封装, 更加符合面向接口编程的思想
快速集成
- pom.xml
<!--配置feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在调用工程中新增userservice接口
@FeignClient("provider-service") //参数为微服务提供者的application name
@RequestMapping("/user")
public interface UserService {
@RequestMapping("/findAll")
String findAll();
}
- Application类配置类上增加
@EnableFeignClients
注解 - 在Controller中使用
@Autowired
注解注入UserService, 通过userservice调动微服务的接口地址
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findAll")
private String findAll(){
return userService.findAll();
}
}
ps: Feign默认自动开起来轮询方式的负载均衡, 无需手动设置
Feign熔断器支持:
- 开启熔断器application.yml文件
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
- 新增fallback类, 实现feign的service接口
@Component //注意需要注入到spring容器
public class UserFallBack implements UserService {
@Override
public String findAll() {
//降级处理方法
return "用户不存在";
}
}
- FeignClient上声明降级类
fallback = UserFallBack.class
@FeignClient(value = "provider-service", fallback = UserFallBack.class) //参数为微服务提供者的application name
public interface UserService {
@RequestMapping("/user/findAll")
String findAll();
}
- 将调用服务停掉即可看到熔断效果
请求压缩和响应压缩
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 # 设置触发压缩的大小下限
#以上数据类型,压缩大小下限均为默认值
配置日志级别
- 在consumer的application.yml中配置只针对debug下开启 com.lily下的网络日志
# com.lily 包下的日志级别都为Debug
logging:
level:
com.lily: debug
- 新增Feign日志管理配置类
@Configuration
public class FeignConfiguration {
@Bean
public Logger.Level feignLoggerLevel(){
//全日志级别开启
return Logger.Level.FULL;
}
}
- 在FeignClient中进行配置:
configuration = FeignConfiguration.class
//value 参数为微服务提供者的application name
//fallback 配置熔断降级处理类
//configuration 配置feign日志级别管理类
@FeignClient(value = "provider-service", fallback = UserFallBack.class,
configuration = FeignConfiguration.class)
public interface UserService {
@RequestMapping("/user/findAll")
String findAll();
}
- 重启项目
ps: 基于feign调用接口时, 参数不能传递null, 否则会400
网友评论