SpringCloudAlibaba-OpenFeign的引入及使用

一、OpenFeign是什么

   OpenFeign是SpringCloud对Fegin的封装升级,包含了SpringMVC,Ribbon等功能,可以使用SpringMVC的相关注解,通常我们在调用别的服务的接口的时候分别都是使用HttpClient或者RestTemplate等通过指定URL地址等操作去调用别的服务的接口。在微服务中,我们可以通过引入OpenFeign组件实现更方便的服务间的调用,最简单的就是可以通过指定其他服务的名字来调用相应接口。

二、引入依赖以及配置

  1. 首先我们在我们想要使用的服务下面引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. 在启动类上面加上启用OpenFeign的注解:@EnableFeignClients

  3. 配置打印日志调用日志的配置类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
    * @Description
    * OpenFeign配置类
    * 如果加了@Configuration注解则为全局配置,所有Feign接口都有效
    * 如果想要实现局部配置,则不需要配置@Configuration注解,在想要启用这个配置的Feign接口上面指定这个配置类
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Configuration
    public class FeignConfig {

    /**
    * @Description 日志级别
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
    }
    }
  4. 配置yml配置文件

    1
    2
    3
    4
    logging:
    level:
    # 指定对应包的日志级别
    com.sy.springcloud.service.openFeign: debug

三、实际使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @Description
* feign接口
* name:对应的调用的服务的实例名称
* path:对应的调用的接口的地址,就是对应的Controller指定的@RequestMapping()配置的地址
* configuration = FeignConfig.class,可以加入这个配置,这个配置用于这个接口使用的feign配置类,就是局部配置的时候使用的
* @Author sy
* @Date 2023/3/5
* @Version 1.0
**/
@FeignClient(name = "stock", path = "/stock")
public interface Stock {

/**
* @Description 这里的接口就与调用的Controller里面的接口一直就可以了,其实将对应的接口复制过来就可以了,只不过是没有实现的
* @Author sy
* @Date 2023/3/5
* @Version 1.0
**/
@PostMapping(value = "/reduceStock")
public String reduceStock();
}

到这里,最基本的配置使用可以了。后面还会增加更多使用的配置

四、契约模式

  将OpenFeign的注解还原成原生注解,使用场景:例如我们的项目是一个早期版本的SpringCloud,当你想要对框架进行升级,那么由于早期的框架使用的是Feign组件,当你升级后要使用的是OpenFegin组件,就会出现兼容性的问题,那这里就可以使用这个契约模式去指定某些接口使用原生注解。这里可以通过多种配置方式来实现,我们这里就演示简单的两种分别是全局模式与局部模式:

  1. 全局模式:还是可以通过配置类来实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @Configuration
    public class FeignConfig {

    /**
    * @Description 日志级别
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
    }

    /**
    * @Description 契约模式,将OpenFeign注解还原成原生注解,基本不会使用到
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Contract feignContract() {
    return new Contract.Default();
    }
    }
  2. 通过yml的方式来配置局部

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # feign局部配置
    feign:
    client:
    config:
    # 对应的服务名称
    stock:
    # 日志级别
    logger-level: basic
    # 契约模式,还原Feign原生注解
    contract: feign.Contract.Default

五、超时时间

可以配置连接超时时间,与请求处理超时时间

  1. 通过配置类配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /**
    * @Description
    * OpenFeign配置类
    * 如果加了@Configuration注解则为全局配置,所有Feign接口都有效
    * 如果想要实现局部配置,则不需要配置@Configuration注解,在想要启用这个配置的Feign接口上面指定这个配置类
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Configuration
    public class FeignConfig {

    /**
    * @Description 日志级别
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
    }

    /**
    * @Description 契约模式,将OpenFeign注解还原成原生注解,基本不会使用到
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Contract feignContract() {
    return new Contract.Default();
    }

    /**
    * @Description 超时时间配置,第一个参数配置的是连接超时时间,第二个参数配置的是请求处理超时时间
    * @Author sy
    * @Date 2023/3/5
    * @Version 1.0
    **/
    @Bean
    public Request.Options options() {
    return new Request.Options(5000, 10000);
    }
    }
  2. 通过yml配置文件配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # feign局部配置
    feign:
    client:
    config:
    # 对应的服务实例名称
    stock:
    # 日志级别
    logger-level: basic
    # 契约模式,还原Feign原生注解
    contract: feign.Contract.Default
    # 连接超时时间配置
    connect-timeout: 5000
    # 请求处理超时时间配置
    read-timeout: 10000