Java学习记录 05Spring Cloud Feign

Feign

Feign 是一个声明式的 REST客户端,它能让 REST 调用更加简单

Feign 供了 HTTP 请求的模板,通过 接口 、注解的形式,定义好 HTTP 参数

示例

大致流程概述:

  1. 消费者 引入依赖
  2. 消费者 启动器类 添加注解 @EnableFeignClients
  3. 消费者 创建 服务客户端接口 (用于访问请求的
  4. 消费者 创建 新的controller (用于测试 步骤3访问可行
  1. 消费者 pom.xml

    <!-- Feign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 消费者 启动类,添加注解 @EnableFeignClients

    @SpringCloudApplication
    @EnableFeignClients // 启动 feign功能
    public class ConsumerApplication {
        
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
        
        @Bean
        // Ribbon 启动负载均衡
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
        
    }
    
  3. 消费者 创建Feign客户端,以接口形式存在

    //标识 Feign客户端
    @FeignClient("user-service")
    public interface UserClient {
        
        // http://user-service/user/1 (前提:该url可访问
        @GetMapping("user/{id}")
        User queryById(@PathVariable ("id")Long id);
        
    }
    
    • 该接口主要作用是 无需手动拼接 url,通过注释进行拼接url(不同方法都有各自的拼接结果
    • @FeignClient 注释的value需要指定 服务名称
  4. 消费者 创建新的 controller ConsumerFeignController类

    @RestController
    @RequestMapping("cf")
    public class ConsumerFeignController {
        
        @Autowired
        private UserClient client;
        
        @GetMapping ("{id}")
        public User queryById(@PathVariable Long id) {
            return client.queryById(id);
        }
        
    }
    

    用于测试接口访问

  5. 测试
    访问 http://localhost:8080/cf/1 (代码以上篇文章为基础,因此访问IP一样

Feign-Ribbon

Ribbon主要用于配置请求时长、重新访问等相关配置

Feign本身集成了 Ribbon依赖 和 自动配置(无需再次配置Ribbon

由于自动配置的缘故,我们只需关注主要的配置信息

配置 值 (默认) 说明
ribbon.ConnectTimeout int (1000ms) 连接超时时长 (两端连接最长时长,超出则超时)
ribbon.ReadTimeout int (1000ms) 请求处理超时时长 (连接后读取资源最长时长,超出则超时)!
ribbon.MaxAutoRetries int (0) 对请求的失败重试次数
ribbon.MaxAutoRetriesNextServer int (1) 对请求失败重试换节点次数
ribbon.OkToRetryOnAllOperations boolean (false) 是否对所有的请求方式都重试

支持 全局配置 或 单个服务配置

以上参数自行在浏览器测试

Feign-Hystrix

Feign 默认也集成 Hystrix依赖

详细了解:04Spring Cloud 熔断器Hystrix

应用说明:

  • 默认是关闭Hystrix ,需要手动配置Hystrix打开
  • 需要为 Feign客户端 注解添加降级服务的指定类
  • 需要为 Feign客户端 编写falback作为降级处理

示例

在以上代码基础上进行编辑测试

  1. 启动Hystrix。消费者 配置启动

    # feign-hystrix
    feign :
        hystrix :
            # 熔断器打开
            enabled : true
    
  2. 降级服务模板。为 Feign客户端 创建 Fallback模板

    // 为UserClient接口 Fallback降级服务
    @Component
    @Slf4j
    public class UserClientFallback implements UserClient{
        
        @Override
        public User queryById(Long id) {
            User user = new User();
            user.setId(id);
            user.setName("用户异常");
            log.error("访问拥堵!{}",id);
            return user;
        }
        
    }
    
    • @Component注解 自动扫描对象 (添加容器自动注入的应用
    • 实现 指定服务的接口
  3. Feign客户端 降级服务。注解 fallback值:需要指定Fallback模板类

    //标识 Feign客户端 (添加 Fallback降级服务
    @FeignClient(value = "user-service",fallback = UserClientFallback.class)
    public interface UserClient {
        
        // http://user-service/user/1
        @GetMapping("user/{id}")
        User queryById(@PathVariable ("id")Long id);
        
    }
    
  4. 测试

    1. 依次打开 Eureka、server、consumer 三个服务
    2. 浏览器访问 http://localhost:8080/cf/1 (访问成功
    3. 关闭 server 再次访问以上请求
    4. 再次访问以上链接,会返回 降级的fallback模板

Feign-日志

Feign日志 专门记录 请求/响应 的信息

Level级别

Level级别 会根据不同的配置,分别记录不同的信息

Level级别 说明
NONE (默认) 不记录任何信息
BASIC 只记录请求方法,URL以及响应状态码、执行时间
HEADERS 在BASIC的基础上,额外记录 请求/响应 头信息
FULL 记录 请求/响应 明细信息(请求头、请求体、元数据)

应用说明:

  • Feign日志 需要在指定包下配置 日志级别
  • Feign客户端 也需添加注解 configuration值 指定 Feign日志配置类

示例

  1. 配置日志级别。消费者 配置 日志级别 debug

    # 日志级别
    logging :
        level :
            com.sans : debug
    
  2. 创建 Feign日志配置类 。消费者 创建 Feign日志配置类 指定 level级别

    package com.sans.config;
    
    // 配置类
    @Configuration
    public class FeignConfig {
        
        /* 请求级别:
            - NONE:不记录任何信息(默认值)
            - BASIC:只记录请求方法,URL以及响应状态码、执行时间
            - HEADERS:在BASIC的基础上,额外记录 请求/响应 头信息
            - FULL:记录 请求/响应 明细信息(请求头、请求体、元数据)
        * */
        
        @Bean
        public Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
        
    }
    
  3. 接口注释。消费者 Feign客户端 @FeignClient注解 configuration值 添加 Feign日志配置类

    @FeignClient(value = "user-service",fallback = UserClientFallback.class,configuration = FeignConfig.class)
    public interface UserClient {
        
        // http://user-service/user/1
        @GetMapping("user/{id}")
        User queryById(@PathVariable ("id")Long id);
        
    }
    
  4. 测试

    1. 依次打开 Eureka、server、consumer 三个服务
    2. 浏览器访问 http://localhost:8080/cf/1 (访问成功
    3. 查看控制台日志

http压缩

Feign 也支持 请求/响应 进行GZIP压缩,减少传输性能损耗

需要手动启动 配置示例:

feign :
    # 日志 请求/响应 分别启动
    compression:
        request:
	        # 开启请求压缩
            enabled: true 
            # 设置压缩的数据类型 (默认)
            mime-types: text/html,application/xml,application/json 
            # 设置触发压缩的大小下限 (默认)
            min-request-size: 2048 
        response:
	        # 开启响应压缩
            enabled: true 

以上配置除了 压缩 启动,其他应用默认值即可

上一篇:SpringCloud企业分布式微服务云架构快速开发平台源码


下一篇:【spring cloud】feign组件的使用