Feign 可以将 RESTful API 的调用抽象为接口的方法,并通过注解来定义请求的 URL、HTTP 方法、请求头、请求体等信息。Feign 内部会根据这些注解生成具体的 HTTP 请求,并处理响应结果,将其映射为 Java 对象。
官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier
注意:可以替代restTemplate
一,Feign的使用
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.项目启动类中加入注解@EnableFeignClients
3.创建客户端
//描述user 模块相关的接口
@FeignClient(value = "userserver")
public interface UserClients {
//接口
//http://userserver/user/1
@GetMapping("/user/{id}")
public User queryById(@PathVariable("id") Long id);
}
4.替换restTemplate
package com.itgaohe.order.service;
import com.itgaohe.order.clients.UserClients;
import com.itgaohe.order.mapper.OrderMapper;
import com.itgaohe.order.pojo.Order;
import com.itgaohe.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
//原来
// @Autowired
// private RestTemplate restTemplate;
//替换后
@Autowired
private UserClients userClients;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.查询到了用户id
Long userId = order.getUserId();
//发起一个请求访问http://localhost:8081/user/5
//原来
// String url ="http://userserver/user/"+userId;
// User user = restTemplate.getForObject(url, User.class);
// 替换后
User user = userClients.queryById(userId);
//封装
order.setUser(user);
// 4.返回
return order;
}
}
二,Feign日志配置
1.配置文件方式
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别 一共四种
2.代码实现方式
创建一个Configuration并声明一个Bean
public class FeignConfig {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
@EnableFeignClients(defaultConfiguration = {FeignConfig.class})
①
如果在
@EnableFeignClients
注解声明则代表全局
②
如果在
@FeignClient
注解中声明则代表某服务
三,连接池依赖(性能优化)
1.引入依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.application.yml文件中配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
四,FeignClient优化
方法一(继承):1.服务紧耦合 2.父接口参数列表中的映射不会被继承 (不使用)
方法二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块
若出现扫描不到的情况:可以用
@EnableFeignClients(basePackages = {"包名"})