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