mysql限流熔断_go micro 熔断与限流

本文介绍了如何在 Go Micro 中实现熔断和限流。通过使用 hystrix-go 实现客户端的熔断功能,设置超时时间和最大并发数来保护服务。同时,利用 ratelimiter 插件进行服务端限流,确保服务器资源不被过度消耗。熔断和限流策略有助于维持系统的稳定性和可用性。
摘要由CSDN通过智能技术生成

本篇文章参考【Micro In Action(七):熔断与限流】

@dche423写的太好了,这里仅做部分摘录介绍

熔断

go micro 封装了hystrix-go,gobreaker,都在plugins下

下面是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

如果需要修改其他参数,可以在服务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 中的 command

看看插件中是怎么定义的Callfunc (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下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 共享。换句话说,此限制的作用域是服务级别的。

其他设置和熔断的设置类似,具体使用请见官方的文档。

总结:

熔断的出发点是保护客户端, 不被外部服务的问题所拖累, 永远快速响应(哪怕得到一个错误,也好于长时间等待)。 永远避免资源的过度消耗。

限流的出发点是保护服务器。 只处理自己能力之内的流量,实现过载保护。 当流量超过设定限制时立即返回错误。

有疑问加站长微信联系(非本文作者)

5c5fbae790ec0313d6ee17e8b3dd9ba1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值