返回顶部
首页 > 资讯 > 后端开发 > GO >golang熔断器如何实现
  • 224
分享到

golang熔断器如何实现

2023-06-26 04:06:28 224人浏览 薄情痞子
摘要

这篇“golang熔断器如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang熔断器如何实现”文章吧。熔断器像是

这篇“golang熔断器如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang熔断器如何实现”文章吧。

熔断器像是一个保险丝。当我们依赖的服务出现问题时,可以及时容错。一方面可以减少依赖服务对自身访问的依赖,防止出现雪崩效应;另一方面降低请求频率以方便上游尽快恢复服务。

熔断器的应用也非常广泛。除了在我们应用中,为了请求服务时使用熔断器外,在 WEB 网关、微服务中,也有非常广泛的应用。

1.熔断器的模式

gobreaker 是基于《微软云设计模式》一书中的熔断器模式的 Golang 实现。有 sony 公司开源,目前 star 数有 1.2K。使用人数较多。

下面是模式定义的一个状态机:

golang熔断器如何实现

熔断器有三种状态,四种状态转移的情况:

  • 熔断器关闭状态,服务正常访问

  • 熔断器开启状态,服务异常

  • 熔断器半开状态,部分请求限流访问

四种状态转移:

  • 在熔断器关闭状态下,当失败后并满足一定条件后,将直接转移为熔断器开启状态。

  • 在熔断器开启状态下,如果过了规定的时间,将进入半开启状态,验证目前服务是否可用。

  • 在熔断器半开启状态下,如果出现失败,则再次进入关闭状态。

  • 在熔断器半开启后,所有请求(有限额)都是成功的,则熔断器关闭。所有请求将正常访问。

2.gobreaker 的实现

gobreaker 是在上述状态机的基础上,实现的一个熔断器。

2.1熔断器的定义

type CircuitBreaker struct {    name          string    maxRequests   uint32  // 最大请求数 (半开启状态会限流)    interval      time.Duration   // 统计周期    timeout       time.Duration   // 进入熔断后的超时时间    readyToTrip   func(counts Counts) bool // 通过 Counts 判断是否开启熔断。需要自定义    onStateChange func(name string, from State, to State) // 状态修改时的钩子函数    mutex      sync.Mutex // 互斥,下面数据的更新都需要加锁    state      State  // 记录了当前的状态    generation uint64 // 标记属于哪个周期    counts     Counts // 计数器,统计了 成功、失败、连续成功、连续失败等,用于决策是否进入熔断    expiry     time.Time // 进入下个周期的时间  }

其中,如下参数是我们可以自定义的:

  • MaxRequests:最大请求数。当在最大请求数下,均请求正常的情况下,会关闭熔断器

  • interval:一个正常的统计周期。如果为 0,那每次都会将计数清零

  • timeout: 进入熔断后,可以再次请求的时间

  • readyToTrip:判断熔断生效的钩子函数

  • onStateChagne:状态变更的钩子函数

2.2请求的执行

熔断器的执行操作,主要包括三个阶段;①请求之前的判定;②服务的请求执行;③请求后的状态和计数的更新

// 熔断器的调用  func (cb *CircuitBreaker) Execute(req func() (interface{}, error)) (interface{}, error) {    // ①请求之前的判断    generation, err := cb.beforeRequest()    if err != nil {      return nil, err    }    defer func() {      e := recover()      if e != nil {        // ③ panic 的捕获        cb.afterRequest(generation, false)        panic(e)      }    }()    // ② 请求和执行    result, err := req()    // ③ 更新计数    cb.afterRequest(generation, err == nil)    return result, err  }

2.3请求之前的判定操作

请求之前,会判断当前熔断器的状态。如果熔断器以开启,则不会继续请求。如果熔断器半开,并且已达到最大请求阈值,也不会继续请求。

func (cb *CircuitBreaker) beforeRequest() (uint64, error) {    cb.mutex.Lock()    defer cb.mutex.Unlock()    now := time.Now()    state, generation := cb.currentState(now)    if state == StateOpen { // 熔断器开启,直接返回      return generation, ErrOpenState    } else if state == StateHalfOpen && cb.counts.Requests >= cb.maxRequests { // 如果是半打开的状态,并且请求次数过多了,则直接返回      return generation, ErrTooManyRequests    }    cb.counts.onRequest()    return generation, nil  }

其中当前状态的计算,是依据当前状态来的。如果当前状态为已开启,则判断是否已经超时,超时就可以变更状态到半开;如果当前状态为关闭状态,则通过周期判断是否进入下一个周期。

func (cb *CircuitBreaker) currentState(now time.Time) (State, uint64) {    switch cb.state {    case StateClosed:      if !cb.expiry.IsZero() && cb.expiry.Before(now) { // 是否需要进入下一个计数周期        cb.toNewGeneration(now)      }    case StateOpen:      if cb.expiry.Before(now) {        // 熔断器由开启变更为半开        cb.setState(StateHalfOpen, now)      }    }    return cb.state, cb.generation  }

周期长度的设定,也是以据当前状态来的。如果当前正常(熔断器关闭),则设置为一个 interval 的周期;如果当前熔断器是开启状态,则设置为超时时间(超时后,才能变更为半开状态)。

2.4请求之后的处理操作

每次请求之后,会通过请求结果是否成功,对熔断器做计数。

func (cb *CircuitBreaker) afterRequest(before uint64, success bool) {    cb.mutex.Lock()    defer cb.mutex.Unlock()    now := time.Now()    // 如果不在一个周期,就不再计数    state, generation := cb.currentState(now)    if generation != before {      return    }    if success {      cb.onSuccess(state, now)    } else {      cb.onFailure(state, now)    }  }

如果在半开的状态下:

如果请求成功,则会判断当前连续成功的请求数 大于等于 maxRequests, 则可以把状态由半开状态转移为关闭状态
如果在半开状态下,请求失败,则会直接将半开状态转移为开启状态
如果在关闭状态下:

如果请求成功,则计数更新
如果请求失败,则调用 readyToTrip 判断是否需要将状态关闭状态转移为开启状态

以上就是关于“golang熔断器如何实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网GO频道。

您可能感兴趣的文档:

--结束END--

本文标题: golang熔断器如何实现

本文链接: https://lsjlt.com/news/306758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang熔断器如何实现
    这篇“golang熔断器如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang熔断器如何实现”文章吧。熔断器像是...
    99+
    2023-06-26
  • golang 熔断器的实现过程
    目录1.熔断器的模式2.gobreaker 的实现2.1熔断器的定义2.2请求的执行2.3请求之前的判定操作2.4请求之后的处理操作 熔断器像是一个保险丝。当我们依赖的服务出现问题时...
    99+
    2024-04-02
  • java熔断器设计如何实现
    这篇文章主要介绍“java熔断器设计如何实现”,在日常操作中,相信很多人在java熔断器设计如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java熔断器设计如何实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • springcloud中如何实现熔断监控Turbine
    小编给大家分享一下springcloud中如何实现熔断监控Turbine,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在复杂的分布式系统中,相同服务的节点经常需要...
    99+
    2023-06-05
  • SpringCloud Hystrix熔断器如何使用
    本文小编为大家详细介绍“SpringCloud Hystrix熔断器如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud Hystrix熔断器如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-07-05
  • Spring Cloud Gateway整合sentinel如何实现流控熔断
    这篇文章主要介绍“Spring Cloud Gateway整合sentinel如何实现流控熔断”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Cloud&n...
    99+
    2023-06-29
  • Redis怎么实现限流和熔断
    Redis 可以通过以下方式实现限流和熔断: 限流:使用 Redis 的计数器功能来实现限流。在每次请求到来时,首先检查计数器的...
    99+
    2024-05-07
    Redis
  • SpringCloud微服务熔断器Hystrix如何使用
    这篇文章主要介绍了SpringCloud微服务熔断器Hystrix如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud微服务熔断器Hystrix如何使用文章都会有所收获,下面我们一起来看...
    99+
    2023-07-02
  • 如何自定义feign调用实现hystrix超时、异常熔断
    需求描述 spring cloud 项目中feign 整合 hystrix经常使用,但是最近发现hystrix功能强大,但是对我们来说有些大材小用。 首先我只需要他的一个熔断作用,就...
    99+
    2024-04-02
  • SpringCloudGateway的熔断限流配置实现方法
    目录简介断路器限流总结简介 Spring Cloud Gateway是一个强大的开源工具,可以让开发人员轻松构建API和微服务。但是,与任何分布式系统一样,流量峰值或服务故障可能导致...
    99+
    2023-05-17
    SpringCloud Gateway熔断限流 SpringCloud熔断限流配置
  • Spring Cloud Alibaba之Sentinel实现熔断限流功能
    微服务中为了防止某个服务出现问题,导致影响整个服务集群无法提供服务的情况,我们在系统访问量和业务量高起来了后非常有必要对服务进行熔断限流处理。 其中熔断即服务发生异常时能够更好的处理...
    99+
    2024-04-02
  • SpringCloud使用Resilience4j实现服务熔断的方法
    目录CircuitBreaker 断路器隔舱Bulkhead限速器RateLimiterCircuitBreaker 断路器 服务熔断是为了保护我们的服务,比如当某个服务出现问题的时...
    99+
    2022-12-29
    Spring Cloud 服务熔断 Spring Cloud Resilience4j 服务熔断
  • 在Golang高并发场景中如何进行限流和熔断处理?
    在 golang 高并发场景中,限流和熔断可保护系统免遭过载:限流通过限制请求数量,防止系统超负荷,例如使用令牌桶算法。熔断在服务故障或负荷过高时关闭访问,例如使用熔断器模式,当失败请求...
    99+
    2024-05-10
    限流 熔断 git golang
  • springcloud中如何使用熔断监控Hystrix Dashboard
    这篇文章给大家分享的是有关springcloud中如何使用熔断监控Hystrix Dashboard的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Hystrix-dashboard是一款针对Hystrix进行实时...
    99+
    2023-06-05
  • golang断言实现
    Golang 是一种语言,具有强大的并发和系统编程能力。它是一种编译型语言,旨在使编程变得更加快速简便。在 Golang 中,断言是一个重要的概念。它允许程序员在编写代码时,“断言”某个变量或接口的类型,这样就可以在运行时检查该类型是否正确...
    99+
    2023-05-14
  • SpringCloud Zuul实现负载均衡和熔断机制方式
    一、场景 笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖 springboot版本:1.5.9.RELEASE springcloud版...
    99+
    2024-04-02
  • Spring Cloud Gateway整合sentinel 实现流控熔断的问题
    目录一、什么是网关限流:二、gateway 整合 sentinel 实现网关限流:三、sentinel 网关流控规则的介绍:3.1、网关流控规则:3.2、API 分组管理:四、sen...
    99+
    2024-04-02
  • Spring Cloud Alibaba微服务组件Sentinel实现熔断限流
    目录Sentinel简介Sentinel具有如下特性:安装Sentinel控制台创建sentinel-service模块限流功能创建RateLimitController类根据URL...
    99+
    2024-04-02
  • SpringCloud Zuul怎么实现负载均衡和熔断机制
    小编给大家分享一下SpringCloud Zuul怎么实现负载均衡和熔断机制,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、场景Zuul网关下实现其负载均衡与熔...
    99+
    2023-06-20
  • Spring Cloud Alibaba之Sentinel实现熔断限流功能的方法
    这篇文章主要介绍Spring Cloud Alibaba之Sentinel实现熔断限流功能的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sentinel简介这个在阿里云有企业级的商用版本 应用高可用服务 AHA...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作