隨着微服務的流行,服務之間的調用可能變得愈來愈複雜,一個業務流程可能須要調用五六個甚至更多服務,這就會致使,假設某個服務出現問題,嚴重可能出現服務器負載太高,致使服務雪崩的現象。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 }) }