本篇文章參考【Micro In Action(七):熔斷與限流】git
https://medium.com/@dche423/m...github
@dche423寫的太好了,這裏僅作部分摘錄介紹web
go micro 封裝了hystrix-go,gobreaker,都在plugins下segmentfault
下面是hystrix
的例子服務器
import ( ... "github.com/micro/go-plugins/wrapper/breaker/hystrix/v2" ... ) func main(){ ... // New Service service := micro.NewService( micro.Name("com.foo.breaker.example"), micro.WrapClient(hystrix.NewClientWrapper()), ) // Initialise service service.Init() ... }
他的默認值超時時間是1000毫秒,最大併發數是10併發
// DefaultTimeout is how long to wait for command to complete, in milliseconds DefaultTimeout = 1000 // DefaultMaxConcurrent is how many commands of the same type can run at the same time DefaultMaxConcurrent = 10
其餘參數請見官網,https://github.com/afex/hystr...app
若是須要修改其餘參數,能夠在服務service.init()後設置插件
import ( ... hystrixGo "github.com/afex/hystrix-go/hystrix" "github.com/micro/go-plugins/wrapper/breaker/hystrix/v2" ... ) func main(){ ... // New Service service := micro.NewService( micro.Name("com.foo.breaker.example"), micro.WrapClient(hystrix.NewClientWrapper()), ) // Initialise service service.Init() hystrix.DefaultMaxConcurrent = 3//change concurrrent to 3 hystrix.DefaultTimeout = 200 //change timeout to 200 milliseconds ... }
DefaultMaxConcurrent限制的是hystrix 中的 commandcode
看看插件中是怎麼定義的Callrouter
func (c *clientWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { return hystrix.Do(req.Service()+"."+req.Endpoint(), func() error { return c.Client.Call(ctx, req, rsp, opts...) }, nil) }
都是return的hystrix.Do(), 他的參數沒有包含節點信息,這意味着對於同一個服務,部署單個仍是多個節點對於熔斷來講是沒有區別的,全部節點都共享一組限制
現實項目中,不一樣服務的負載能力是不一樣的,go micro能夠爲不一樣的服務設置不一樣的熔斷限制
hystrix.ConfigureCommand("com.serviceA.methodFoo", hystrix.CommandConfig{ MaxConcurrentRequests: 50, Timeout: 10, }) hystrix.ConfigureCommand("com.serviceB.methodBar", hystrix.CommandConfig{ Timeout: 60, })
小結: 熔斷功能做用於客戶端,設置恰當閾值之後, 它能夠保障客戶端資源不會被耗盡 —— 哪怕是它所依賴的服務處於不健康的狀態,也會快速返回錯誤,而不是讓調用方長時間等待。
在服務端生效,它的做用是保護服務器:避免服務器由於客戶端的瘋狂調用而總體垮掉。
go micro 封裝了2個限流包ratelimiter/uber,ratelimiter/ratelimit,都在plugins下
這裏演示uber的https://github.com/micro/go-p...
package main import ( ... limiter "github.com/micro/go-plugins/wrapper/ratelimiter/uber/v2" ... ) func main() { const QPS = 100 // New Service service := micro.NewService( micro.Name("com.foo.srv.hello"), micro.Version("latest"), micro.WrapHandler(limiter.NewHandlerWrapper(QPS)), ) ... }
默認QPS上限爲100。這個限制由此服務的全部handler全部method 共享。換句話說,此限制的做用域是服務級別的。
其餘設置和熔斷的設置相似,具體使用請見官方的文檔。
總結:
熔斷的出發點是保護客戶端, 不被外部服務的問題所拖累, 永遠快速響應(哪怕獲得一個錯誤,也好於長時間等待)。 永遠避免資源的過分消耗。
限流的出發點是保護服務器。 只處理本身能力以內的流量,實現過載保護。 當流量超過設定限制時當即返回錯誤。
go micro 分析系列文章
go micro server 啓動分析
go micro client
go micro broker
go micro cmd
go micro config
go micro store
go micro registry
go micro router
go micro runtime
go micro transport
go micro web
go micro registry 插件consul
go micro plugin
go micro jwt 網關鑑權
go micro 鏈路追蹤
go micro 熔斷與限流
go micro wrapper 中間件
go micro metrics 接入Prometheus、Grafana