使用方法
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在启动类上加@EnableFeignClients的注解表示支持feign
3、创建一个interface作为外部url的接口
建议一个远程服务创建一个interface,这样逻辑更加清楚而且可以给不同的服务进行不同的配置。
下面这个接口UserFeign就用来处理userserver的接口。
UserFeign .interface
@Component
@FeignClient(value="userserver",configuration = FeignConfig.class)
public interface UserFeign {
@GetMapping("/getUserById/{userId}")
User getUserById(@PathVariable("userId") int userId);
}
Controller
自动注入userFeign并且调用接口来获取远程调用。
@Resource
UserFeign userFeign;
@GetMapping("/pushOrder/{orderId}")
public Map<String,Object> getOrderById(@PathVariable("orderId") int orderId){
Map<String,Object> map = new HashMap<>();
List<Order> orders = orderMapper.selectOrderById(orderId);
Order order = orders.get(0);
int userId = order.getUserId();
User user = userFeign.getUserById(userId);
map.put("order",order);
map.put("user",user);
return map;
}
feign的自定义配置
feign.logger.Level #日志等级
feign.codec.Decoder # 响应结果的解析器
feign.codec.Encoder # 请求参数编码
feign.Contract #支持的注解格式
feign.Retryer #失败重试机制
下面以日志的配置为例
1、方式一:通过配置文件
feign:
client:
config:
default: # default:对所有远程调用的配置,XXXservice:对特定远程调用的配置
loggerLevel: BASIC/NONE/FULL/HEADERS # 四种日志等级
2、通过配置类
FeignConfig
public class FeignConfig {
@Bean
public Logger.Level getFeignLoggerLevel(){
return Logger.Level.HEADERS;
}
}
注意下面的配置类并没有使用@Configuration注解,那他怎么生效呢?
- 对全局生效:将配置类作为参数放在@EnableFeignClients注解上,这个注解是位于启动器类的。
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
- 对局部生效,放在@FeignClient注解上,这个注解位于接口类上,一个接口代表一个远程服务。
@FeignClient(value="userserver",configuration = FeignConfig.class)
Feign性能优化
1、Feign底层客户端实现有三种
- URLCONNECTION:默认实现,不支持线程池
- Apche HttpClient:支持线程池
1、导入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2、配置
feign:
httpclient:
enabled: true # 开启httpclient
max-connections: 20 #最大连接数
max-connections-per-route: 5 #单个请求的最大连接
- OKHttp:支持线程池
使用有线程池的客户端会优化性能
2、使用日志级别为BASIC/NONE
feign最佳使用策略