Feign的个人理解
Feign在英文中是"装"的意思,但在微服务中他是远程调用的一种方式,我的理解是:他替代了RestTemplate+Nacos中的URL编码的方式,显得很高大上,所以很装:(声明式事务,只需要在Spring中把需要发请求的信息声明出来,剩下的交给"Feign装"帮你搞定)
Feign的使用
步骤很简单,首先我们需要引入依赖,然后再启动类上开启注解,编写Feign的客户端。部分代码对比:不难发现我们只需要少量的XXClient就可以替代大量的URL地址代码。
<!--Feign的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@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还给我们提供了许多默认配置,包括我们可以自定义的一些常用配置:
feign.Logger.Level中NONE:没有日志信息(默认),BASIC:Http请求的开始时间结束时间和持续时间等基本信息,HEADDERS:除了记录请求的基本信息之外还给你记录下请求头和响应头信息,FULL:记录所有的信息
修改配置文件来达到修改日志级别的效果和使用Java代码来实现修改日志级别的效果
方式二:注释掉方式一的前提下我们先创建一个config类:
然后我们可以选择不同的作用范围:作用在@FeignClient注解里面表示配置在当前服务器生效
作用在启动类上的@EnableFeignClients上代表作用在全局
以上的记录日志会消耗一定的性能。
自然而然我们也会有相应的性能优化:
主要是通过连接池的配置来实现的
还是老样子,我们首先要引入依赖,然后再配置文件中配置连接池
<!--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的最佳实践:
第一种:继承(面向契约的思想,紧耦合)
第二种:抽取(松耦合,但相对可能会引入不需要的依赖)
具体实现: