文档章节

spring cloud 里的 超时问题

p
 pigpig2008
发布于 2017/04/07 10:21
字数 394
阅读 108
收藏 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中,如何解决Feign/Ribbon第一次请求失败的问题?

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

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

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

司青玄
05/23
0
0
聊聊ribbon的超时时间设置

序 本文主要研究一下ribbon的超时时间设置 配置 实例 RibbonClientConfiguration spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/Ribb......

go4it
07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

白话SpringCloud | 第五章:服务容错保护(Hystrix)

前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用。在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如网...

oKong
24分钟前
0
0
【解惑】领略Java内部类的“内部”

内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中...

偶尔诗文
今天
1
0
sqlserver 2008 r2 直接下载地址(百度云)

之前下载的sqlserver2008发现不能附加,就卸载了,重新找到了sqlserver2008R2的百度云资源 卸载sqlserver2008还是有点麻烦,不过就是需要删除注册表中的信息 自己来回卸载了3次终于重装sqlse...

dillonxiao
今天
1
0
[Java]JVM调优总结 -Xms -Xmx -Xmn -Xss

JVM调优总结 -Xms -Xmx -Xmn -Xss 博客分类: Java General JVM应用服务器电信CMS算法 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可...

morpheusWB
今天
2
0
C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部