Hystrix能帮助服务在调用外部依赖时限流和降级,可在现有框架条件下按以下步骤集成Hystrix。
引入spring-cloud-starter-hystrix
修改POM,
注意exclude rxjava,否则会和现有slueth依赖冲突。
引入spring-cloud-starter-hystrix
1
2
3
4
5
6
7
8
9
10
11
|
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>
1.1
.
0
.RELEASE</version>
<exclusions
<exclusion>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
</exclusion>
</exclusions>
</dependency>
|
添加
EnableCircuitBreaker和
Configuration注解
EnableCircuitBreaker
1
2
3
4
5
6
7
|
@Configuration
@EnableCircuitBreaker
public
class
Application{
public
static
void
main(String[] args)
throws
Exception {
ApplicationStarter.run(Config.
class
, args);
}
}
|
配置文件增加默认配置
hystrix default settings
1
2
3
|
hystrix.command.
default
.execution.isolation.strategy=SEMAPHORE
hystrix.command.
default
.execution.isolation.semaphore.maxConcurrentRequests=
10
hystrix.command.
default
.execution.isolation.thread.timeoutInMilliseconds=
120000
|
注意:
- 上面execution.isolation.strategy现在必须设为SEMAPHORE,否则会影响调用链追踪、灰度发布的相关功能。
如果一个Hystrix Command同时最大请求数超过execution.isolation.semaphore.maxConcurrentRequests,后面请求会直接拒绝。可根据实际需要调整,或者按command isntance设置execution.isolation.semaphore.maxConcurrentRequests
isolation.thread.timeoutInMilliseconds也同样应用于semaphore isolation。
这里默认请求超时时间为120000milliseconds=2minutes,可根据业务方需要调整,或者按环境在application-dev.properties, application-[env].properties. 方便调试诊断问题。另外可以按command isntance设置execution.isolation.thread.timeoutInMilliseconds。
限流-Fail Fast
把对外部依赖的调用包装到一个方法,添加HystrixCommand注解。
Hystrix Fail Fast
@HystrixCommand
public
User getUserByIdSyncFailfast(
int
userId) {
return
userResource.findUserById(userId);
}
|
降级-Fail Silent or Fail Static
提供fallback方法,提供默认返回。注意fallback方法签名要和Hystrix添加注解的方法一致。
Hystrix Fail Silent
1
2
3
4
5
6
7
8
9
10
11
|
@HystrixCommand
(fallbackMethod=
"fallback"
)
public
User getUserByIdSync(
int
userId) {
return
userResource.findUserById(userId);
}
public
User fallback(
int
userId) {
User user =
new
User();
user.setId(userId);
user.setName(
"Fallback"
);
return
user;
}
|
自定义超时
下面的例子Hystrix注解的方法除了提供了fallback方法还调整了超时时间到1s(供demo)。
Hystrix customize Timeout
@HystrixCommand
(fallbackMethod=
"fallback"
,commandProperties = {
@HystrixProperty
(name =
"execution.isolation.thread.timeoutInMilliseconds"
, value =
"1000"
)
}
)
public
User getUserByIdTimeout(
int
userId) {
return
userResource.findUserById(userId);
}
|
异步调用
HystrixCommand注解可应用于Java Future,调用方使用和Future使用一样。
Hystrix aysn call with Java Future
@HystrixCommand
(fallbackMethod=
"fallback"
)
public
Future<User> getUserByIdAsync(
int
userId)
throws
IOException{
return
new
AsyncResult<User>() {
@Override
public
User invoke() {
System.out.println(
"Asychrous call back for hystrix"
);
return
userResource.findUserById(userId);
}
};
}
|