• Feign高级配置


    1、Feign对负载均衡的支持

            Feign 本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,可以通过 ribbon.xx 来进行全局配置,也可以通过服务名.ribbon.xx 来对指定服务进行细节配置配置(参考之前,此处略)

            Feign默认的请求处理超时时长1s,有时候我们的业务确实执行的需要一定时间,那么这个时候,我们就需要调整请求处理超时时长,Feign自己有超时设置,如果配置Ribbon的超时,则会以Ribbon的为准。

    Ribbon设置

    1. #针对的被调用方微服务名称,不加就是全局生效
    2. lagou-service-resume:
    3. ribbon:
    4. #请求连接超时时间
    5. ConnectTimeout: 2000
    6. #请求处理超时时间
    7. ReadTimeout: 15000 # Feign 超时时间设置
    8. #对所有操作都进⾏重试
    9. OkToRetryOnAllOperations: true
    10. ####根据如上配置,当访问到故障请求的时候,它会再尝试访问⼀次当前实例(次数由MaxAutoRetries配置),
    11. ####如果不⾏,就换⼀个实例进⾏访问,如果还不⾏,再换⼀次实例访问(更换次数由MaxAutoRetriesNextServer配置),
    12. ####如果依然不⾏,返回失败信息。
    13. MaxAutoRetries: 0 #对当前选中实例重试次数,不包括第⼀次调⽤
    14. MaxAutoRetriesNextServer: 0 #切换实例的重试次数
    15. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略调整

    2、Feign对熔断器的支持

          在Feign客户端工程配置文件(application.yml)中开启Feign对熔断器的支持。

    1. # 开启Feign的熔断功能
    2. feign:
    3. hystrix:
    4. enabled: true

            Feign的超时时长设置那其实就上面Ribbon的超时时长设置,Hystrix超时设置(就按照之前Hystrix设置的方式就OK了)

    注意:

    1. 开启Hystrix之后,Feign中的方法都会被进行一个管理了,一旦出现问题就进入对应的回退逻辑处理
    2. 针对超时这一点,当前有两个超时时间设置(Feign/hystrix),熔断的时候是根据这两个时间的最小值来进行的,即处理时长超过最短的那个超时时间了就熔断进入回退降级逻辑
    1. hystrix:
    2. command:
    3. default:
    4. execution:
    5. isolation:
    6. thread:
    7. timeoutInMilliseconds: 15000

      自定义FallBack处理类(需要实现FeignClient接口)

    1. package com.lagou.edu.controller.service;
    2. import org.springframework.stereotype.Component;
    3. /**
    4. * 降级回退逻辑需要定义一个类,实现FeignClient接口,实现接口中的方法
    5. * 此接口是我们进行Feign远程调用时所创建的接口
    6. */
    7. @Component
    8. public class ResumeFallback implements ResumeServiceFeignClient{
    9. @Override
    10. public Integer findDefaultResumeState(Long userId) {
    11. return -6;
    12. }
    13. }

      在@FeignClient注解中关联2)中自定义的处理类

    1. package com.lagou.edu.controller.service;
    2. import org.springframework.cloud.openfeign.FeignClient;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. import org.springframework.web.bind.annotation.PathVariable;
    5. // @FeignClient标明当前类是一个Feign客户端,value指定该客户端要请求的服务器名称(登记到注册中心上服务提供者的服务名称)
    6. @FeignClient(value = "lagou-service-resume", fallback = ResumeFallback.class, path = "/resume")
    7. // 使⽤fallback的时候,类上的@RequestMapping的url前缀限定,改成配置在@FeignClient的path属性中
    8. // @RequestMapping("/resume")
    9. public interface ResumeServiceFeignClient {
    10. // feign要做的事情,拼装url发起请求
    11. // 我们调用该方法就是调用本地接口方法,那么实际上做的事远程请求
    12. @GetMapping("/openstate/{userId}")
    13. public Integer findDefaultResumeState(@PathVariable Long userId);
    14. }

    3、Feign对请求压缩和响应压缩的支持

            Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能:

    1. feign:
    2. compression:
    3. request:
    4. enabled: true # 开启请求压缩
    5. mime-types: text/html,application/xml,application/json # 设置压缩的数据类型,此处也是默认值
    6. min-request-size: 2048 # 设置触发压缩的⼤⼩下限,此处也是默认值
    7. response:
    8. enabled: true # 开启响应压缩

    4、Feign的日志级别配置

            Feign是http请求客户端,类似于咱们的浏览器,它在请求和接收响应的时候,可以打印出比较详细的⼀些日志信息(响应头,状态码等等)

            如果我们想看到Feign请求时的日志,我们可以进行配置,默认情况下Feign的日志没有开启。

      开启Feign日志功能及级别

    1. // Feign的⽇志级别(Feign请求过程信息)
    2. // NONE:默认的,不显示任何⽇志----性能最好
    3. // BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪
    4. // HEADERS:在BASIC级别的基础上,记录请求和响应的header
    5. // FULL:记录请求和响应的header、body和元数据----适⽤于开发及测试环境定位问题
    6. import feign.Logger;
    7. import org.springframework.context.annotation.Bean;
    8. import org.springframework.context.annotation.Configuration;
    9. @Configuration
    10. public class FeignLog {
    11. @Bean
    12. Logger.Level feignLevel() {
    13. return Logger.Level.FULL;
    14. }
    15. }

      配置log日志级别为debug

    1. logging:
    2. level:
    3. # Feign⽇志只会对⽇志级别为debug的做出响应
    4. com.lagou.edu.controller.service.ResumeServiceFeignClient: debug
  • 相关阅读:
    分析Python7个爬虫小案例(附源码)
    聚焦光量子应用开发!Quandela 发布新版量子计算云服务
    程序员35岁之后不写程序了,该怎样职业规划?
    卡尔曼家族从零解剖-(07) 高斯分布积分为1,高斯分布线性变换依旧为高斯分布,两高斯函数乘积仍为高斯。
    算法(二)——数组章节和链表章节
    Maven项目,进行编译,使用idea的 编译功能,就是正常的,但是在终端中执行 mvn clean compile 报错
    浅析Linux进程间通信方式之消息队列
    SpringBoot 22 Swagger配置扫描接口和开关、过滤url、根据环境决定使用
    【rabbitmq】搭建rabbitmq启用插件报错
    1 Mybatis动态SQL
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/126554239