返回顶部
首页 > 资讯 > 后端开发 > Python >通过FeignClient如何获取文件流steam is close问题
  • 356
分享到

通过FeignClient如何获取文件流steam is close问题

2024-04-02 19:04:59 356人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录FeignClient获取文件流 steam is close问题原因解决办法FeignClient注解参数日志级别配置服务超时、重试、降级和熔断FeignClient获取文件流

FeignClient获取文件流 steam is close问题

inputstream.read 报错 steam is close

原因

idea debug启动导致

解决办法

直接启动

FeignClient注解参数

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • url: url一般用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生Http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • path: 定义当前FeignClient的统一前缀

日志级别配置

默认Feign是不打印任何日志的,下面我们来开启Feign的日志,Feign有四种日志级别:

  • NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
  • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
  • FULL【比较适用于开发测试环境定位问题】:记录请求和响应的header、body和元数据。

在application.yml 中添加以下内容,将该Feign接口的日志级别设置为DEBUG:

# 定义feign客户端所在的路径,需要设置日志级别为debug
logging.level: com.example.customer.service.CustomerService: debug
# user为服务名,单个配置客户端日志级别设置,如果需要全局配置,把user更换为default
feign.client.config.user.loggerLevel: FULL

调用日志信息截图

2020-06-07 14:06:27.671 DEBUG 24961 --- [NIO-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] ---> GET http://user/user HTTP/1.1
2020-06-07 14:06:27.671 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] ---> END HTTP (0-byte body)
2020-06-07 14:06:27.678 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] <--- HTTP/1.1 200  (7ms)
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] connection: keep-alive
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] content-type: application/JSON
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] date: Sun, 07 Jun 2020 06:06:27 GMT
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] keep-alive: timeout=60
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] transfer-encoding: chunked
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser]
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] {"id":1,"name":"test","phone":"119"}
2020-06-07 14:06:27.679 DEBUG 24961 --- [nio-8081-exec-3] c.e.customer.service.CustomerService     : [CustomerService#getUser] <--- END HTTP (36-byte body)

服务超时、重试、降级和熔断

·超时 Feign接口调用分两层,Ribbon(负载均衡)和Hystrix(熔断器)的调用,因此Feign的超时时间就是ribbon的超时时间和Hystrix的超时时间的结合

·重试 使用Ribbon

设置Ribbon重试次数

ribbon:
  #连接超时时间
  ConnectTimeout: 1000
  #读超时时间
  ReadTimeout: 1000
  ##同一台实例最大重试次数,不包括首次调用
  MaxAutoRetries: 0
  #重试负载均衡其他的实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1
  #是否所有操作都重试,设置false时,只会对get请求进行重试;如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,慎用;
  OkToRetryOnAllOperations: false

负载均衡配置

#服务名
user:
  ribbon:
    #选择随机算法
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Ribbon Eager加载

默认情况下Ribbon是懒加载的——首次请求Ribbon相关类才会初始化,这会导致首次请求过慢的问题,你可以配置饥饿加载,让Ribbon在应用启动时就初始化。

ribbon:
  eager-load:
    enabled: true
    # 多个用,分隔
    clients: user

降级和熔断使用hystrix

如果重试期间,调用时间超过了 Hystrix熔断的超时时间,便会立即熔断,进行FallBack

# 开启hystrix
feign.hystrix.enabled: true 
# hystrix的超时时间 时间设置需要根据实际业务场景计算得出
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000

Fallback配置

@FeignClient(name = "user", fallback = CustomerFeignClientFallback.class)
public interface CustomerService {
 
  
  @GetMapping("/user")
  UserDTO getUser ();
 
  @Component
  public class CustomerFeignClientFallback implements CustomerService {
 
    @Override
    public UserDTO getUser () {
     //todo 回退逻辑
      return new UserDTO().setName("服务降级");
    }
  }
}
@FeignClient(name = "user", fallbackFactory = CustomerFeignClientFallbackFactory.class)
public interface CustomerService {
 
  
  @GetMapping("/user")
  UserDTO getUser ();
 
  @Component
  @Slf4j
  public class CustomerFeignClientFallbackFactory implements FallbackFactory<CustomerService> {
 
    @Override
    public CustomerService getUser () {
       //todo 回退逻辑
      return new UserDTO().setName("服务降级");
    }
  }
}

配置

logging:
  level:
    com.example.customer.service.CustomerService: debug
#全局配置,单个服务配置把default替换为需要设置的服务名
feign:
  client.config.default.loggerLevel: FULL
  okhttp.enabled: true
  #熔断与回退
  hystrix.enabled: true
#重试机制
ribbon:
  #连接超时时间
  ConnectTimeout: 2000
  #读超时时间
  ReadTimeout: 2000
  ##同一台实例最大重试次数,不包括首次调用
  MaxAutoRetries: 0
  #重试负载均衡其他的实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1
  #是否所有操作都重试
  OkToRetryOnAllOperations: false
# Hystrix的超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 10000

有关Feign超时时间易混淆概念

Feign超时时间

feign.client.config.default.connectTimeout=10000 //Feign的连接建立超时时间,默认为10秒
feign.client.config.default.readTimeout=60000 //Feign的请求处理超时时间,默认为60

Ribbon 超时时间

ribbon.ReadTimeout=1000 //处理请求的超时时间,默认为1秒
ribbon.ConnectTimeout=1000 //连接建立的超时时长,默认1秒

Hystrix 超时时间

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000 #熔断器的超时时长默认1秒

以上各种超时配置,如果都存在,则时间小的配置生效

小提示

  • Feign的底层是调用ribbon来实现负载均衡的,为了不和ribbon的重试机制冲突不需要配置feign超时时间和重试功能,只需配置ribbon和hystrix超时时间即可。
  • Ribbon超时时间必须小于hysrix超时设置,这样才能触发ribbon重试,ribbon重试分为两种情况,同一实例重试和负载均衡的不同实例重试,默认为1次和0次
  • Feign的默认配置,是不启用hystrix,需要开启feign.hystrix.enabled=true,这样hystrix的相关配置才可以在Feign中生效。
  • Hystrix的超时时间=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)
  • Ribbon超时但Hystrix没有超时的情况下,Ribbon便会采取重试机制;而重试期间如果时间超过了Hystrix的超时配置则会立即被熔断(fallback)
  • 关系图

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 通过FeignClient如何获取文件流steam is close问题

本文链接: https://lsjlt.com/news/151644.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 通过FeignClient如何获取文件流steam is close问题
    目录FeignClient获取文件流 steam is close问题原因解决办法FeignClient注解参数日志级别配置服务超时、重试、降级和熔断FeignClient获取文件流...
    99+
    2024-04-02
  • springboot如何获取文件流
    目录springboot获取文件流前端获取springboot返回的文件流的踩坑踩过坑的我给您提供一个答案两种解决方案springboot获取文件流 在日常开发中,经常会获取项目的相...
    99+
    2024-04-02
  • JS如何通过FileReader获取.txt文件内容
    目录JS通过FileReader获取.txt文件内容读取.txt文件方法JS: FileReader()读取文件下面开始实际例子读取txt文件读取图片文件JS通过FileReader...
    99+
    2024-04-02
  • 如何通过http代理ip获取流量
    本篇内容主要讲解“如何通过http代理ip获取流量”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过http代理ip获取流量”吧!如今,http代理在大家的身边应用是很多的,下面就给大家详细...
    99+
    2023-06-20
  • php不通过后缀如何获取文件类型
    这篇文章主要讲解了“php不通过后缀如何获取文件类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php不通过后缀如何获取文件类型”吧!获取文件类型的方法:1、使用“$_FILES['...
    99+
    2023-06-26
  • 如何通过python获取甲流分布数据
    这篇文章主要讲解了“如何通过python获取甲流分布数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何通过python获取甲流分布数据”吧!分析网页的网络数据,取得请求头,并用pytho...
    99+
    2023-07-05
  • FeignClient如何通过配置变量调用配置文件url
    目录通过配置变量调用配置文件url调用指定的动态URL1 创建demo1服务2 创建demo2服务测试通过配置变量调用配置文件url 1.application.yml 配置文件配置...
    99+
    2024-04-02
  • Springboot如何通过流返回文件
    目录如何通过流返回文件controller类如下工具类DownLoadUtils如下以流的方式直接返回如何通过流返回文件 本人的文件是放在resource/templates目录下,...
    99+
    2024-04-02
  • springboot普通类中如何获取session问题
    目录Spring中普通类获取session项目中日志功能解决方案SpringBoot中使用session基础知识在 Spring Boot中使用总结Spring中普通类获取sessi...
    99+
    2023-01-12
    springboot普通类 springboot普通类获取session springboot session
  • Java如何获取url地址文件流
    目录获取url地址文件流根据url获取文件的二进制上代码获取url地址文件流 public static InputStream getInputStreamFromUrl(Str...
    99+
    2024-04-02
  • golang如何通过viper读取config.yaml文件
    目录1.导入依赖包2.编写yaml文件3.编写读取yaml文件的go文件4.使用config对象5.viper源码分析1.导入依赖包 import (     "github.com...
    99+
    2024-04-02
  • 如何解决图片上传利用request.getInputStream()获取文件流时遇到的问题
    这篇文章主要介绍如何解决图片上传利用request.getInputStream()获取文件流时遇到的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!图片上传功能是我们web里面经常用到的,获得的方式也有很多种,这...
    99+
    2023-05-30
    request
  • Vue2.5如何通过json文件读取数据
    这篇文章主要介绍了Vue2.5如何通过json文件读取数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.准备工作1.1 webpack....
    99+
    2024-04-02
  • java如何通过字符流实现文件拷贝
    这篇文章将为大家详细讲解有关java如何通过字符流实现文件拷贝,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。通过字符流实现文件拷贝使用字符流只能拷贝文本文件    ...
    99+
    2023-06-17
  • java如何通过字符缓冲流拷贝文件
    这篇文章主要介绍java如何通过字符缓冲流拷贝文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!通过字符缓冲流拷贝文件字符缓冲流只能读取文本文件   public static...
    99+
    2023-06-17
  • java如何通过字节流实现文件的拷贝
    小编给大家分享一下java如何通过字节流实现文件的拷贝,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过字节流实现文件的拷贝   p...
    99+
    2023-06-17
  • java如何通过字节缓冲流实现文件拷贝
    小编给大家分享一下java如何通过字节缓冲流实现文件拷贝,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过字节缓冲流实现文件拷贝  publi...
    99+
    2023-06-17
  • java如何通过FileOutputStream字节流向文件中写数据
    目录通过FileOutputStream字节流向文件中写数据java 字节流向文件中写入指定内容字符流 就像这样字符流则是总结通过FileOutputStream字节流向文件中写数据...
    99+
    2022-12-26
    java FileOutputStream FileOutputStream字节流 字节流向文件写数据
  • SpringBoot中如何解决读取properties文件读取问题
    目录如何解决读取properties文件读取问题问题描述路径设置中文乱码读取指定properties文件设置配置属性类型配置文件如何解决读取properties文件读取问题 问题描述...
    99+
    2024-04-02
  • java通过httpclient携带请求头参数获取第三方文件流接口并实现实现文件下载
    创建httpclient 请求,并在header携带指定key,也可根据实际需要携带token等信息。获取第三方接口返回的文件输入流并写到本地response中,实现返回文件流,前端通过js的a标签进行下载。 代码如下: @Override...
    99+
    2023-10-01
    java 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作