Hystrix服务容错降级使用

maven的集成
 
  
 <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-hystrixartifactId> 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.
 */
@Service
public class RestTemplateService {
    @Autowired
    protected RestTemplate restTemplate;

    @Autowired
    protected RedisTemplate 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 uriVariables = new HashMap();
        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 uriVariables = new HashMap();
        uriVariables.put("userId", userId);
        Map map = restTemplate.getForObject(url, HashMap.class, uriVariables);
        return map;
    }

}

你可能感兴趣的:(Hystrix)