• 服务熔断


    服务熔断

    熔断机制概述

    熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。

    当检测到该节点微服务调用响应正常后,恢复调用链路。

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

    服务熔断案例

    在子项目(cloud-provider-hystrix-payment8001),修改PaymentService

    //服务熔断=========
    
        @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( Integer id)
        {
            if(id < 0)
            {
                throw new RuntimeException("******id 不能负数");
            }
            String serialNumber = IdUtil.simpleUUID();
    
            return Thread.currentThread().getName()+"	"+"调用成功,流水号: " + serialNumber;
        }
        public String paymentCircuitBreaker_fallback(Integer id)
        {
            return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
        }
    

    在PaymentController

    //服务熔断===============
        @GetMapping("/payment/get/{id}")
        public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
            String result = paymentService.paymentCircuitBreaker(id);
            return result;
        }
    

    运行

    image-20201031163943532

    image-20201031164109421

    服务熔断总结

    熔断类型:

    • 熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设适中则进入半熔断状态。
    • 熔断关闭:熔断关闭不会对服务进行熔断
    • 熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断。

    Hystrix图形化Dashboard搭建

    image-20201031165754097

    创建一个子项目(cloud-consumer-hystrix-dashboard9001)

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud2020</artifactId>
            <groupId>com.atguigu.springcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-consumer-hystrix-dashboard9001</artifactId>
    
        <dependencies>
            <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>
    </project>
    

    创建application.yml

    server:
    	port: 9001
    

    创建主启动类HystrixDashboardMain9001

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

    运行http://localhost:9001/hystrix

    image-20201031171311611

    Hystrix图形化监控

    修改子项目(cloud-provider-hystrix-payment8001)里的主启动类PaymenthystrixMain8001

       /**
         *此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑
         *ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",
         *只要在自己的项目里配置上下面的servlet就可以了
         */
        @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;
        }
    

    运行

    image-20201101102013066

    image-20201101102108980

  • 相关阅读:
    SQL基本操作(工作中够用了)
    用Ajax爬取今日头条图片集
    (完整)爬取数据存储之TXT、JSON、CSV存储
    (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括
    基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!
    正则表达式功能概括
    常用的os库笔记
    软件测试阶段
    Python接口自动化测试(一)什么是接口?
    界面和易用性测试
  • 原文地址:https://www.cnblogs.com/striver20/p/13966759.html
Copyright © 2020-2023  润新知