断路器

在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,最终导致自身服务的瘫痪。

举个例子,在一个电商网站中,我们可能会将系统拆分成,用户、订单、库存、积分、评论等一系列的服务单元。用户创建一个订单的时候,在调用订单服务创建订单的时候,会向库存服务来请求出货(判断是否有足够库存来出货)。此时若库存服务因网络原因无法被访问到,导致创建订单服务的线程进入等待库存申请服务的响应,在漫长的等待之后用户会因为请求库存失败而得到创建订单失败的结果。如果在高并发情况之下,因这些等待线程在等待库存服务的响应而未能释放,使得后续到来的创建订单请求被阻塞,最终导致订单服务也不可用。

什么是断路器

“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

在Spring Cloud中使用了Hystrix 来实现断路器的功能,Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

Ribbon中引入Hystrix

pom.xml依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

在eureka-ribbon的主类RibbonApplication中使用@EnableCircuitBreaker注解开启断路器功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker     //开启断路器功能
public class RibbonApplication {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }
}

在使用ribbon消费服务的函数上增加@HystrixCommand注解来指定回调方法。

@Service
public class ComputeService {
    @Autowired
    RestTemplate restTemplate;

    //注解来指定回调方法
    @HystrixCommand(fallbackMethod = "addServiceFallback")
    public String addService() {
        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
    }

    public String addServiceFallback() {
        return "error";
    }
}

验证断路器的回调

Feign使用Hystrix

不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix

如果您够仔细,会发现与在ribbon中的报错是不同的,看到add timed-out and no fallback available这句.

如何使用Feign中集成的Hystrix

使用@FeignClient注解中的fallback属性指定回调类

@FeignClient(value = "compute-service", fallback = ComputeClientHystrix.class)
public interface ComputeClient {
    @RequestMapping(method = RequestMethod.GET, value = "/add")
    Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}

创建回调类ComputeClientHystrix,实现@FeignClient的接口,此时实现的方法就是对应@FeignClient接口中映射的fallback函数。

@Component
public class ComputeClientHystrix implements ComputeClient {
    @Override
    public Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b) {
        return -9999;
    }
}

再用之前的方法验证一下,是否在compute-service服务不可用的情况下,页面返回了-9999。

时间: 2024-10-17 14:25:42

断路器的相关文章

Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard

1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboard可以很高效的现实每个断路器的健康状况. 1). 在Ribbon服务g和Feign服务的Maven工程的pom.xml中都加入依赖 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <art

Circuit Breaker Pattern(断路器模式)

Handle faults that may take a variable amount of time to rectify when connecting to a remote service or resource. This pattern can improve the stability and resiliency of an application.在连接到一个远程服务或资源时,处理故障可能需要一个变量的时间来纠正.这种模式可以提高应用程序的稳定性和弹性. Context a

云计算设计模式翻译(二):Circuit Breaker Pattern(断路器模式)

当连接使用远端服务或资源时,可能需要花不少精力来做好错误处理.这个模式可以有效提高程序的稳定性和弹性. Context and Problem 在像云这种分布式的环境中,应用程序的操作经常访问远端的资源和服务.然而这类操作有可能因为网络响应慢.超时.资源暂时不可用等瞬时性故障(transient faults)而失败.这些故障通常情况下会在一小段时间后自动恢复,而对于一个好的云应用来说,必须要有一个好的策略(比如尝试重试)来处理这种情况. 但是有时候错误是由一些难以预期的异常事件导致的,这种情况

断路器hystrix

在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会出现因等待出现故障的依赖方响应而形成任务积压,最终导致自身服务的瘫痪. 举个例子,在一个电商网站中,我们可能会将系统拆分成,用户.订单.库存.积分.评论等一系列的服务单元.用户创建一个订单的时候,

产框架式断路器流水线厂家批发

浙江华森自动化是一家专业生产框架式断路器流水线的厂家,VS1高压断路器生产流水线也是装配流水线的其中一种,在价格.质量.售后服务等方面具有一定的优势. 厂家所生产的框架断路器流水线 一.框架式断路器流水线结构:万向球 工装板 材质输送,运行平稳可靠.操作安全方便,可配置照明灯具.气路.风扇.作业指导书架.部装工作台.插座.下线防滑板等,整体设备美观.环保.经济.适用,专业品质.诚信服务二.框架式断路器流水线售后服务:华森自动化承诺所有销售产品均享受一年保修,终身免费维护,配件类产品均可免费拿样,

断路器越级跳闸故障原因

断路器越级跳闸故障原因与处理方法 时间:2015-07-21 22:27:51编辑:电工栏目:电工总结 导读:有关断路器越级跳闸故障的发生原因,断路器的“拒跳”严重威胁系统安全,断路器拒动,造成上一级断路器跳闸,称为“越级跳闸”,这里总结了断路器越级跳闸的处理方法. 断路器越级跳闸故障:断路器的“拒跳”对系统安全运行威胁很大,一旦某一单元发生故障时,断路器拒动,将会造成上一级断路器跳闸,称为“越级跳闸”. 断路器越级跳闸故障的处理方法: 一.根据事故现象,可判别是否属断路器“拒跳”事故. “拒跳

Spring Cloud构建微服务架构(三)断路器

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延. Netflix Hystrix 在Spring Cloud中使用了Hystrix 来实现断路器的功能.Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和故

云计算设计模式(二)——断路器模式

云计算设计模式(二)--断路器模式 处理故障连接到远程服务或资源时,可能需要耗费大量的时间.这种模式可以提高应用程序的稳定性和灵活性. 背景和问题 在分布式环境中,如在云,其中,应用程序执行访问远程资源和服务的操作,有可能对这些操作的失败是由于瞬时故障,如慢的网络连接,超时,或者被过度使用的资源或暂时不可用.这些故障一般之后的短时间内纠正自己,和一个强大的云应用应该准备使用的策略来处理它们,例如,通过重试模式进行说明. 但是,也可以是其中的故障是由于那些不容易预见的突发事件的情况下,这可能需要更

spring-cloud-starter-hystrix(断路器)服务不通或者调用失败后的错误处理和回调

雪崩效应 在微服务架构中通常会有多个服务层调用,大量的微服务通过网络进行通信,从而支撑起整个系统.各个微服务之间也难免存在大量的依赖关系.然而任何服务都不是100%可用的,网络往往也是脆弱的,所以难免有些请求会失败.基础服务的故障导致级联故障,进而造成了整个系统的不可用,这种现象被称为服务雪崩效应.服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程. Netflix Hystrix断路器 Netflix的Hystrix类库实现了断路器模式,在微服务架构中