SpringCloud课程:15.Hystrix断路器简介 与 服务降级

Easter79
• 阅读 665

Hystrix断路器

一、概述

分布式系统面临的问题

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

服务雪崩

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的 “扇出效应”  如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓“雪崩效应”

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选响应(Fallback).而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用发的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩

 

1.    作用

服务降级
服务熔断
接近实时的监控

2.    现状:停更进维

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

Hystrix官宣,停更进维

Hystrix is no longer in active development, and is currently in maintenance mode.

二、Hystrix重要概念

1.    服务降级 FallBack

        向调用方返回一个复合预期的可处理的备选响应,如 “服务器忙,请稍后再试!”不让客户等待并立刻返回一个友好提示。FallBack
哪些情况会触发降级

  •             程序运行异常
  •             超时
  •             服务熔断触发服务降级
  •             线程池/信号量打满也会导致服务降级

2.    服务熔断   Break

        类似保险丝达到最大服务访问后,直接拒绝访问,然后用服务降级的方法返回友好提示。
        就是保险丝->服务降级-进而熔断-恢复调用链路

3.    服务限流  Flowlimit

        秒杀高并发等操作,严禁拥挤,排队1秒N个,有序进行

三、Hystrix 案例

1.构建

1.1 新建module

cloud-provider-hystrix-payment8001

1.2 pom

需引入 spring-cloud-starter-netflix-hystrix 和 Eureka

    <dependencies>
        <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>

        <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>
            <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>

1.3 yml

server:
  port: 8001
spring:
  application:
    name: cloud-provider-hystrix-payment
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

1.4 main

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

1.5 service

@Service
public class PaymentService {
    /*正常访问OK的*/
    public String paymentInfo_OK(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,ID: "+id;
    }
    public String paymentInfo_Timeout(Integer id) {
        try{
            TimeUnit.SECONDS.sleep(3);}
        catch (    InterruptedException e){
            e.printStackTrace();
        }
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_Timeout,ID:"+id;
    }
}

1.6 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;
    }
    @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;
    }


}

1.7 启动本服务 和 Eureka服务

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

1.8 查看正常访问耗时

3000ms 

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

不到10ms

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

2.Jmeter高并发测试8001

2.1 新建线程组

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

2.2 开启压测后 两个接口耗时明显增多

开启压测后查看耗时

ok:1700ms

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

timeout:  4200ms

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

tomcat的默认工作线程数被打满了,没有多余的线程来分解压力和处理。

2.3 结论

上面是服务提供者自测,如果消费者访问,只能干等,最终导致消费端80不满意,服务端8001直接被拖死。

3.新建消费者80 使用消费者测试接口

3.1. 新建module cloud-consumer-feign-hystrix-order80

3.2 pom

    <dependencies>
        <!--open feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.zhl.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <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>
            <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>

3.3. yml

server:
  port: 80

spring:
  application:
    name: cloud-consumer-feign-hystrix-order80

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

3.4 main

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

3.5 Service

com.zhl.springcloud.service.PaymentHystrixService

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

3.6 Controller

com.zhl.springcloud.controller.OrderHystrixController

@RestController
@Slf4j
public class OrderHystrixController {
    @Resource
    PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_OK(id);
    }
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    public String paymentInfo_TimeOut(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
}

3.7 调用测试

测试OK接口 耗时8ms

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

开启JMeter进行压测后,再访问

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

4.故障现象和导致原因

8001 访问繁忙,客户端相应缓慢。

5.结论

正因为有上述故障或不佳表现,才有 降级、容错、限流技术诞生。

6.如何解决?解决的需求

  • 服务提供者超时、服务器变慢:消费者不能一直等待,必须有服务降级
  • 服务提供者出错(宕机或程序运行出错):消费者不能一直等待,必须有服务降级
  • 消费者等待时间小于服务提供者运行时间,消费者自己处理降级。

7. 服务降级

7.1.降级配置

    @HystrixCommand

7.2 服务提供者分析

    设置自身调用超时时间峰值,峰值内可以正常运行超过了需要有兜底的方法处理,作服务降级fallback

7.3 服务提供者8001服务降级代码优化

    一旦调用服务方法失败并抛出了错误信息后会自动调用@HystrixCommand标注好的fallbackMethod调用类中指定的方法

    超时 或 降级 都由fallbackMethod处理

    使用@HystrixCommand 注解 标注超时处理方法,

7.4 服务提供者8001服务降级优化

7.4.1 Service:

    com.zhl.springcloud.service.PaymentService

@Service
public class PaymentService {
    /*正常访问OK的*/
    public String paymentInfo_OK(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,ID: "+id;
    }

    /*超时 或 降级 都由fallbackMethod处理*/
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            //正常超时时间3秒,超时执行fallbackMethod
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_Timeout(Integer id) {
        int timenumner=5;
        try{
            TimeUnit.SECONDS.sleep(timenumner);}
        catch (    InterruptedException e){
            e.printStackTrace();
        }
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_Timeout,ID:"+id+"\t"+"耗时:"+timenumner;
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_Timeout,ID:"+id+"\t"+"降级处理";
    }
}

7.4.2 主启动类激活 添加新注解 @EnableCircuitBreaker

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

7.4.3 超时降级测试

服务需要5秒,3秒返回降级信息。

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

7.4.4 异常测试

修改业务类

    /*超时 或 降级 都由fallbackMethod处理*/
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            //正常超时时间3秒,超时执行fallbackMethod
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_Timeout(Integer id) {
        int timenumner=5;
        /*测试报错*/
        int age=10/0;
        try{
            TimeUnit.SECONDS.sleep(timenumner);}
        catch (    InterruptedException e){
            e.printStackTrace();
        }
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_Timeout,ID:"+id+"\t"+"耗时:"+timenumner;
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" 系统繁忙或运行保存,请稍后再试,ID:"+id+"\t"+"降级处理";
    }

访问测试:

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

7.5 消费者服务80 服务降级

7.5.1 YML 配置OpenFeign 支持 Hystrix

server:
  port: 80

spring:
  application:
    name: cloud-consumer-feign-hystrix-order80
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
#OpenFeign开启Hystrix
feign:
  hystrix:
    enabled: true

7.5.2 Main 开启熔断器@EnableCircuitBreaker

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

7.5.3 Controller

com.zhl.springcloud.controller.OrderHystrixController

@RestController
@Slf4j
public class OrderHystrixController {
    @Resource
    PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_OK(id);
    }
    /*1.5秒超时*/
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    public String paymentInfo_TimeOut(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己运行出错请检查自己 (╥╯^╰╥)";
    }
}

7.5.4 服务提供者业务代码 5秒超时,3秒业务处理时间

@Service
public class PaymentService {
    /*正常访问OK的*/
    public String paymentInfo_OK(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,ID: "+id;
    }

    /*超时 或 降级 都由fallbackMethod处理*/
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            //正常超时时间3秒,超时执行fallbackMethod
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "5000")
    })
    public String paymentInfo_Timeout(Integer id) {
        int timenumner=3;
        /*测试报错*/
        try{
            TimeUnit.SECONDS.sleep(timenumner);}
        catch (    InterruptedException e){
            e.printStackTrace();
        }
        return  "线程池:"+Thread.currentThread().getName()+" paymentInfo_Timeout,ID:"+id+"\t"+"耗时:"+timenumner;
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "线程池:"+Thread.currentThread().getName()+" 系统繁忙或运行保存,请稍后再试,ID:"+id+"\t"+"降级处理";
    }
}

7.5.5 超时测试效果 提供者3秒 消费者1.5秒

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

7.5.6 消费者自己出错测试

int age=10/0 测试出错

    /*1.5秒超时*/
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    public String paymentInfo_TimeOut(@PathVariable("id")Integer id){
        int age=10/0;
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己运行出错请检查自己, (╥╯^╰╥)";
    }

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

7.6 服务降级全局配置

目前每个业务对应一个兜底的方法,代码膨胀,需要统一和自定义分开。

7.6.1 Controller级别配置

    在Controller加@DefaultPropertie注解,指定控制器内全局处理方法 .

com.zhl.springcloud.controller.OrderHystrixController

     在接口上只引用@HystrixCommand ,不用指定fallbackMethod. 

    定义一个Controller全局的处理方法,这里为ControllerGlobalFallBack

注意:

接口级别的Fallback Method需要参数与返回类型与接口一致。

类级别的 FallbackMethod 这里为ControllerGlobalFallBack 不能有参数,否则报错 fallback method wasn't found:

@RestController
@Slf4j
/*Controller级别默认处理方法*/
@DefaultProperties(defaultFallback = "ControllerGlobalFallBack")
public class OrderHystrixController {
    @Resource
    PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_OK(id);
    }
    /*1.5秒超时*/
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    /*自定义指定处理方法*/
    /*@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })*/
    @HystrixCommand
    public String paymentInfo_TimeOut(@PathVariable("id")Integer id){
        //int age=10/0;
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己运行出错请检查自己, (╥╯^╰╥)";
    }
    /*Controller全局FallBack处理*/
    public String ControllerGlobalFallBack(){
        return "ControllerGlobalFallBack";
    }
}

7.6.2 服务调用接口统一配置

新建一个类 实现FeignClient所在接口

@Component
public class HystrixPaymentFallBackService implements PaymentHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "---HystrixPaymentServiceImpl_paymentInfo_OK fallback ";
    }

    @Override
    public String paymentInfo_TimeOut(Integer id) {
        return "----HystrixPaymentServiceImpl_paymentInfo_TimeOut fallback";
    }
}

YML开启Feign

#OpenFeign开启Hystrix
feign:
  hystrix:
    enabled: true

controller 中取消 @HystrixCommand 的注解

@RestController
@Slf4j
/*Controller级别默认处理方法*/
//@DefaultProperties(defaultFallback = "ControllerGlobalFallBack")
public class OrderHystrixController {
    @Resource
    PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String paymentInfo_OK(@PathVariable("id")Integer id){
        return paymentHystrixService.paymentInfo_OK(id);
    }
    /*1.5秒超时*/
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    /*自定义指定处理方法*/
    /*@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler",commandProperties = {
            @HystrixProperty( name="execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })*/
    /* @HystrixCommand*/
    public String paymentInfo_TimeOut(@PathVariable("id")Integer id){
        //int age=10/0;
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
    /*降级处理*/
    public   String paymentInfo_TimeoutHandler(Integer id){
        return  "我是消费者80,对方支付系统繁忙,请10秒钟后再试或者自己运行出错请检查自己, (╥╯^╰╥)";
    }
    /*Controller全局FallBack处理*/
    public String ControllerGlobalFallBack(){
        return "ControllerGlobalFallBack";
    }
}

访问timeout接口测试

SpringCloud课程:15.Hystrix断路器简介 与 服务降级

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Nebula Graph 在微众银行的实践
本文为微众银行大数据平台工程师——周可在nMeetup深圳场的演讲文字稿,演讲视频参见:B站(戳「阅读原文」观看)!(https://oscimg.oschina.net/oscnet/884d81502c744b76be00eb2a1b07d3c7.png)自我介绍下,我是微众银行大数据平台的工程
Stella981 Stella981
3年前
Nepxion Discovery 5.5.0 发布
!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
3年前
SpringCloud笔记六:Hystrix
\TOC\Hystrix是什么?Hystrix是一个断路器,主要作用是服务熔断。我举个例子,比如我想访问服务A,但是服务A依赖服务B,服务B依赖服务C...这种多个服务之间依赖调用称为扇出(就像一把折扇缓缓打开一样)倘若某个服务反应的时间很长,或者服务不可用了,那么对服务A的调用会占用系统越来越多的资源,直至系统崩
Easter79 Easter79
3年前
SpringCloud 进阶之Hystrix(断路器)
1\.Hystrix断路器Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性;"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k