用于替代RestTemplate,解决RestTemplate暴露url和url参数多不好写的问题。
Feign会自动做负载均衡,因为集成了Ribbon。
添加依赖:
org.springframework.cloud
spring-cloud-starter-openfeign
在启动类上添加注解:
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
使用RestTemplate时的Service:
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
Order order = orderMapper.findById(orderId);
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
return order;
}
使用Feign去替代后:
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
Order order = orderMapper.findById(orderId);
User user = userClient.findById(order.getUserId());
order.setUser(user);
return order;
}
在使用 Spring Cloud 和 Feign 时,Feign 提供了四个日志级别来打印不同详细程度的 HTTP 请求和响应详情。以下是 Feign 日志的四个级别:
1. **NONE(无)**:
- 这是默认级别。
- 不记录任何日志信息。
2. **BASIC(基础)**:
- 只记录请求方法和 URL 以及响应状态码和执行时间。
3. **HEADERS(头信息)**:
- 记录基础信息以及请求和响应的头信息。
4. **FULL(完全)**:
- 记录请求和响应的头信息、正文和元数据。
设置全局feign日志级别:
feign:
client:
config:
default: # 全局
loggerLevel: FULL
设置某个日志服务feign日志级别:
feign:
client:
config:
userservice: #只针对这个服务
loggerLevel: FULL
方法二:
feign默认的客户端实现是不支持连接池的,但是他支持三种客户端,这里配置HttpClient的。
feign:
client:
config:
default:
loggerLevel: BASIC
httpclient:
enabled: true # 启用httpclient
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 每个路径的最大连接数
缺点:耦合度太高,Spring MVC的方法参数是继承不下来的。
缺点:本来只需要几个接口,结果把整个微服务所需的接口都引用进来了。
但是这种方法创建一个新的模块,并用maven引入,在其它模块使用feignclient时会发现spring找不到fegin这个Bean,有两种解决方法,推荐第二种。