micro限流实现及原理

限流原理

在这里插入图片描述

代码实现

服务端

/*
限流相关的包:
			jujuratelimit "github.com/juju/ratelimit"
			ratelimit "github.com/micro/go-plugins/wrapper/ratelimiter/ratelimit"
*/

func startRPCService() {
	reg := etcdv3.NewRegistry(func(options *registry.Options) {
		options.Addrs = []string{
			conf.DefaultConfig.EtcdAddr,
		}
		etcdv3.Auth(conf.DefaultConfig.EtcdUser,conf.DefaultConfig.EtcdPwd)(options)
	})
  // 限制每秒访问次数(令牌桶容量)
	limit := 2
	// 生成令牌桶,limit=1每秒钟放入一个令牌,limit=2每0.5秒放入一个令牌以此类推
	//(fillInterval := time.Duration(1e9 * float64(quantum) / rate))
	rate := jujuratelimit.NewBucketWithRate(float64(limit), int64(limit))
  
	service := micro.NewService(
		micro.Registry(reg),
		micro.Name("go.micro.service.user"),
		micro.RegisterTTL(time.Second*10),
		micro.RegisterInterval(time.Second*5),
		micro.Flags(common.CustomFlags...),
		// 配置micro false为不等待抛出500,true为等待
		micro.WrapHandler(ratelimit.NewHandlerWrapper(rate,true)),
		)
  
	service.Init()
	dbproxy.Init(service)
	userProto.RegisterUserServiceHandler(service.Server(), new(handler.User))
	err := service.Run()
	if err != nil {
		log.Println(err)
	}
}

客户端

var (
	userCli userProto.UserService
)

func init(){
	conf.InitConfig("./conf/config.json")
	reg := etcdv3.NewRegistry(func(op *registry.Options) {
		op.Addrs= []string{conf.DefaultConfig.EtcdAddr}
		etcdv3.Auth(conf.DefaultConfig.EtcdUser,conf.DefaultConfig.EtcdPwd)(op)
	})
	service := micro.NewService(
		micro.Registry(reg),
		micro.Name("go.micro.service.apigw"),
		micro.Flags(common.CustomFlags...),
	)
	service.Init()
	cli := service.Client()
	userCli = userProto.NewUserService("go.micro.service.user",cli)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值