1. 引言

Fegin组件的用处,是为了替换掉之前使用RestTemplate方式对nacos服务进行调用的方式。

通过Fegin,我们定义一些接口和接口内的方法,在方法中提前指定好访问的路径、请求方式、请求参数等信息,在需要调用服务的时候,就直接调用接口即可。

2. Feign入门

feign入门使用方式有如下步骤:

  1. 引入依赖
  2. 编写配置,修改日志级别
  3. 启动类上添加注解 @EnableFeignClients
  4. 编写Feign客户端接口

2.1. 引入依赖

我们在order-service服务的pom文件中引入feign的依赖:

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

2.2. 编写配置文件

我们一般会修改feign的日志配置。其中又分为 单独 给某个服务设置,或给 所有 服务设置

日志级别:尽量使用BASIC

  • 给所有服务配置fegin日志
feign:  
  client:
    config: 
      default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: BASIC #  日志级别 
  • 给指定的服务配置fegin日志(此处以服务名为userservice为例)
feign:  
  client:
    config: 
      userservice: # 针对某个微服务的配置
        loggerLevel: FULL #  日志级别 

2.3. 启动类上添加注解

在启动类上添加@EnableFeignClients注解,启动Feign

2.4. 编写Feign的客户端

创建client包,在包内创建接口,编写抽象方法,指定请求方式、请求路径、请求参数

(可以直接copy调用的controller代码)

  • 下面是一个 根据用户id查询用户信息接口 的例子
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);
}

3. 优化 - 使用HTTP连接池

由于Fegin的底层是发起Http请求,而重复建立请求会消耗大量时间,所以我们通过使用Http连接池的方式来优化Fegin

3.1. 引入HttpClient依赖

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

3.2. 配置连接池

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对HttpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径的最大连接数

4. 优化 - client抽取

4.1. 引言

由于feign接口可能在多个模块中都要使用,为了避免代码重复,我们可以将所有feign的接口都抽取到一个项目中,其他项目再引用这项目。

同时,由于是各个模块都要引用,也可以将pojo抽取到feign模块中。

image-20210714214041796

4.2. 实现步骤

4.2.1. feign模块 - 引入依赖

创建feign模块后,需要引入feign的起步依赖

<!--feign起步依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

4.2.2. 其他模块 - 添加对feign模块的引用

其他模块应该在pom文件中增加对feign模块的引用。

(下面是一个例子,实际应该配置具体的feign模块信息)

<!--其他模块引入feign模块-->
<dependency>
    <groupId>link.xiaomo.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

4.2.3. 其他模块 - 添加包扫描

其次,其他模块应该手动设置对feignClient的包扫描,才能使用feign接口

  • 方式一:

指定Feign应该扫描的包:(加载包内所有接口)

@EnableFeignClients(basePackages = "link.xiaomo.feign.clients")
  • 方式二:

具体指定需要加载的Client接口:(加载具体的接口)

@EnableFeignClients(clients = {UserClient.class, OrderClient.class})
如人饮水,冷暖自知。
最后更新于 2023-08-03