Hystrix服务容错降级使用

来源:互联网 发布:域名价值 编辑:程序博客网 时间:2024/05/17 06:34
maven的集成
<!--断路由,服务容错保护--><dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
  1. 构建Hystrix的Command对象, 调用执行方法.

  2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.

  3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.

  4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.

  5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

  6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

  7. 若服务执行成功, 返回正常结果.

  8. 若服务降级方法getFallback执行成功, 则返回降级结果.

  9. 若服务降级方法getFallback执行失败, 则抛出异常.


/
** * 服务容错 * Created by gaomin on 2017/12/12. */@Servicepublic 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;    }}
原创粉丝点击