服务容错保护

2018-02-03  本文已影响0人  芝麻香油

本文主要内容:

什么是断路器

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

在分布式架构中,断路器模式的作用也是类似的,如果某个目标服务调用慢或者有大量超时,此时,熔断改服务的调用该,对于后续调用请求,不在滴啊用目标服务,直接返回,快速释放资源。

为什么需要断路器

在上一篇文章 服务发现与注册 中,我们通过服务发现与注册实现了跨服务调用。如下图,在我们的应用中有 n 个服务,它们之间存在 A 调用 B,B 调用 C,C 调用.....N 的关系。此时,由于某些原因我们的服务 N 挂了,接着服务 N-1,N-2,...... C,B,A 这一系列的服务都挂了,即服务雪崩效应。

于是,我们有了如下需求:

此时,我们就需要服务容错保护

工作机制

每个请求都会在 hystrix 超时之后返回 fallback,每个请求时间延迟就是近似 hystrix 的超时时间,假设是 5 秒,那么每个请求都要延迟 5 秒后才返回。当熔断器在 10 秒内发现请求总数超过 20,并且错误百分比超过 50%,此时熔断打开。

熔断打开之后,再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,这个时候就会快速返回,而不是等待 5 秒才返回 fallback。通过断路器,实现了自动发现错误并将降级逻辑切为主逻辑,减少响应延迟。

当断路器打开,主逻辑被熔断后,hystrix 会启动一个休眠时间窗,在这个时间窗内,降级逻辑就是主逻辑;当休眠时间窗到期,断路器进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求返回正常,那么断路器将闭合,主逻辑恢复,如果这次请求依然失败,断路器继续打开,休眠时间窗重新计时。

主要功能

服务容错保护的主要功能:快速反馈、服务降级、依赖隔离。

简单使用

在我们的应用有这样一个 API,查看订单详情,需要发请求到 order service 拿到 order 信息,再发请求到 goods service 拿到 goods 的信息。

那么存在 goods 挂了,那么 order 也会挂的问题,因此,我们需要在 order 和 goods 中间加入熔断。

compile('org.springframework.cloud:spring-cloud-starter-feign:1.2.3.RELEASE')
compile('org.springframework.cloud:spring-cloud-starter-hystrix:1.2.3.RELEASE')
compile('org.springframework.cloud:spring-cloud-starter-hystrix-dashboard:1.2.3.RELEASE')
compile('com.netflix.feign:feign-httpclient:8.18.0')
@EnableCircuitBreaker  // 加入此注解
@EnableFeignClients  
@EnableDiscoveryClient
@SpringBootApplication
public class MstOrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MstOrderServiceApplication.class, args);
    }
}
feign:
  hystrix:
    enabled: true
// fallback: 用于在出错的时候调用该类中对应的方法
@FeignClient(value = "mst-goods-service", fallback = GoodClientFallback.class)
public interface GoodsClient {

    @RequestMapping(method = RequestMethod.GET, path = "/api/goods/{goods_id}")
    GoodsDTO getOne(@PathVariable("goods_id") Long goodsId);
}
import org.springframework.stereotype.Component;

@Component
public class GoodClientFallback implements GoodsClient {

    @Override
    public GoodsDTO getOne(Long goodsId) {
        return new GoodsDTO(1l, 12.3, 2l, "name");
    }
}

到此,order service 和 goods service 之间的熔断已经实现了。

上一篇 下一篇

猜你喜欢

热点阅读