• SpringCloud-微服务入门之OpenFeign(3)


    确保你已经学完了SpringCloud-微服务入门之Ribbon-Hystrix(2)

    什么是Feign

    Netflix Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign。

    Feign 对 Ribbon 进行了集成,利用 Ribbon 维护了一份可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。

    Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。

    通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。

    Feign 支持多种注解,例如 Feign 自带的注解以及 JAX-RS 注解等,但遗憾的是 Feign 本身并不支持 Spring MVC 注解,这无疑会给广大 Spring 用户带来不便。

    2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。

    什么是OpenFeign

    OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。

    OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。

    OpenFeign 常用注解

    使用 OpenFegin 进行远程服务调用时,常用注解如下表。
    在这里插入图片描述

    Feign VS OpenFeign

    相同点

    Feign 和 OpenFegin 具有以下相同点:

    • Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。
    • Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。
    • Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。
    • Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用。

    不同点

    Feign 和 OpenFeign 具有以下不同:

    • Feign 和 OpenFeign 的依赖项不同,Feign 的依赖为 spring-cloud-starter-feign,而 OpenFeign 的依赖为 spring-cloud-starter-openfeign。
    • Feign 和 OpenFeign 支持的注解不同,Feign 支持 Feign 注解和 JAX-RS 注解,但不支持 Spring MVC 注解;OpenFeign 除了支持 Feign 注解和 JAX-RS 注解外,还支持 Spring MVC 注解。

    项目结构图

    在这里插入图片描述
    在这里插入图片描述

    使用案例

    在consumer的pom.xml添加

            <!-- openFeign-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    去掉之前添加的熔断和重试依赖,因为OpenFeign本身以及集成了
    在这里插入图片描述

    在启动类ConsumerApplication添加@EnableFeignClients 注解 ,去掉之前添加的熔断器注解@EnableCircuitBreaker,然后restTemplate也不需要使用了,现在启动类的代码如下:
    在这里插入图片描述

    consumer里添加application.yml配置

    feign:
      client:
        config:
          default:
            connectTimeout: 5000 # 连接超时时间
            readTimeout: 5000   #连接到返回响应时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建Feign接口
    Feign里是支持mvc的所有注解的,所以在Feign接口和生产者的Controller保持一致就行

    @FeignClient(name = "producer")  // 生产者的服务名称
    @RequestMapping("/user")
    public interface ProducerFeign {
    
        @GetMapping("/all")
        List<UserEneity> getAll();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    producer生产者的接口
    在这里插入图片描述
    有人会疑问生产者的接口返回类型和feign的接口怎么不一致呢,ResponseEntity这个是spring中提供的统一接口返回类,最后会将结果解析为List<UserEneity> 进行返回给前端的,所以我们在feign中接口的返回类型实际上是List<UserEneity>

    在Controlle调用Feign的方式

        @Autowired
        private ProducerFeign requestFeign;
    
    • 1
    • 2

    Feign日志设置

    为啥要设置feign日志? ,我觉得这是必须的,因为在很多时候联调是一件很费劲的事情,如果出现问题很难找到问题的源头,那么就很有必要去设置feign日志,这样就能减少查找问题的时间了

    为每个创建的 Feign 客户端创建一个记录器。默认情况下,记录器的名称是用于创建 Feign 客户端的接口的完整类名。Feign logging 只响应DEBUG级别。
    在这里插入图片描述
    创建feign的配置类

    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class FeignConfig  {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    添加application.yml配置

    logging:
      level:
        # Fegin 日志以社么级别监听哪个接口 (是我们自己的feign接口)
        com.consumer.client.ProducerFeign: debug
    
    • 1
    • 2
    • 3
    • 4

    效果如下:
    在这里插入图片描述

    Feign-Ribbon(负载均衡器)

    OpenFeign 中已经集成了相关的注解和配置,默认已经开启了轮询策略,我们只需要配置Ribbon的配置参数就行了,在之前common模块里application-common.yml我们已经配置了

    在这里插入图片描述
    然后我们可以去掉之前添加的@LoadBalanced等代码
    在这里插入图片描述

    Feign-Hystrix熔断器

    OpenFeign 中已经集成了熔断器相关的依赖,而且Feign对熔断器也有了不一样的用法,当然之前的使用方式还是好使的,下面就演示Feign的熔断器用法

    修改consumer的application.yml配置

    feign:
      hystrix:
        enabled: true  # 开启熔断
    
    • 1
    • 2
    • 3

    然后熔断的配置和之前在common子模块application-common.yml中配置好了
    在这里插入图片描述

    想要在Feign中使用熔断器大概需要4步骤:

    1. 实现Feign接口,给每一个方法添加一个熔断处理
    2. @FeignClient(name='服务名',fallback =熔断接口实现类))
    3. 使用feign的hystrix那么在feign类上就不能添加@RequestMapping
    4. (非必须)在调用Feign的地方把@Autowired换成@Resource 主要是防止爆红
    @FeignClient(name = "producer",fallback = ProducerFeignImplHystrix.class)
    public interface ProducerFeign {
        @GetMapping("/user/all")
        List<UserEneity> getAll();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    //方法失败熔断器回调实现类
    @Component
    public class ProducerFeignImplHystrix implements ProducerFeign {
        @Override
        public List<UserEneity> getAll() {
            sendEmail();
            //返回一个空的数组,防止调用方报错,不至于影响到其他功能的使用
            return new ArrayList<UserEneity>();
        }
    
        public void sendEmail(){
            System.out.println("发送邮件通知管理员,进行处理");
    
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    解决办法
    在这里插入图片描述

    测试熔断还是和以前一样将timeoutInMilliseconds 改为1000毫秒 然后停止生产者2台之后立即使用消费者去访问,基本上试几次就出效果了

    在这里插入图片描述

    请求和响应进行GZIP压缩

    Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求的压缩功能简单来说就是发送的内容大小变小了,那么也就变相的加快了请求的速度 建议配置
    修改consumer的application.yml配置

    feign:
      compression:
        request:
          enabled: true # 开启请求压缩
          mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
          min-request-size: 2048 # 设置触发压缩的大小下限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    请求日志会显示gzip
    在这里插入图片描述

    注意事项

    Feign中本身已经集成了Ribbon依赖和熔断器因此不需要额外引入依赖

    在这里插入图片描述
    在这里插入图片描述

    Feign跨域

    如果前端访问时候出现 Access-Control-Allow-Origin 这种错误就表示需要开启feign的跨域在ConsumerApplication启动类里添加下面代码就行了

        @Bean
        public CorsFilter corsFilter() {
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration config = new CorsConfiguration();
            config.setAllowCredentials(true); // 允许cookies跨域
            config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许。
            config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
            config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
            config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许,也可以单独设置GET、PUT等
            source.registerCorsConfiguration("/**", config);
            return new CorsFilter(source);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    点赞 -收藏-关注-便于以后复习和收到最新内容
    有其他问题在评论区讨论-或者私信我-收到会在第一时间回复
    如有侵权,请私信联系我
    感谢,配合,希望我的努力对你有帮助^_^

  • 相关阅读:
    redis深度历险 2 - Redis的基本数据类型以及使用场景
    gin源码实战 day2
    go面试题
    解决jupyter找不到虚拟环境的问题
    22年4月后树莓派烧录镜像、联网以及ssh 远程投屏失败的注意事项
    城市区号查询易语言代码
    【从入门到起飞】JavaSE—IO流(2)字符输入流&&字符输出流
    理想中的接口自动化项目
    html2canvas快速使用
    AWS认证SAA-C03每日一题
  • 原文地址:https://blog.csdn.net/weixin_45203607/article/details/124786585