Hystrix服务容错降级使用
maven的集成
<!--断路由,服务容错保护--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
- 构建Hystrix的Command对象, 调用执行方法.
- Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.
- 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.
- 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.
- 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
- 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.
- 若服务执行成功, 返回正常结果.
- 若服务降级方法getFallback执行成功, 则返回降级结果.
- 若服务降级方法getFallback执行失败, 则抛出异常.
/
**
* 服务容错
* Created by gaomin on 2017/12/12.
*/
@Service
public class RestTemplateService {
@Autowired
protected RestTemplate restTemplate;
@Autowired
protected RedisTemplate<String,Object> redisTemplate;
protected static String SERVICE_SPORTS = "http://SERVICE-SPORTS";
@Bean
@LoadBalanced
//开启负载均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
@HystrixCommand(fallbackMethod = "getUserErrorBack")
public Grade getUser(int userId) {
String url = SERVICE_SPORTS+"/sportsrest/getGrade?userId={userId}";
Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("userId", userId);
Grade grade = restTemplate.getForObject(url, Grade.class, uriVariables);
return grade;
}
/**
* 调用别的服务时,如果别的服务未响应,会导致本服务请求阻塞,这个可以解决断路由保护
* 直接返回error,默认请求时间2000毫秒
* @return
*/
public Grade getUserErrorBack(int userId){
return null;
}
/**
* 更新redis ,失败时回调
* @param user
*/
@HystrixCommand(fallbackMethod = "UpdateErrorBack")
public void updateUserInfoToRedis(User user){
String userkey = RedisStaticUtil.USER_INFO_KEY+user.getId();
redisTemplate.delete(userkey);
redisTemplate.opsForValue().set(userkey,user);
}
public void UpdateErrorBack(User user){
// 暂时不处理 redis更新失败 可以进行多次降级处理,
}
@HystrixCommand(fallbackMethod = "getTotalDistanceAndTimeErrorBack")
public Map getTotalDistanceAndTime(int userId) {
String url = SERVICE_SPORTS+"/sportsrest/getTotalDistanceAndTime?userId={userId}";
Map<String, Object> uriVariables = new HashMap<String, Object>();
uriVariables.put("userId", userId);
Map map = restTemplate.getForObject(url, HashMap.class, uriVariables);
return map;
}
}
下一篇:
将查询出的数据导出到Excel表格
