Hystrix豪猪哥(上)

Posted 人可资讯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hystrix豪猪哥(上)相关的知识,希望对你有一定的参考价值。

优质文章,及时送达
感谢技术支持-阳哥

10. Hystrix断路器

概述

分布式系统面临的问题

  • 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败

Hystrix豪猪哥(上)

  • 服务雪崩  

Hystrix豪猪哥(上)

Hystrix是什么

Hystrix豪猪哥(上)

Hystrix能干嘛

  • 服务降级

  • 服务熔断

  • 接近实时的监控

  • ......  (最主要的就是上面三个)


官网资料

https://github.com/Netflix/Hystrix/wiki/How-To-Use

Hystrix官宣,停止更新,进行维护



Hstrix 重要概念

服务降级  fallback

  • 服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好的提示,fallback

  • 哪些情况会发出降级

    • 程序运行异常

    • 超时

    • 服务熔断触发服务降级

    • 线程池 / 信号量打满也会导致服务降级

服务熔断  break

  • 类比保险丝达到最大服务访问后,直接拒绝访问拉闸限电,然后调用服务降级的方法并返回提示

  • 就是保险丝

    • 服务的降级 --> 进而熔断  ---> 再慢慢地恢复调用链路

服务限流  flowlimit

  • 秒杀、高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行



Hystrix案例

构建

新建module      cloud-provider-hystrix-payment8001

POM

 <dependencies>
     <!--hystrix-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
     </dependency>
     <!--eureka client-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
     <!--web-->
     <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><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
         <groupId>com.woxueit.springcloud</groupId>
         <artifactId>cloud-api-commons</artifactId>
         <version>${project.version}</version>
     </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

  • hystrix8001

 server:
  port: 8001
 
 spring:
  application:
    name: cloud-provider-hystrix-payment
 
 eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
       #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka   #集群版
      defaultZone: http://eureka7001.com:7001/eureka #单机版,这里为了节约时间,启动快,临时改为单机版,以后用集群再改回来
  • 7001  ------------>>>>>这里为了节约时间,启动快,也临时改为单机版,以后用集群再改回来

     eureka:
      client:
        service-url:
         #集群指向其它eureka
           #defaultZone: http://eureka7002.com:7002/eureka/
         #单机就是7001自己
          defaultZone: http://eureka7001.com:7001/eureka/

主启动    PaymentHystrixMain8001

 @SpringBootApplication
 @EnableEurekaClient

业务类

  • 为了节约时间,就不写dao层,mybatis了,省略了,业务层实现类也不写了

  • PaymentService

     package com.woxueit.springcloud.service;
     
     @Service  //不要忘记写这个注解
     public class PaymentService
     {
         /**
          * 正常访问,肯定OK
          * @param id
          * @return
          */
         public String paymentInfo_OK(Integer id)
        {
             return "线程池: "+Thread.currentThread().getName()+" paymentInfo_OK,id: "+id+"\t"+"O(∩_∩)O哈哈~";
        }
     
      //模拟一个复杂的业务,耗时3秒
         public String paymentInfo_TimeOut(Integer id)
        {
             int timeNumber = 3000;
             try { TimeUnit.MILLISECONDS.sleep(timeNuber); } catch (InterruptedException e) { e.printStackTrace(); }
             return "线程池: "+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O哈哈~"+" 耗时(秒):"+timeNumber;
        }
     
     
     }
  • PaymentController

     package com.woxueit.springcloud.controller;
     
     @RestController
     @Slf4j
     public class PaymentController
     {
         @Resource
         private PaymentService paymentService;
     
         @Value("${server.port}")
         private String serverPort;
     
         //正常访问的情况
         @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;
        }
     
         //模拟复杂业务,耗时3秒
         @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;
        }
     
     
     }

正常测试

  • 启动eureka7001

  • 启动hystrix8001

  • 访问

    • 成功的方法       localhost:8001/payment/hystrix/ok/1

    Hystrix豪猪哥(上)

    • 每次调用耗时3秒的方法     localhost:8001/payment/hystrix/timeout/1  ------>>>浏览器要转圈

    Hystrix豪猪哥(上)


  • 上述module均ok

    • 以上述为根基平台,后续我们要从正确-->>错误-->>降级熔断-->>恢复

至此,就完成了OpenFeign项目的简单认识

注:未完待续,敬请期待 Hystrix断路器(中)

往期干货推荐

1. 

2. 

3. 

4. 




以上是关于Hystrix豪猪哥(上)的主要内容,如果未能解决你的问题,请参考以下文章

Hystrix在工作中你至少需要知道的!--Ⅰ

Hystrix详解

Hystrix入门指南

Hystrix入门指南

分布式服务防雪崩熔断器,Hystrix理论+实战。

小白使用Hystrix