文档章节

spring cloud 里的 超时问题

p
 pigpig2008
发布于 2017/04/07 10:21
字数 394
阅读 132
收藏 0

hystrix默认超时时间是1000,单位:ms

服务提供方:

package cc.sion.web;

import cc.sion.biz.ISayBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

@RestController
public class SayController {
    @RequestMapping(value = "/sayWaiting/{name}" ,method = RequestMethod.GET)
    public String sayWaiting(@PathVariable String name) {
        try {
            //等5秒
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return "I hate waiting in line.";
    }

}

服务消费者:

@Service
public class RemoteService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "sayFallback")
    public String sayWaiting(String name) {
        return restTemplate.getForObject(hello_url+"/sayWaiting/"+name, String.class);
    }

    public String sayFallback(String name,Throwable e)
    {

        System.out.println("=======================");
        if(e!=null)
            e.printStackTrace();

        return ":(";
    }
}

运行时提示:

=======================
com.netflix.hystrix.exception.HystrixTimeoutException
	at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:1121)
	at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41)
	at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37)
	at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57)
	at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:1138)
	at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:99)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

解决办法如下:

一,修复消费者代码,添加个配置

    @HystrixCommand(fallbackMethod = "sayFallback",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "6000")
            }
    )
    public String sayWaiting(String name) {
        return restTemplate.getForObject(hello_url+"/sayWaiting/"+name, String.class);
    }

二,在application.yml下改hystrix配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds:  6000

或者直接禁用掉超时设置:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled:  false

 

还一个就是restTemplate的超时,比如这个:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://ooxx/addNumber": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:633) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
        at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:380) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
        at org.springframework.web.client.RestTemplate$$FastClassBySpringCGLIB$$aa4e9ed0.invoke(<generated>) ~[

直接换个restTemplate的构造方式:

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        //By default RestTemplate uses SimpleClientHttpRequestFactory which depends on default configuration of HttpURLConnection.
        //If you want to use HttpComponentsClientHttpRequestFactory - it has a connection pooling configuration which SimpleClientHttpRequestFactory does not have.

//毫秒
//        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
//        requestFactory.setConnectTimeout(60000);
//        requestFactory.setReadTimeout(10000);

        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setConnectionRequestTimeout(5000);
        requestFactory.setConnectTimeout(5000);
        requestFactory.setReadTimeout(60000);

        return new RestTemplate(requestFactory);
    }

 

© 著作权归作者所有

共有 人打赏支持
p
粉丝 1
博文 21
码字总数 13506
作品 0
九龙坡
私信 提问
Hystrix介绍以及服务的降级限流熔断

介绍 首先在这里给粉丝道个歉,由于这一段时间比较忙,没有更新大数据,因为项目上用到了Spring cloud,所以在以后的日子里,会将Spring cloud纳入更新的范畴,好了,言归正传。 据我了解,现...

ROCK_杰哥
07/07
0
0
微服务开发架构——Spring Cloud常见问题与总结Hystrix/Feign 整合Hystrix后首次请求失败

个人GitHub地址:https://github.com/leebingbin/ 在使用Spring Cloud的过程中,难免会遇到一些问题。所以对Spring Cloud的常用问题做一些总结。 关于“Eureka常见问题”可以参考,我之前的文...

Mr_ET
2017/10/30
0
0
Spring Cloud: 使用kill命令优雅关闭微服务, 解决退出时Eureka取消注册操作耗时过长的坑

关于Spring Cloud服务优雅关闭的方案有很多种了,这里介绍一下使用命令优雅关闭的方案,并解决会出现的问题。 所谓的优雅指两方面,一是程序在退出时要主动向Eureka取消注册自己,二是完成资...

司青玄
05/23
0
0
性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

本文为转载文章,作者:中华石杉,十余年BAT架构经验,倾囊相授。作者微信公众号:石杉的架构笔记(ID:shishan100) 一、写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务...

方志朋
11/12
0
0
Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?

Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入...

eacdy0000
2017/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java二分查找代码案例

public static int binarySearch(Integer[] srcArray, int des) { //定义初始最小、最大索引 int low = 0; int high = srcArray.length - 1; //确保不会出现重复查找,越界 while (low <= hi......

绝地逢生
14分钟前
2
0
在JAVA中线程到底起到什么作用!

这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(...

xtof
27分钟前
1
0
纹理与表面细节添加方法---帧映射

中国龙-扬科
43分钟前
0
0
vue学习:9、模块工具包收集

vue常用包收集 npm i webpack@3.6.0 -s 样式支持包 npm i css-loader -s npm i style-loader -s 图片支持 npm i url-loader file-loader -s 利用less操作图片 npm i less -s npm i less-loa......

轻轻的往前走
44分钟前
1
0
20181115上课截图

小丑鱼00
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部