netflix-hystrix团队开发了hystrix-javanica,使用流行的java注解以及函数式编程,来替代hystrix枯燥的编程方法.
其主要是HystrixCommand注解的使用.
/**
* Sync Execution
*/
@HystrixCommand(fallback="syncFallback")
public List<User> findUsers(User param){
return userRepository.find(param);
}
/**
* Aysync Execution
*
*/
@HystrixCommand(fallback="asyncFallback")
public Future<List<User>> findUsers(User param){
return new AsyncResult<List<User>>(){
public List<User> invoke() {return userRepository.find(param)}
};
}
Future<List<User>> future = userService.findUser(param);
List<User> users = funture.get();
/**
* Reactive Execution
*/
@HystrixCommand
public Observable<List<User>> findUsers(User param){
return new Observer.create(subscriber->{
if(!subscriber.isUnscribed(){
subscriber.onNext(userRepository.find(param);
subscriber.onCompleted ();
}
})
}
Observable obsevable = userService.findUser(param);
List<User> users = observable.toBlocking().single();
/**
* 降级方法必须的参数应该与被执行的方法参数一致,否则hystrix不会查询到降级方法,会直接抛出异常
* 降级方法也可以同步异步执行
/
@HystrixCommand(fallback="defaultFallback")
private List<User> syncFallback(User param){
return Lists.newArrayList(new User("zhangsan",23));
}
/**
* Async Execution Command Async Fallback
* Throwable 参数是可选的
*
/
@HystrixCommand(fallback="defaultFallback")
private Future<List<User>> async(User param,Throwable e){
return new AysncResult<List<User>>(){
public List<User> invoke() { return Lists.newArrayLists(new User("default",22))}
}
}
降级(fallback)方法也可以被降级
private List<User> defaultFallback(User param){
return null;
}