breaker

package
v0.1.1-0...-61592f5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 18, 2019 License: MIT Imports: 9 Imported by: 0

README

breaker

项目简介

  1. 提供熔断器功能,供各种client(如rpc、http、msyql)等进行熔断
  2. 提供Go方法供业务在breaker熔断前后进行回调处理

配置说明

  1. NewGroup(name string,c *Config)当c==nil时则采用默认配置
  2. 可通过breaker.Init(c *Config)替换默认配置
  3. 可通过group.Reload(c *Config)进行配置更新
  4. 默认配置如下所示: _conf = &Config{ Window: xtime.Duration(3 * time.Second), Sleep: xtime.Duration(100 * time.Millisecond), Bucket: 10, Ratio: 0.5, Request: 100, }

测试

  1. 执行当前目录下所有测试文件,测试所有功能

Documentation

Index

Examples

Constants

View Source
const (
	// StateOpen when circuit breaker open, request not allowed, after sleep
	// some duration, allow one single request for testing the health, if ok
	// then state reset to closed, if not continue the step.
	StateOpen int32 = iota
	// StateClosed when circuit breaker closed, request allowed, the breaker
	// calc the succeed ratio, if request num greater request setting and
	// ratio lower than the setting ratio, then reset state to open.
	StateClosed
	// StateHalfopen when circuit breaker open, after slepp some duration, allow
	// one request, but not state closed.
	StateHalfopen
)

Variables

This section is empty.

Functions

func Go

func Go(name string, run, fallback func() error) error

Go runs your function while tracking the breaker state of default group.

Example

ExampleGo this example create a default group and show function callback according to the state of breaker.

package main

import (
	"fmt"

	"github.com/bilibili/kratos/pkg/net/netutil/breaker"
)

func main() {
	run := func() error {
		return nil
	}
	fallback := func() error {
		return fmt.Errorf("unknown error")
	}
	if err := breaker.Go("example_go", run, fallback); err != nil {
		fmt.Println(err)
	}
}
Output:

func Init

func Init(conf *Config)

Init init global breaker config, also can reload config after first time call.

Types

type Breaker

type Breaker interface {
	Allow() error
	MarkSuccess()
	MarkFailed()
}

Breaker is a CircuitBreaker pattern. FIXME on int32 atomic.LoadInt32(&b.on) == _switchOn

Example

ExampleBreaker show breaker usage.

package main

import (
	"fmt"

	"github.com/bilibili/kratos/pkg/net/netutil/breaker"
)

func main() {
	// new group,use default breaker config
	g := breaker.NewGroup(nil)
	brk := g.Get("key")
	// mark request success
	brk.MarkSuccess()
	// mark request failed
	brk.MarkFailed()
	// check if breaker allow or not
	if brk.Allow() == nil {
		fmt.Println("breaker allow")
	} else {
		fmt.Println("breaker not allow")
	}
}
Output:

type Config

type Config struct {
	SwitchOff bool // breaker switch,default off.

	// Hystrix
	Ratio float32
	Sleep xtime.Duration

	// Google
	K float64

	Window  xtime.Duration
	Bucket  int
	Request int64
}

Config broker config.

type Group

type Group struct {
	// contains filtered or unexported fields
}

Group represents a class of CircuitBreaker and forms a namespace in which units of CircuitBreaker.

Example

ExampleGroup show group usage.

package main

import (
	"time"

	"github.com/bilibili/kratos/pkg/net/netutil/breaker"
	xtime "github.com/bilibili/kratos/pkg/time"
)

func main() {
	c := &breaker.Config{
		Window:  xtime.Duration(3 * time.Second),
		Sleep:   xtime.Duration(100 * time.Millisecond),
		Bucket:  10,
		Ratio:   0.5,
		Request: 100,
	}
	// init default config
	breaker.Init(c)
	// new group
	g := breaker.NewGroup(c)
	// reload group config
	c.Bucket = 100
	c.Request = 200
	g.Reload(c)
	// get breaker by key
	g.Get("key")
}
Output:

func NewGroup

func NewGroup(conf *Config) *Group

NewGroup new a breaker group container, if conf nil use default conf.

func (*Group) Get

func (g *Group) Get(key string) Breaker

Get get a breaker by a specified key, if breaker not exists then make a new one.

func (*Group) Go

func (g *Group) Go(name string, run, fallback func() error) error

Go runs your function while tracking the breaker state of group.

func (*Group) Reload

func (g *Group) Reload(conf *Config)

Reload reload the group by specified config, this may let all inner breaker reset to a new one.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL