SpringCloud 之 服务容错 Hystrix的简单使用

(此次创建的Demo小案例都是基于springBoot【2.0.0.M3】,springCloud【Finchley.M2】创建的,读者若是为了演示正常,请务必保持版本一致)

我们知道服务降级也是对网站访问的一种保护,对于用户而言也是一种友好的体验,所以服务的降级保护对于我们来说显得尤为重要,下面我们通过一个简单的demo进行演示

1)创建项目,创建过程就省略了,可以参见项目【SpringCloud 之 异步消息 RabbitMQ的集成以及简单实用】,这次我们我们就是用上次演示的案例,在此基础上进行修改拓展

2)pom文件中引入相关依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

3)启动类添加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker

其实这里我们呢可以用一个注解代替,那就是【@SpringCloudApplication】,我们点击查看这个注解,发现这一个注解已近包含了上面的三个注解,所以我们这里可以直接使用【@SpringCloudApplication】这一个注解

4)新建一个我们测试的方法

@RestController
public class HystrixController {

    @HystrixCommand(fallbackMethod = "fallback")
    @GetMapping("/getProductInfoList")
    public  String getProductInfoList(){
        //方便演示,这里直接使用RestTemplate的方式
        RestTemplate restTemplate=new RestTemplate();
        String result = restTemplate.postForObject("http://localhost:8080/product/listForOrder",
 Arrays.asList("157875227953464068"), String.class);
        return result;
    }

    //降级之后具体处理的业务方法
    public String fallback(){
        return "请求太热情,请稍后再试";
    }
  

}

 可以看到上面我们请求了  http://localhost:8080/product/listForOrder  这个远程的服务,在这个服务需要自己提前准备好。

我们一次启动项目,启动我们的product服务和我们的order服务

5)访问,当我们启动成功之后,访问我们新建的服务 http://localhost:8090/getProductInfoList 是可以访问到的

当我们停止掉远程服务product之后再次访问直接走我们的降级业务方法

我们还可以使用默认配置的方式


@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

    @HystrixCommand
    @GetMapping("/getProductInfoList")
    public  String getProductInfoList(){
        RestTemplate restTemplate=new RestTemplate();
        String result = restTemplate.postForObject("http://localhost:8080/product/listForOrder", 
Arrays.asList("157875227953464068"), String.class);
        return result;
    }
   
    //降级的业务方法
    public String defaultFallback(){
        return "默认请求方式:请求太热情,请稍后再试";
    }

}

6)服务的超时如何设置?

@HystrixCommand(commandProperties = {
	@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})

这样配置之后只要在三秒内服务都会等待请求,三秒之后就会走服务降级的方法

 

7)上面说完服务的讲降级,那么如何配置服务的熔断呢?

circuitBreaker,也叫做断路器,是Hystrix熔断机制采用的原理,下面是断路器的机理图,可以看到一共会有三种状态:

【closed】,【open】,【Half open】

 

 

 

 简单说明一下断路器原理:

当断路器确定是否需要打开统计一些请求和错误数据的时候,是有一个时间范围的,这个时间范围就是时间窗口,当断路器打开(Open状态)对主逻辑进行熔断之后,Hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑成为临时的主逻辑,当休眠时窗到期,断路器将进入半开状态(Half Open),释放一次请求到原来点额主逻辑上,如果此次请求正常返回,那么断路器将闭合(Closed),主逻辑恢复;如果此次请求依然有问题,断路器依然进行打开状态(Open);休眠时间窗重新计时

那么如何配置呢?详见如下:

@HystrixCommand(commandProperties = {
      @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),              //设置熔断
      @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),    //请求数达到后才计算
      @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗
      @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),  //错误率
})

 

 结合上面原理详细说明一下配置参数含义:

开启熔断机制:

@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),              //设置熔断

当断路器确定开启并开始统计一些请求和错误数据的时候,会开启一个时间窗,

@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗

我们设置了10秒。然后配置的如下参数,

 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),    //请求数达到后才计算

@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),  //错误率

在这10秒时间范围内,当请求数量达到十个及以上,并且这十个请求中有百分之60以上(也就是说10个请求由7个是错误的)的错误率时候,我们的降级逻辑会变为临时的主逻辑,当休眠时窗到期,断路器将进入半开状态(Half Open),释放一次请求到原来点额主逻辑上,如果此次请求正常返回,那么断路器将闭合(Closed),主逻辑恢复;如果此次请求依然有问题,断路器依然进行打开状态(Open);休眠时间窗重新计时

8)如何使用Hystrix的Dashboard ? Dashboard主要是我们可以通过界面对 服务的熔断降级的请求进行直观的分析和查看

,如何使用呢?

首先我们需要引入相关依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

然后启动添加注解【@EnableHystrixDashboard】

最后配置文件在原有的基础上配置

management:
  context-path: /

启动项目我们访问  http://localhost:8090/hystrix  可以看到如图界面

修改好我们的项目访问路径点击【Monitor Stream】

下面我们用postman模拟连续发出500个请求,看一下界面侦查请求的效果:

postman连续发送500个请求准备就绪

点击发送我们看一下 Dashboard的界面效果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值