Bootstrap

5-3 SpringCloud快速开发入门:自定义 Hystrix 请求的服务熔断处理、同步与异步调用、 请求异常熔断处理

接上一章节Hystrix 的服务降级与异常处理,这里讲讲自定义 Hystrix 请求的服务熔断处理、同步与异步调用、 请求异常熔断处理

自定义 Hystrix 请求的服务熔断处理

自定义类继承自 HystrixCommand 来实现自定义的 Hystrix 请求,在 getFallback 方法中调用 getExecutionException 方法来获取服务抛出的异常;而不是使用注解的方式

  • 为服务消费者创建自定义的Hystrix请求类:
import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;


/**
 * 自定义的Hystrix请求
 */
//HystrixCommand泛型类 由于我们服务提供者返回值是String类型 所以定义为String类型
public class HystrixCommandUtil extends HystrixCommand<String> {

    private RestTemplate restTemplate;

    //构造方法 赋值给this.restTemplate成员变量
    public HystrixCommandUtil (Setter setter,RestTemplate restTemplate){
        super(setter);
        this.restTemplate=restTemplate;
    }

    @Override
    protected String run() throws Exception {
        //调用远程服务
        return restTemplate.getForEntity("http://SPRINGCLOUD-SERVICE-PROVIDER/service/provide", String.class).getBody();
    }

    /**
     * 当远程服务超时,异常,不可用的情况时;会触发该熔断方法
     * @return
     */
    @Override
    public String getFallback(){
        //实现服务熔断/降级逻辑
        return "error";
    }
}

在这里插入图片描述

  • 调用创建的自定义的Hystrix请求方法进行测试:
@RequestMapping(value = "/web/hystrix/command")
    public String hystrixCommandController() {
        HystrixCommandUtil hystrixCommandUtil=new HystrixCommandUtil(com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")),restTemplate);
        return hystrixCommandUtil.execute();
    }

在这里插入图片描述

  • 负载均衡访问到服务提供者1,发生(超时)异常,服务熔断默认一秒超时

在这里插入图片描述

在这里插入图片描述

自定义 Hystrix 请求的同步与异步调用

  • 给自定义 Hystrix 请求的方法,服务消费者分别进行同步与异步调用
@RequestMapping(value = "/web/hystrix/command")
    public String hystrixCommandController() throws ExecutionException, InterruptedException {
        HystrixCommandUtil hystrixCommandUtil=new HystrixCommandUtil(com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")),restTemplate);

        //同步调用(该方法执行后,会等待远程的返同结果,拿到了远程的返同结果,该方法才返回,然后代码继续往下执行)
        //String str=hystrixCommandUtil.execute();

        //异步调用(该方法执行后,不会马上有远程的的返回结果,将来会有结果)
        Future<String> future=hystrixCommandUtil.queue();

        //写一下业务逻辑处理,提高系统性能

        //阻塞的方法,直到拿到结果
        String str=future.get();
        return str;
    }

在这里插入图片描述

自定义 Hystrix 请求异常熔断处理

  • 自定义 Hystrix 请求类加入异常补获

在这里插入图片描述

  • 负载均衡请求到服务提供者1(超时异常),发生异常,获取异常信息

在这里插入图片描述

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;