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表格