微服务的断路器实现图解Golang通用实现

  

断路器背景

  

微服务连锁故障场景

  

微服务的断路器实现图解Golang通用实现“> <br/>在分布式环境中,各个微服务相互调用,当某些情况下,比如后端中间件服务故障,第三方服务中断导致某个服务无限期不可用,短时间无法恢复,则可能会导致连锁故障,最终影响压垮整个业务集群</p>
  <h3>断路器与重试</h3>
  <p>断路器模式不同于重试模式,重试模式是使应用程序可以重试操作以期望它会成功,而断路器模式是防止应用程序执行一个可能失败的操作,减少执行可能失败操作的CPU、内存,线程等资源的浪费,从而保证服务的整体可用</p>
  <p> & lt; !——更多的在</p>
  <h2>断路器设计解析</h2>
  <h3>基于代理模式的断路器</h3>
  <p> <img src=类型数量结构{   请求uint32//请求数   TotalSuccesses uint32//成功   TotalFailures uint32//失败   ConsecutiveSuccesses uint32//连续成功   ConsecutiveFailures uint32//连续失败   }   

计数器完成对应请求状态的次数,为后续状态转移提供数据,计数提供了onRequest,调用onSuccess, onFailure,明确几个辅助接口用于实现对应请求状态的操作,感兴趣可以看下

  

状态机——断路器

  
 <代码类=" language-go ">类型断路器结构{
  名称字符串//maxRequests限制半开状态下最大的请求数,避免海量请求将在恢复过程中的服务再次失败
  maxRequests uint32//间隔用于在封闭状态下,断路器多久清除一次重要的信息,如果设置为0则在封闭状态下不会清除
  间隔time.Duration//超时进入开放状态下,多长时间切换到半开状态,默认60年代
  超时time.Duration//readyToTrip熔断条件,当执行失败后,会根据readyToTrip决定是否进入开放状态
  bool readyToTrip func(项数)//> func (cb *断路器)执行(点播func()(接口{},错误))(接口{},错误){//执行请求钩子,会根据当前状态,来返回当前的一代和犯错(如果位于开放和半开的则不为零),通过犯错来进行判断是否直接返回
  一代,犯错:=cb.beforeRequest ()
  如果犯错!=nil {
  返回nil,犯错
  }//捕获恐慌,避免应用函数错误造成断路器恐慌
  推迟func () {
  艾凡:=恢复()
  如果e !=nil {
  cb。假afterRequest(代)
  恐慌(e)
  }
  } ()//执行请求
  因此,犯错:=要求()//根据结果来进行对应状态的统计,同时传递一代
  cb。afterRequest(代,呃==nil)
  返回结果,犯错
  }

微服务的断路器实现图解Golang通用实现