Open Feign

  1. OpenFeign 是一个基于 Spring 的声明式、模板化的 HTTP 客户端,它简化了编写 Web 服务客户端的过程。用户只需创建一个接口并添加相应的注解,即可实现对远程服务的调用。Spring Cloud OpenFeign 对 Feign 进行了二次封装,使得在 Spring Cloud 中使用 Feign 的时候,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程访问,更感知不到在访问 HTTP 请求。

  2. 快速开始

    • 引入依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
    • 编写调用接口,并使用@FeignClient注解
    @FeignClient(name = "order-service",path ="/order")
    public interface ServuceFeignClient {
    
            @RequestMapping("/queryByUserId/{userId}")
            List<User> queryByUserId(@PathVariable Long userId);
    
            @RequestMapping("/getPort")
            Integer getPort();
    }
    
    • 在启动类添加@EnableFeignClients 注解
  3. 由于每次请求都要创建Client,所以引入okhttp,可以进行连接池的设置

    • 引入依赖
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>
    
    • 进行配置
    feign:
      okhttp:
        enabled: true
    
  4. 最佳实践:采用抽取方式

    • 将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

    • 首先创建一个module,命名为feign-api,在feign-api中引入spring-cloud-starter-openfeign依赖

    • 将与feign有关的Clients接口,实体类,配置类都复制到feign-api中

    • 在其他可能会用到feign的模块中引入feign-api的包

    • 重启后可能会发生错误,因为你得feign-api的模块中给的Clients在cn.itcast.feign.clients包中,而要调用feign的order-service的 @EnableFeignClients 注解是在cn.itcast.order 包下,不在同一个包,无法扫描到Clients。为解决这个问题可以指定feign应该扫描的包

    @EnableFeignClients(basePackages = "orderservice.feign.clients")
    
  5. feign的日志

    • 基于Java代码来修改日志级别,先声明一个类,再声明一个Logger.Level的对象
    /**
     * OpenFeign的配置
     */
    public class DefaultFeignConfiguration {
     
        /**
         * 配置日志基本
         * @return
         */
        @Bean
        public Logger.Level feignLogLevel(){
            return Logger.Level.BASIC; // 日志级别为BASIC
        }
    }
    
    • 全局生效,将其放到 启动类的@EnableFeignClients这个注解中
    @EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 
    
    • 局部生效,放到对应的@FeignClient这个注解
    @FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 
    
    • 配置文件方式
    # 针对某个微服务的配置  userservice:微服务名称  FULL:日志级别
    feign.client.config.userservice.logger-level=FULL
    # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
    #feign.client.config.default.logger-level=FULL
    
    • 日志级别
    日志的级别分为四种:
    
    - NONE:不记录任何日志信息,这是默认值。
    - BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
    - HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
    - FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
    
posted @ 2024-05-28 09:12  Hanyta  阅读(24)  评论(0编辑  收藏  举报