gball个人知识库
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)

ggball

后端界的小学生
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)
  • 面试

  • 数据库

  • linux

  • node

  • tensorFlow

  • 基础组件

  • 基础知识

  • 算法与设计模式

  • 分布式

    • 微服务

      • 远程调用

        • openFeign超时配置
    • 分布式事务

  • 疑难杂症

  • go学习之旅

  • 极客时间

  • 知识库
  • 分布式
  • 微服务
ggball
2021-10-08

openFeign超时配置

# openFeign超时时间配置

一开始我把 feign和openFeign搞混了,所以还是先记录下下面三种feign的区别吧

<!-- https://mvnrepository.com/artifact/com.netflix.feign/feign-core -->
<dependency>
    <groupId>com.netflix.feign</groupId>
    <artifactId>feign-core</artifactId>
    <version>8.18.0</version>
</dependency>22.MVCC0.5.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<!-- https://spring.io/projects/spring-cloud-openfeign -->
<!-- https://github.com/spring-cloud/spring-cloud-openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.1.2.RELEASE</version>
</dependency>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  1. com.netflix.feign是Netflix 公司开源产品,2018年宣布停止维护。 改由开源社区进行维护,修改了组织归属为OpenFeign,并调整代码仓库到OpenFeign/feign (opens new window)(可以简单理解为换了个仓库地址,换了一批人继续更新维护)。

  2. spring-cloud-starter-openfeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。Spring Cloud OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中。

    Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了 Ribbon(负载均衡) 和 Hystrix(熔断、降级),拥有负载均衡和服务容错功能。默认是采用java.net.HttpURLConnection,每次请求都会建立、关闭连接,为了性能考虑,可以引入httpclient、okhttp作为底层的通信框架。

为什么要记录这个问题呢,因为之前项目feign调用接口出现了超时问题,自己不知道咋解决,所以记录下

首先先来个例子,一共有三个服务

  • 服务eureka-sever
  • 服务cilent-a
  • 服务调用方 feign

image-20210830145533610

https://www.processon.com/view/link/612c81dfe0b34d3550f3ef18

image-20210830150040249

  1. 服务client-a提供一个接口,给调用方feign调用
@RestController
public class ClientAController {

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam String name) throws InterruptedException {
        return "hi " + name + ",i am from port:" + port;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
  1. 调用方调用client-a接口
/**
 * @program: spring_cloud_demo
 * @description:
 * @author: ggBall
 * @create: 2020-09-14 15:46
 **/
@RestController
public class ServerHiController {

    @Autowired
    ServerHi serverHi;
    @GetMapping("/hi")
    public String sayHi(String name){
        return serverHi.sayHiFromClientOne(name);
    }

}

/**
 *feign接口
*/
@FeignClient("clientA")
public interface ServerHi {
    @RequestMapping(value = "/hi", method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

调用者application.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8765
spring:
  application:
    name: service-feign
feign:
  client:
    config:
      default:
        connectTimeout: 10000
        readTimeout: 10000
        retryer: com.zhu.feign.config.MyRetryer #Feign使用默认的超时配置,在该类源码中可见,默认单次请求最大时长1秒,重试5次

ribbon:
  ReadTimeout: 5000  #处理请求的超时时间,默认为1秒
  ConnectTimeout: 10000 #连接建立的超时时长,默认1秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  1. 本地启动,浏览器调用http://127.0.0.1:8765/hi?name=11 接口,开始debug

image-20210830150630038

往里面debug,进入invoke()方法

image-20210830150705369

image-20210830150840766

​ Options这个对象是设置当前client的属性的一个实例,一些connectTimeout,readTimeout都是在这里面的,接着看findOptions()方法

image-20210830154216606

​ argv 为请求url上的参数值,如果argv的值为空或者元素为0,则返回自身的options,我们可以看到options的connectTimeout和配置的相同,说明默认为feign的配置

image-20210830155824168

client(有可能是httpClient和okHttp)开始执行远程调用

image-20210830160003826

​ 根据客户端名称和options获取client配置

image-20210830160356357

​ 如果传入的options不等于DEFAULT_OPTIONS,则使用feign配置,反之,则使用被调用方的ribbon配置,所以如果配置了feign配置,优先使用feign的配置,反之则使用 ribbon配置(ribbon默认超时时间为1s)

注意:hystrix的熔断时间配置通过yml配置没法生效,可以通过配置类的方法来修改

结论:如果配置了feign配置,优先使用feign的配置,反之则使用 ribbon配置(ribbon默认超时时间为1s)

上次更新: 2025/06/04, 15:06:15
观察者模式
分布式事务概览

← 观察者模式 分布式事务概览→

最近更新
01
AIIDE
03-07
02
githubActionCICD实战
03-07
03
windows安装Deep-Live-Cam教程
08-11
更多文章>
Theme by Vdoing
总访问量 次 | 总访客数 人
| Copyright © 2021-2025 ggball | 赣ICP备2021008769号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×

评论

  • 评论 ssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
×