0%

Hystrix线程隔离

Hystrix线程隔离

在微服务框架中,可能一个服务需要调用多个微服务,在tomcat中运行时,tomcat只是分配了100个线程,由于多个服务之间调用的时间消耗过长,可能会导致线程耗尽,而在Hystrix中存在线程隔离,对于每个微服务分配一个线程池,访问某个微服务时就从对应的线程池中取线程,如果对应线程池中的线程都用光了,那么就认为该服务不可用了,如果在需要请求该微服务,则直接返回

那么这个线程池是存在于哪里呢?

线程池的维护是在HystrixCommand这个类中,不需要程序员处理,程序员只需要告诉它: 我需要几个线程,就可以了

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// 继承HystrixCommand
public class RestTemplateHystrixCommand<T> extends HystrixCommand<T> {

/**
* 请求地址
*/
private String url;

/**
* 请求体
*/
private Object requestBody;

/**
* 完整参数类型
*/
private ParameterizedTypeReference<T> responseType;

/**
* 请求头
*/
private HttpHeaders httpHeaders;

/**
* 微服务调用使用 发送json(返回格式为泛型)
*
* @param url 请求地址
* @param requestBody 请求体
* @param responseType 泛型类型
*/
RestTemplateHystrixCommand(String url, Object requestBody,
ParameterizedTypeReference<T> responseType) {
super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(url)));
this.url = url;
this.requestBody = requestBody;
this.responseType = responseType;
}

/**
* 回调
*
*/
@Override
protected T getFallback() {
Throwable executionException = getExecutionException();
log.error("[restTemplate生成器]restTemplate发送失败", executionException);
throw new HystrixBadRequestException(executionException.getMessage());
}

public T send() {
return this.execute();
}

//父类HystrixCommand的execute方法会调用该run()方法
@Override
protected T run() {
RestTemplate restTemplate = Springs.getBean("restTemplate",RestTemplate.class);
T result;
ResponseEntity<T> resultEntity;
HttpEntity entity;
HttpHeaders headers = new HttpHeaders();
if (httpHeaders != null && !httpHeaders.isEmpty()) {
headers.addAll(httpHeaders);
}
if (requestBody != null) {
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
entity = new HttpEntity<>(requestBody, headers);
}

try {
resultEntity = restTemplate.exchange(url, org.springframework.http.HttpMethod.POST, entity,responseType);
result = resultEntity.getBody();
} catch (Exception e) {
throw new HystrixBadRequestException("[restTemplate异常]" + e.getMessage(), e);
} finally {

}

return result;
}

}