一、快速使用
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在启动类上添加注解开启Feign的功能
@MapperScan("cn.ylf.order.mapper")
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
- 创建一个声明接口
package cn.ylf.order.clients;
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author ylf
* @version 1.0
*/
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable Long id);
}
- 发送请求
@Service
public class OrderService {
@Autowired private OrderMapper orderMapper;
@Autowired private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 用Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.封装user对象到order
order.setUser(user);
// 4.返回
return order;
}
}
二、自定义配置日志文件
- 第一种,配置文件方式
feign:
client:
config:
default: # 这里写default就是全局默认配置,如果写服务器名就是针对某个服务器的
loggerLevel: FULL #日志级别
- 第二种
先声明一个bean
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
然后在@FeignClient或者@EnableFeignClients加上
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
@FeignClient是针对某个服务,@EnableFeignClients是全局
三、Feign优化
优化:
- 日志级别尽量用basic
- 使用HttpClient或OKHttp代替URLConnection
- 引入HttpClient依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
- 配置连接池
feign:
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
四、Feign最佳实践
- 第一种,让controller和FeignClient继承同一个接口
- 第二种,将FeignClient,POJO,Feign的默认配置都定义到一个项目中,供所有消费者使用
第二种实现方式:
- 首先创建一个module,命名为feign-api,然后引入feign的依赖
- 将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中
- 在order-service中引入feign-api的依赖
- 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:指定FeignClient字节码
@EnableFeignClients(clients = {UserClient.class})