随着微服务的流行,服务之间的调用可能变得愈来愈复杂,一个业务流程可能须要调用五六个甚至更多服务,这就会致使,假设某个服务出现问题,严重可能出现服务器负载太高,致使服务雪崩的现象。git
所以为了防止此现象的发生,决定了解下服务熔断机制,根据自身业务的需求,将其应用到服务中。github
什么是熔断:能够联想到咱们家里的电表的保险丝,当电压负载太高后,保险丝熔断,确保家里的电器等其余安全。安全
在咱们的服务中,当咱们当用第三方服务时失败到达必定的失败次数或者超时等问题时,咱们将熔断机制融入到咱们的客户端调用方,当失败次数等达到阈值时,开启熔断器,及时进行弥补处理,或者给上层友好提示。服务器
在熔断器中有三种状态:并发
关闭:让请求经过的默认状态。若是请求成功/失败但低于阈值,则状态保持不变。可能出现的错误是超过最大并发数和超时错误。微服务
打开:当熔断器打开的时候,全部的请求都会被标记为失败;这是故障快速失败机制,而不须要等待超时时间完成。blog
半开:按期的尝试发起请求来确认系统是否恢复。若是恢复了,熔断器将转为关闭状态或者保持打开get
hystrix内部处理逻辑it
go-hystrix example:class
package main import ( "fmt" "github.com/afex/hystrix-go/hystrix" "net/http" "time" ) func main() { hystrix.ConfigureCommand("get_baidu", hystrix.CommandConfig{ 500, 100, 50, 3, 1000, }) for i:=0; i<100; i++ { TestHystix() time.Sleep(1*time.Second) } time.Sleep(2 * time.Second) // 调用Go方法就是起了一个goroutine,这里要sleep一下,否则看不到效果 } func TestHystix() { // 根据自身业务需求封装到http client调用处 hystrix.Go("get_baidu", func() error { // 调用关联服务 res, err := http.Get("https://www.baidu.com/") if err != nil { fmt.Println("get error") return err } fmt.Println("请求成功:",res.Status) return nil }, // 失败重试,降级等具体操做 func(err error) error { fmt.Println("get an error, handle it") return nil }) }