我是靠谱客的博主 超级香菇,最近开发中收集的这篇文章主要介绍#Hystrix:服务熔断、服务降级 #自定义熔断: @FDDLC,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

先修课:#熔断器、断路器:Hystrix EnableDiscoveryClient EnableCircuitBreaker SpringCloudApplication @FDDLC

 

一、概念

1、服务熔断

假设A服务调用B服务,当B服务出现问题时,A服务也能兼容应对,就叫服务熔断。

 

2、服务降级

出现服务熔断时,A服务调用一个回退方法响应给用户,就叫服务降级。

 

 

二、超时熔断

Hystrix默认超时时间是1000毫秒。如果超时未响应,则触发熔断。

 

下面奉上一个超时的案例:

1、provider:

    @RequestMapping("/hystrix")
    public String hystrix() throws Exception{
        Thread.sleep(10000);
        return "I'm from the provider. If you can see me, it means the connection works well.";
    }

2、consumer:

    @RequestMapping("/hystrix")
    //timeoutInMilliseconds:设置熔断超时的时间
    @HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "8000")})
    public String hystrix(){
        return restTemplate.getForObject("http://provider/hystrix", String.class);
    }
    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(){
        return "I'm the fallbackMethod in consumer";
    }

3、请求:

 

三、provider自己异常触发的熔断

1、provider:

    @RequestMapping("/hystrix")
    public String hystrix() throws Exception{
        //Thread.sleep(10000);
        return "I'm from the provider. If you can see me, it means the connection works well.";
    }

2、consumer:

    @RequestMapping("/hystrix")
    //timeoutInMilliseconds:设置熔断超时的时间
    @HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
    public String hystrix(){
        int i=1/0;
        return restTemplate.getForObject("http://provider/hystrix", String.class);
    }
/*    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(){
        return "I'm the fallbackMethod in consumer";
    }*/

    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(Throwable throwable){
        return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
    }

 

3、请求:

 

四、provider异常触发的熔断

1、provider:

    @RequestMapping("/hystrix")
    public String hystrix() throws Exception{
        //Thread.sleep(10000);
        int i=1/0;
        return "I'm from the provider. If you can see me, it means the connection works well.";
    }

2、consumer:

    @RequestMapping("/hystrix")
    //timeoutInMilliseconds:设置熔断超时的时间
    @HystrixCommand(fallbackMethod = "fallbackMethod",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
    public String hystrix(){
        //int i=1/0;
        return restTemplate.getForObject("http://provider/hystrix", String.class);
    }
/*    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(){
        return "I'm the fallbackMethod in consumer";
    }*/

    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(Throwable throwable){
        return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
    }

3、直接访问provider:

 

4、consumer调用provider:

 

说明:发生异常后,回退方法中的Throwable参数会被封装相关的异常信息。

 

 

五、发生异常不熔断,直接返回异常给用户:自己的异常或者服务提供者的异常均可!

下面指定所有异常都不熔断,当然,也可以指定某种特定异常:

    @RequestMapping("/hystrix")
    //timeoutInMilliseconds:设置熔断超时的时间
    @HystrixCommand(fallbackMethod = "fallbackMethod", ignoreExceptions = Exception.class,commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")})
    public String hystrix(){
        //int i=1/0;
        return restTemplate.getForObject("http://provider/hystrix", String.class);
    }
/*    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(){
        return "I'm the fallbackMethod in consumer";
    }*/

    //注意:此方法不用加注解,返回值可以呈现给用户!
    public String fallbackMethod(Throwable throwable){
        return "I'm the fallbackMethod in consumer。"+throwable.getMessage();
    }

结果:

 

 

 

六、自定义熔断:HystrixCommand

1、provider:

    @RequestMapping("/hystrix")
    public String hystrix() throws Exception{
        //Thread.sleep(10000);
        //int i=1/0;
        return "I'm from the provider. If you can see me, it means the connection works well.";
    }

 

2、在consumer中自定义HystrixCommand:

package cn.consumer.config;


import com.netflix.hystrix.HystrixCommand;
import org.springframework.web.client.RestTemplate;

//注意:有两个HystrixCommand:一个是注解,一个是抽象类。千万不要导错了包!
public class MyHystrixCommand extends HystrixCommand<String> {
    private RestTemplate restTemplate;

    public MyHystrixCommand(Setter setter,RestTemplate restTemplate) {
        super(setter);
        this.restTemplate=restTemplate;
    }

    @Override
    protected String run() throws Exception {
        return restTemplate.getForObject("http://provider/hystrix", String.class);
    }

    @Override
    protected String getFallback() {
        return "getFallback()";
    }
}

 

3、在consumer的controller中使用HystrixCommand:

    //自定义熔断
    @RequestMapping("/myhystrix")
    public String myhystrix(){
        MyHystrixCommand myHystrixCommand=new MyHystrixCommand(
                com.netflix.hystrix.HystrixCommand.Setter.withGroupKey(
                        HystrixCommandGroupKey.Factory.asKey("")
                ), restTemplate);
        return myHystrixCommand.execute();
    }

 

4、结果:

无异常时:(把 int i = 1/0 注释掉)

 

发生异常时:(放开 int i = 1/0 的注释)

 

最后

以上就是超级香菇为你收集整理的#Hystrix:服务熔断、服务降级 #自定义熔断: @FDDLC的全部内容,希望文章能够帮你解决#Hystrix:服务熔断、服务降级 #自定义熔断: @FDDLC所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部