Feign的个人理解
Feign在英文中是"装"的意思,但在微服务中他是远程调用的一种方式,我的理解是:他替代了RestTemplate+Nacos中的URL编码的方式,显得很高大上,所以很装:(声明式事务,只需要在Spring中把需要发请求的信息声明出来,剩下的交给"Feign装"帮你搞定)
![](https://img-blog.csdnimg.cn/direct/e04d67323d7b489382cbad91191b47e1.png)
Feign的使用
步骤很简单,首先我们需要引入依赖,然后再启动类上开启注解,编写Feign的客户端。部分代码对比:不难发现我们只需要少量的XXClient就可以替代大量的URL地址代码。
<!--Feign的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
![](https://img-blog.csdnimg.cn/direct/ee9faa663a4b44f89dcde5f1b3d25597.png)
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用UserClient发送请求
User user = userClient.findById(order.getUserId());
//3.封装user到order中去
order.setUser(user);
// 4.返回
return order;
}
/*@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用RestTemplate发送请求
String url = "http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
//3.封装user到order中去
order.setUser(user);
// 4.返回
return order;
}*/
再Feign的内部集成了Ribbon,所以不需要担心负载均衡的问题
除此之外Feign还给我们提供了许多默认配置,包括我们可以自定义的一些常用配置:
![](https://img-blog.csdnimg.cn/direct/191ca05980484f4598cb587a25119e51.png)
feign.Logger.Level中NONE:没有日志信息(默认),BASIC:Http请求的开始时间结束时间和持续时间等基本信息,HEADDERS:除了记录请求的基本信息之外还给你记录下请求头和响应头信息,FULL:记录所有的信息
修改配置文件来达到修改日志级别的效果和使用Java代码来实现修改日志级别的效果
![](https://img-blog.csdnimg.cn/direct/a5c2fc3781074b1780c0f7b0112218c6.png)
方式二:注释掉方式一的前提下我们先创建一个config类:
![](https://img-blog.csdnimg.cn/direct/2e994364560740d48a6fcb9951977830.png)
然后我们可以选择不同的作用范围:作用在@FeignClient注解里面表示配置在当前服务器生效
![](https://img-blog.csdnimg.cn/direct/e9b3fdc1a600451c8ae2d1489114e84e.png)
作用在启动类上的@EnableFeignClients上代表作用在全局
![](https://img-blog.csdnimg.cn/direct/5e69719b4f9f4bc0b8eada1e7027ff41.png)
以上的记录日志会消耗一定的性能。
自然而然我们也会有相应的性能优化:
主要是通过连接池的配置来实现的
还是老样子,我们首先要引入依赖,然后再配置文件中配置连接池
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件:
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
Feign的最佳实践:
第一种:继承(面向契约的思想,紧耦合)
![](https://img-blog.csdnimg.cn/direct/5d2be46f08ff467d8ba850ec5aa73589.png)
第二种:抽取(松耦合,但相对可能会引入不需要的依赖)
![](https://img-blog.csdnimg.cn/direct/11751e59c87942a892acfe48c381de4e.png)
![](https://img-blog.csdnimg.cn/direct/dc9aa5a18bd3414e95cc1f5114cbe9f8.png)
具体实现:
![](https://img-blog.csdnimg.cn/direct/fe732b6a2354434da775597b15433400.png)