Feign

Feign替代RestTemplate

1.引入依赖

<!--Feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.启动类上添加注解

3.编写Feign客户端

package cn.itcast.order.client;

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;

@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id")Long id); }

4.Feign替代RestTemplate

@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2.远程查询User
    User user = userClient.findById(order.getUserId());
    // 3.存入order
    order.setUser(user);
    // 4.返回
    return order;
}

}


自定义配置

Feign可以支持很多的自定义配置,如下表所示:


一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。

下面以日志为例来演示如何自定义配置。

配置文件方式

基于配置文件修改feign的日志级别可以针对单个服务:

feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

也可以针对所有服务:

feign:
  client:
    config:
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL #  日志级别

而日志的级别分为四种:

  • NONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。


Feign使用优化

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

•URLConnection:默认实现,不支持连接池

•Apache HttpClient :支持连接池

•OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。

这里我们用Apache的HttpClient来演示。

(1).引入依赖

在order-service的pom文件中引入Apache的HttpClient依赖:

<!--httpClient的依赖 -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

(2).配置连接池

在order-service的application.yml中添加配置:

feign:
  httpclient:
    enabled: true  #开启feign对比httpClient的支持
    max-connections: 200  #最大连接数
    max-connections-per-route: 50  #每个路径的最大连接数

(3).总结,eign的优化:

1.日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection

① 引入feign-httpClient依赖

② 配置文件开启httpClient功能,设置连接池参数

实现基于抽取的最佳实践

抽取

1.创建一个Module,名为feign-api

2.引入依赖

      <!--feign的starter-->
        <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

3.然后,order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

DefaultFeignConfiguration


import feign.Logger;
import org.springframework.context.annotation.Bean;

/**

  • @Date: 2023/4/12 10:41
  • @author: Qeem */ public class DefaultFeignConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; // 日志级别为BASIC } }

在order-service中使用feign-api

1.order-service的pom文件中引入feign-api的依赖

 <!-- 自己写的feign-api依赖 -->
        <dependency>
            <groupId>cn.itcast.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

2.指定扫描包,有两种方式

方式一:

指定Feign应该扫描的包:

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方式二(推荐使用):

指定需要加载的Client接口:

@EnableFeignClients(clients = {UserClient.class})

这里采用方式二:

重启测试:

ok!

end
SpringCloud
Feign
SpringBoot

评论区

暂无评论