Spring Cloud 实战三:超时机制

目前为止,已经搭建了简单的微服务框架,这时我们不得不考虑,如果服务超时我们应该怎么处理。
一、为什么要设置超时机制
1、客户端请求一个服务提供者,而 服务提供者响应非常缓慢,这时就会强制客户端等待,直到服务提供者完成响应。
2、在服务提供者响应完成之前,客户端的线程/进程得不到释放,如果大量请求未及时响应,就会造成客户端服务器资源耗尽。
二、超时配置

1、使用RestTemplate 模版,超时配置。

@SpringBootApplication
@EnableEurekaClient
public class ServiceUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceUserApplication.class, args);
    }
    /**
     *  向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。
     * @return
     */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory  = new SimpleClientHttpRequestFactory ();
        simpleClientHttpRequestFactory.setConnectTimeout(60000);
        simpleClientHttpRequestFactory.setReadTimeout(60000);
        return new RestTemplate(simpleClientHttpRequestFactory);
    }
}

这里配置的60秒。

我们在服务端service-user(端口为9001)中使响应超时

@RestController
@RequestMapping("/user/")
public class UserController {

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

    @RequestMapping("sayHello")
    public String getUser(@RequestBody String say) throws InterruptedException {
        Thread.sleep(120000L);
        return say + " say hello! port=" + port;
    }
}

这时调用服务:service-user 9001 则回抛超时异常。


如果负载均衡之后调用的9002(未超时),则成功。

2、ribbon设置超时。

看源码可知默认超时时间为2000毫秒


1、配置文件,配置超时时间

#请求超时

ribbon.ReadTimeout: 60000

#连接超时时间

ribbon.ConnectTimeout: 60000


这样,60秒之后会报超时异常


以上配置数据全局配置:可加上具体服务名称进行局部配置

SERVICE-USER.ribbon.ReadTimeout: 60000
SERVICE-USER.ribbon.ConnectTimeout: 60000

既在调用SERVICE-USER服务的时候才会生效。

2、使用@Bean配置超时

"ribbon.ReadTimeout”改为“SERVICE-USER.ribbon.ReadTimeout” 既进行了局部配置

@Bean
Request.Options requestOptions(ConfigurableEnvironment env){
    int ribbonReadTimeout = env.getProperty("ribbon.ReadTimeout", int.class, 60000);
    int ribbonConnectionTimeout = env.getProperty("ribbon.ConnectTimeout", int.class, 60000);

    return new Request.Options(ribbonConnectionTimeout, ribbonReadTimeout);
}
最后:github地址: https://github.com/houxi1234/demo.git

猜你喜欢

转载自blog.csdn.net/qq_32486913/article/details/80619749