From 8205e8b42ae12f8092b0fa24a35924d0b7286c18 Mon Sep 17 00:00:00 2001
From: louyuting <1849491904@qq.com>
Date: Mon, 7 Sep 2020 22:37:52 +0800
Subject: [PATCH] add doc.go for flow and circuit breaker

---
 api/doc.go                 |   2 +-
 core/circuitbreaker/doc.go | 113 +++++++++++++++++++++++++++++++++++++
 core/flow/doc.go           |   3 +
 3 files changed, 117 insertions(+), 1 deletion(-)
 create mode 100644 core/circuitbreaker/doc.go
 create mode 100644 core/flow/doc.go

diff --git a/api/doc.go b/api/doc.go
index 7da157955..04418ed14 100644
--- a/api/doc.go
+++ b/api/doc.go
@@ -6,7 +6,7 @@
 //  2. api.InitWithConfig(confEntity *config.Entity), using customized config Entity to initialize
 //  3. api.InitWithConfigFile(configPath string), using yaml file to initialize.
 //
-// Here is the example code to use sentinel.
+// Here is the example code to use sentinel:
 //
 //  import sentinel "github.com/alibaba/sentinel-golang/api"
 //
diff --git a/core/circuitbreaker/doc.go b/core/circuitbreaker/doc.go
new file mode 100644
index 000000000..dd351551e
--- /dev/null
+++ b/core/circuitbreaker/doc.go
@@ -0,0 +1,113 @@
+// Package circuitbreaker implements the circuit breaker.
+//
+// Sentinel circuit breaker module converts each Rule into a CircuitBreaker. Each CircuitBreaker has its own statistical structure.
+//
+// Sentinel circuit breaker module supports three strategies:
+//
+//  1. SlowRequestRatio: the ratio of slow response time entry(entry's response time is great than max slow response time) exceeds the threshold. The following entry to resource will be broken.
+//                       In SlowRequestRatio strategy, user must set max response time.
+//  2. ErrorRatio: the ratio of error entry exceeds the threshold. The following entry to resource will be broken.
+//  3. ErrorCount: the number of error entry exceeds the threshold. The following entry to resource will be broken.
+//
+// Sentinel circuit breaker is implemented based on state machines. There are three state:
+//
+//  1. Closed: all entries could pass checking;
+//  2. Open: the circuit breaker is broken, all entries are blocked. After retry timeout, circuit breaker switches state to Half-Open and allows one entry to probe whether the resource returns to its expected state;
+//  3. Half-Open: the circuit breaker is in a temporary state of probing, only one entry is allowed to access resource, others are blocked.
+//
+// Sentinel circuit breaker provides the listener to listen on the state changes.
+//
+//  type StateChangeListener interface {
+//  	OnTransformToClosed(prev State, rule Rule)
+//
+//  	OnTransformToOpen(prev State, rule Rule, snapshot interface{})
+//
+//  	OnTransformToHalfOpen(prev State, rule Rule)
+//  }
+//
+// Here is the example code to use circuit breaker:
+//
+//  type stateChangeTestListener struct {}
+//
+//  func (s *stateChangeTestListener) OnTransformToClosed(prev circuitbreaker.State, rule circuitbreaker.Rule) {
+//  	fmt.Printf("rule.steategy: %+v, From %s to Closed, time: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())
+//  }
+//
+//  func (s *stateChangeTestListener) OnTransformToOpen(prev circuitbreaker.State, rule circuitbreaker.Rule, snapshot interface{}) {
+//  	fmt.Printf("rule.steategy: %+v, From %s to Open, snapshot: %.2f, time: %d\n", rule.Strategy, prev.String(), snapshot, util.CurrentTimeMillis())
+//  }
+//
+//  func (s *stateChangeTestListener) OnTransformToHalfOpen(prev circuitbreaker.State, rule circuitbreaker.Rule) {
+//  	fmt.Printf("rule.steategy: %+v, From %s to Half-Open, time: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())
+//  }
+//
+//  func main() {
+//  	err := sentinel.InitDefault()
+//  	if err != nil {
+//  		log.Fatal(err)
+//  	}
+//  	ch := make(chan struct{})
+//  	// Register a state change listener so that we could observer the state change of the internal circuit breaker.
+//  	circuitbreaker.RegisterStateChangeListeners(&stateChangeTestListener{})
+//
+//  	_, err = circuitbreaker.LoadRules([]*circuitbreaker.Rule{
+//  	// Statistic time span=10s, recoveryTimeout=3s, slowRtUpperBound=50ms, maxSlowRequestRatio=50%
+//  		{
+//  			Resource:         "abc",
+//  			Strategy:         circuitbreaker.SlowRequestRatio,
+//  			RetryTimeoutMs:   3000,
+//  			MinRequestAmount: 10,
+//  			StatIntervalMs:   10000,
+//  			MaxAllowedRtMs:   50,
+//  			Threshold:        0.5,
+//  		},
+//  		// Statistic time span=10s, recoveryTimeout=3s, maxErrorRatio=50%
+//  		{
+//  			Resource:         "abc",
+//  			Strategy:         circuitbreaker.ErrorRatio,
+//  			RetryTimeoutMs:   3000,
+//  			MinRequestAmount: 10,
+//  			StatIntervalMs:   10000,
+//  			Threshold:        0.5,
+//  		},
+//  	})
+//  	if err != nil {
+//  		log.Fatal(err)
+//  	}
+//
+//  	fmt.Println("Sentinel Go circuit breaking demo is running. You may see the pass/block metric in the metric log.")
+//  	go func() {
+//  		for {
+//  			e, b := sentinel.Entry("abc")
+//  			if b != nil {
+//  				//fmt.Println("g1blocked")
+//  				time.Sleep(time.Duration(rand.Uint64()%20) * time.Millisecond)
+//  			} else {
+//  				if rand.Uint64()%20 > 9 {
+//  					// Record current invocation as error.
+//  					sentinel.TraceError(e, errors.New("biz error"))
+//  				}
+//  				//fmt.Println("g1passed")
+//  				time.Sleep(time.Duration(rand.Uint64()%80+10) * time.Millisecond)
+//  				e.Exit()
+//  			}
+//  		}
+//		}()
+//
+//  	go func() {
+//  		for {
+//  			e, b := sentinel.Entry("abc")
+//  			if b != nil {
+//  				//fmt.Println("g2blocked")
+//  				time.Sleep(time.Duration(rand.Uint64()%20) * time.Millisecond)
+//  			} else {
+//  				//fmt.Println("g2passed")
+//  				time.Sleep(time.Duration(rand.Uint64()%80) * time.Millisecond)
+//  				e.Exit()
+//  			}
+//  		}
+//  	}()
+//  	<-ch
+//  }
+//
+package circuitbreaker
diff --git a/core/flow/doc.go b/core/flow/doc.go
new file mode 100644
index 000000000..d5afe54dc
--- /dev/null
+++ b/core/flow/doc.go
@@ -0,0 +1,3 @@
+// Package flow implements the flow shaping control.
+//
+package flow