SpringCloud-Hystrix部分学习笔记

Hystrix

  • 学习视频https://www.bilibili.com/video/BV18E411x7eT
  • 源码地址https://gitee.com/zhu_xinmiao/springcloud

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6WgChvW-1596163829021)(image-20200518193251043.png)]

服务降级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHZ0Kt1O-1596163829024)(image-20200518222420911.png)]

服务熔断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1wonka5-1596163829027)(image-20200518222603323.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oxNz39NF-1596163829029)(image-20200730175130992.png)]

服务限流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hnqp8UKz-1596163829031)(image-20200518222651216.png)]

Hystrix支付微服务构建

具体代码部分可看源码。

  1. 导依赖,pom.xml

    <!--   hystrix     -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    
  2. 建立配置文件,application.yml

  3. 给主启动类加上eureka注解

    @EnableEurekaClient
    
  4. 建service层

    /**
         * 正常访问,肯定ok
         * @param id
         * @return
         */
        public String paymentInfo_OK(Integer id) {
            return "线程池:" + Thread.currentThread().getName() + "paymentInfo_OK,id:" + id + "\t正常";
        }
    
        @Override
        public String paymentInfo_TimeOut(Integer id) {
            int timeNum = 3;
            try {
                TimeUnit.SECONDS.sleep(timeNum);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "线程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut,id:" + id
                    + "\t耗时(秒):" + timeNum;
        }
    
  5. 建controller层

    @GetMapping("/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_OK(id);
        log.info("*****result:" + result);
        return result;
    }
    
    @GetMapping("/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        String result = paymentService.paymentInfo_TimeOut(id);
        log.info("*****result:" + result);
        return result;
    }
    
  6. 访问http://localhost:8001/payment/hystrix/ok/31和http://localhost:8001/payment/hystrix/timeout/31,前后端得到service层设定的输出结果即为初步搭建成功。

高并发时订单微服务尝试

新建cloud-consumer-feign-hystrix-order80子工程,作为消费端尝试连接高并发时的支付模块。

  1. 导依赖,pom.xml

  2. 建立配置文件,application.yml

  3. 给主启动类加上feign注解

    @EnableFeignClients
    
  4. 建service层, 通过@FeignClient注解去调用eureka中对应的微服务

    @Component
    @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
    public interface PaymentHystrixService {
        @GetMapping("/payment/hystrix/ok/{id}")
        String paymentInfo_OK(@PathVariable("id") Integer id);
    
        @GetMapping("/payment/hystrix/timeout/{id}")
        String paymentInfo_TimeOut(@PathVariable("id") Integer id);
    }
    
  5. 建controller层

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    String paymentInfo_OK(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_OK(id);
    }
    
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    
  6. 利用Jmeter给8001端口timeout方法加2w个访问请求,此时再调用消费端去访问支付端的微服务,会出现访问缓慢或是直接超时的问题。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DO9j7f1v-1596163829032)(image-20200722192201467.png)]

降级容错解决要求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhlKGh28-1596163829033)(image-20200722192909550.png)]

服务降级支付侧

当访问8001端口timeout方法出现超时或是运行出错的时候,需要一个兜底的方案,也可以理解为一个备用方法来取代报错的白叶或很久加载不出来的页面,这就是服务降级。

下面进行一个简单的演示和部分讲解,用的是之前Hystrix支付微服务构建中的service:

  • fallbackMethod = "paymentInfo_TimeOutHandler"指的是双引号中的方法为兜底的方法,一旦paymentInfo_TimeOut这个方法出现异常或是加载超时,就会去找兜底的方法执行。

  • commandProperties = {
    @HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”,value = “3000”)
    }

    指的是调用该方法的时限是value中的值,此处为3s,未达到3s的时候正常执行该方法,当该方法运行达到或是超过3s了,就会去执行兜底的方法。

@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String paymentInfo_TimeOut(Integer id) {
    int timeNum = 5;
    try {
        TimeUnit.SECONDS.sleep(timeNum);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "线程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut,id:" + id
            + "\t耗时(秒):" + timeNum;
}

public String paymentInfo_TimeOutHandler(Integer id) {
    int timeNum = 3;
    try {
        TimeUnit.SECONDS.sleep(timeNum);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "线程池:" + Thread.currentThread().getName() + "系统繁忙或者运行报错,请稍后再试,id:" + id
            + "\t超时了,这是个兜底方法";
}
  • 同时,在主启动类中需要加上**@EnableCircuitBreaker**注解

  • 然后访问对应微服务

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8xkkEFX-1596163829034)(image-20200722200209474.png)]

服务降级订单侧

  1. 主启动类加上**@EnableHystrix**注解

  2. 支付侧service层时间调为

    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
    })
    public String paymentInfo_TimeOut(Integer id) {
        int timeNum = 3000; //3s<5s,支付侧能正常运行
        try {
            TimeUnit.MILLISECONDS.sleep(timeNum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "paymentInfo_TimeOut,id:" + id
                + "\t耗时(秒):" + timeNum;
    }
    
  3. 编写订单侧controller方法

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    //原理和支付侧相同,超出时限或运行错误进行兜底方法
    @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    
    public String paymentTimeOutFallbackMethod(Integer id) {
        return "我是消费者80,对方支付系统繁忙请10秒后再试或者自己运行出错请检查自己";
    }
    

全局服务降级

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //全局的兜底方法
public class OrderHystrixController {
    @Resource
    private PaymentHystrixService paymentHystrixService;
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand //有配置就用就近配置,没有配置就用全局兜底方法
    String paymentInfo_TimeOut(@PathVariable("id") Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }

    //下面是全局fallback方法
    public String payment_Global_FallbackMethod(){
        return "Global异常处理信息,请稍后再试,o(╥﹏╥)o";
    }
}

通配服务降级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WULwbFx-1596163829035)(image-20200724141702243.png)]

  1. 给service层配上一个fallback

    //fallback代表兜底的类,类中实现了每一个方法对应的兜底方法
    @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
    
  2. 对应的fallback类

    @Component
    public class PaymentFallbackService implements PaymentHystrixService {
        @Override
        public String paymentInfo_OK(Integer id) {
            return "-------PaymentFallbackService fall back-paymentInfo_OK,o(╥﹏╥)o";
        }
    
        @Override
        public String paymentInfo_TimeOut(Integer id) {
            return "-------PaymentFallbackService fall back-paymentInfo_TimeOut,o(╥﹏╥)o";
        }
    }
    
  3. 测试

    正常访问ok方法没有问题,当我们关闭8001微服务,也就是服务端宕机的情况,就会跳转到service对应的兜底方法中。

服务熔断案例

  • 在service层配置对应的方法,原理同降级类似,出错或是未达到配置要求,就会去寻找兜底方法。

时间窗口期请求次数中,失败次数达到设定的失败率时,就会熔断,在短时间内输入正确的参数也会返回兜底方法,直到输入正确次数回到失败率以下或是经过一段时间后系统慢慢恢复,一般来说,这个一段时间是很短的。

// 服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties ={
        @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), //请求次数
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "1000"), //时间窗口期
        @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 不能负数,请稍后再试,o(╥﹏╥)o 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;
}
  • 总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Btyl98j-1596163829036)(image-20200731084649742.png)]

  • 断路器参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFrW0LEv-1596163829037)(image-20200731084901425.png)]

  • 断路器打开之后作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53Oy1RH4-1596163829039)(image-20200731085243464.png)]

  • 全部配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

图形化Dashboard搭建

  • 概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bdD5FTlv-1596163829046)(image-20200731090805710.png)]

  1. 写pom,主要用到的是下面这个依赖

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

    server:
      port: 9001
    
  3. 写主启动类,主要是要加上**@EnableHystrixDashboard**注解

  4. 启动后输入http://localhost:9001/hystrix见到以下界面说明开启成功

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIonfvpa-1596163829047)(image-20200731103855820.png)]

  5. 监控的要点有如下几条

    • 被监控程序的pom中要有如下依赖

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
      
    • 被监控程序主启动类中需添加以下配置

      /**
       * 此配置是为了服务监控而配置,与服务器容错本身无关,springcloud升级后的坑
       * ServletRegistrationBean因为springboot的默认路径不是/hystrix.stream
       * 只要在自己的项目里配置上下文的servlet就可以了
       */
      @Bean
      public ServletRegistrationBean getservlet(){
          HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
          ServletRegistrationBean<HystrixMetricsStreamServlet> registrationBean = new ServletRegistrationBean<>(streamServlet);
          registrationBean.setLoadOnStartup(1);
          registrationBean.addUrlMappings("/hystrix.stream");
          registrationBean.setName("HystrixMetricsStreamServlet");
          return registrationBean;
      }
      
    • 被监控程序主启动类需要**@EnableCircuitBreaker**注解

  6. 图形化界面介绍
    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。本课程是一门专业的Java微服架构开发实战课程,主要讲解了当下流行的SpringBoot框架、SpringCloud架构以及与第三方技术整合开发实战内容。通过本课程的学习,能够理解并掌握SpringBoot的基础知识,同时能够掌握SpringBoot与常用的第三方技术整合实现实际开发中的业务需求,包括实现Web开发、数据访问、缓存管理、安全管理、消息服务、任务管理等;了解并掌握SpringCloud微服务架构的基础知识及相关组件的应用,掌握微服务架构在企业级开发的实践,建立起微服架构思想。项目技术栈:采用SpringBoot简化商城系统的初始搭建以及开发过程采用SpringMVC+Spring+IBatis完成项目的整合采用Mysql作为数据库存储,Druid配置数据库连接池采用SpringCloud+Netflix 微服务技术栈的实战开发使用Redis完成缓存的数据存储,搭建Redis搭建主从、哨兵、集群应用,保证Redis的高可用使用ElasticSearch全文检索系统进行商品数据搜索,使用ElasticSearch搭建搜索服务的高可用使用Ngnix实现页面动静分离与负载均衡的配置采用FastDFS文件储存系统文件存储,完成广告图片、商品图片的上传和存储系统使用采用CAS+shiro单点登录系统实现用户认证使用ECharts根据后台查询数据生成图表使用POI实现了商城盈利状况的Excel表格导出。商品的详情页使用Thymeleaf完成页面静态化,减少页面数据展示延迟项目中使用SpringBoot下的Aop + 自定义注解完成用户行为记录,日志采集后台管理系统使用Shiro实现登录验证和权限管理(超级管理员、管理员、产品编辑员)项目整合微信完成订单的支付使用Redission完成分布式锁,生成订单的编号使用SpringCloud Alibaba Seat完成下订单模块的分布式事务(新增订单表,库存减少,库存超卖设计)使用RabbitMQ 做消息队列,完成订单未支付自动取消和模块直接的解耦合使用Quartz任务调度,完成缓存的定时刷新,保证缓存的一致性使用本地消息表机制完成消息然队列RabbitMQ消息可靠性传输订单支付模块使用微信扫码支付,并设置订单超时自动取消通过Jquery实现前端校验,通过基于Hibernate的Valida注解实现后端的校验功能使用Base64编码对Json数据传输进行编码和解码项目使用RESTful设计风格实现资源的访问,实现前后端分离项目使用聚合数据第三方短信平台完成用户的登陆功能项目使用SpringBoot整合JavaMail完成邮件的发送项目使用SpringBoot整合Swagger2生成接口文档使用PostMan完成接口的测试项目的测试:SpringTest、dbunit、EasyMock使用Docker 进行应用的自动化打包和发布、自动化测试和持续集成、部署和调整其他应用使用 PowerDesigner,完成数据库的建模项目使用禅道进行BUG管理环境采用Maven实施多模块项目构建,采用Git进行项目版本管理 架构解读:  项目部分截图:              讲义部分截图:          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值