springboot+Hystrix+eureka+Openfeign实现分布式生产者消费者直接的调用以及解决服务降级、服务熔断、服务限流等问题+服务监控hystrixDashboard(2)

springboot+Hystrix+eureka+Openfeign实现分布式生产者消费者直接的调用以及解决服务降级、服务熔断、服务限流等问题(2)
本博客主要介绍Hystrix服务熔断
断机制概述
断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,
进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
检测到该节点微服务调用响应正常后,
复调用链路。

Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,
当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand

作者笔记
https://martinfowler.com/bliki/CircuitBreaker.html
断路器的基本原理非常简单。将受保护的函数调用包装在断路器对象中,该对象将监视故障。一旦故障达到一定阈值,断路器将跳闸,并且所有进一步的断路器调用都会返回错误,而根本不会进行受保护的调用。通常,如果断路器跳闸,您还需要某种监视器警报。
在这里插入图片描述
这个简单的断路器避免了在电路断开时发出受保护的呼叫,但是当情况恢复正常时,将需要外部干预才能将其重置。对于建筑物中的电路断路器,这是一种合理的方法,但是对于软件断路器,我们可以让断路器本身检测基础调用是否再次正常工作。我们可以通过在适当的时间间隔后再次尝试受保护的调用来实现这种自重置行为,并在成功后重置断路器。

在这里插入图片描述
服务熔断的流程:服务降级-服务熔断-恢复正常
服务熔断的案例如下
在生产者的service方法中添加一个方法,想要全部生产者项目的可以看
https://blog.csdn.net/qq_39990869/article/details/108863199
这里只是添加了一个方法来验证服务熔断是否生效。其余pom,yml,启动类均不变。
只是写一个service层的方法然后在controller层调用实现页面显示。
下面将以下此方法中出现的配置的含有
@HystrixCommand注解在服务降级和熔断的时候都能用,就行一个集合一样里面有很多不同含有的配置
fallbackMethod = "paymentCircuitBreaker_fallback"服务降级的兜底类,当这个方法出现超时、运行异常或者是服务器宕机时会启用服务降级来访问这个兜底类,兜底类的含有就是不管是什么问题我都得有一个来解释到底咋回事的人或者是来通知让大家稍等的人。
下面是服务熔断的几种配置:
@HystrixProperty(name = “circuitBreaker.enabled”,value = “true”)//请求次数
@HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”,value = “10”), //请求次数
@HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”,value = “10000”), //时间范围
@HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”,value = “60”), //失败率达到多少后跳闸
上面的四种配置总的含义就是说当在10秒的时间范围内请求10次错误率高达60%以上时会打开熔度器造成服务熔断。

//以下方法是服务熔断案例
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",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"), //失败率达到多少后跳闸
             })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id){
        if (id < 0){
            throw new RuntimeException("*****id 不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();
        return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
    }
    //熔断案例服务降级兜底方法
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
        return "id 不能负数,请稍候再试,(┬_┬)/~~     id: " +id;}

controller调用

//以下是服务熔断案例
     @GetMapping("/payment/circuit/{id}")
     public String paymentCircuitBreaker(@PathVariable("id") Integer id){
        String result = paymentService.paymentCircuitBreaker(id);
        log.info("*******result:"+result);
        return result;
    }

当新建好方法后启动项目,我们先来一次正确的访问可以看到输出的结果是正确的,
我们在写一个负的id可以看到输出的结果是错误的,是因为进行了服务的降级,
接着我们来验证服务熔断,方法是在10秒的范围内连续用负id进行十次以上的访问,然后马上写一个正确的id,可以看到也会输出错误,但是当我们不断访问几次后就会发现同一个id现在正确了,这是因为熔断器在开启熔断后会不断的去判断访问的正确率,当正确率持续上升时就会恢复服务关闭掉熔断。这个恢复是需要时间并且成功率要连续增加的,如果还是失败率连续大于60%还是会启动熔断器。

以上一段话的总结就是熔断器开启-熔断器半开-熔断器关闭
就像一个人不断的犯错误我们就要
断路器在什么情况下起作用
在这里插入图片描述

断路器开启或者关闭的条件:
1.当满足一定阀值的时候(默认10秒内超过20个请求次数)
2.当失败率达到一定的时候(默认10秒内超过50%请求失败)
3.到达以上阀值,断路器将会开启
4.当开启的时候,所有请求都不会进行转发
5.一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5

服务端用单独配置或者全局配置兜底方法最好不要用feign的那个配置兜底的方法,可能不是很好的实现熔断
只是自己的意见
在这里插入图片描述

@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")  //全局的

//消费者端的服务熔断(用全局的DefaultProperties可以配置单独的降级,FeignClient好像不能做单独的配置,单独配置之前一定要是全局的不能是Feign)
//    @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"), //失败率达到多少后跳闸
//    })
//    @GetMapping("/consumer/payment/circuit/{id}")
//    public String paymentCircuitBreaker(@PathVariable("id") Integer id){
//        String result=paymentHystrixService.paymentCircuitBreaker(id);
//        log.info("*******result:"+result);
//        return result;
//    }

在这里插入图片描述
具体的步骤
https://github.com/Netflix/Hystrix/wiki/How-it-Works

下面介绍服务监控hystrixDashboard
在这里插入图片描述
新建一个hystrixDashboard的项目用于图形化展示
pom.xml

<!--新增hystrix dashboard-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml文件

server:
  port: 9001

启动类@EnableHystrixDashboard表示启动hystrixDashboard服务监控

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardMain9001.class,args);
    }
}

启动项目如果出现下图证明成功搭建hystrixDashboard服务监控
在这里插入图片描述

然后在需要监控的项目中加入

<dependency>    
<groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency> 

在启动类中加入

@Bean
    public ServletRegistrationBean getServlet(){
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);    registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

然后启动需要监控的项目
打开http://localhost:9001/hystrix这里的端口号是hystrixDashboard项目的端口号
输入被监控项目的http://localhost:8001/hystrix.stream
在这里插入图片描述
然后点击按钮进入到监控页面
在这里插入图片描述
然后访问项目的接口正确返回和错误返回都试试
在这里插入图片描述

可以看到上图出现了一条曲线,说明在访问项目,服务熔断现在是关闭的
然后再访问错误的

现在可以看到服务熔断是开启的

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值