Skip to content

Commit

Permalink
Add doc.go for core/api, flow and circuitbreaker package (#235)
Browse files Browse the repository at this point in the history
  • Loading branch information
louyuting authored Sep 9, 2020
1 parent bd07b4b commit f9ddf58
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 1 deletion.
1 change: 0 additions & 1 deletion api/api.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Package api provides fundamental APIs of Sentinel.
package api

import (
Expand Down
50 changes: 50 additions & 0 deletions api/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Package api provides the topmost fundamental APIs for users using sentinel-golang.
// Users must initialize Sentinel before loading Sentinel rules. Sentinel support three ways to perform initialization:
//
// 1. api.InitDefault(), using default config to initialize.
// 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:
//
// import sentinel "github.com/alibaba/sentinel-golang/api"
//
// err := sentinel.InitDefault()
// if err != nil {
// log.Fatal(err)
// }
//
// //Load sentinel rules
// _, err = flow.LoadRules([]*flow.Rule{
// {
// Resource: "some-test",
// MetricType: flow.QPS,
// Count: 10,
// ControlBehavior: flow.Reject,
// },
// })
// if err != nil {
// log.Fatalf("Unexpected error: %+v", err)
// return
// }
// ch := make(chan struct{})
// for i := 0; i < 10; i++ {
// go func() {
// for {
// e, b := sentinel.Entry("some-test", sentinel.WithTrafficType(base.Inbound))
// if b != nil {
// // Blocked. We could get the block reason from the BlockError.
// time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
// } else {
// // Passed, wrap the logic here.
// fmt.Println(util.CurrentTimeMillis(), "passed")
// time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
// // Be sure the entry is exited finally.
// e.Exit()
// }
// }
// }()
// }
// <-ch
//
package api
113 changes: 113 additions & 0 deletions core/circuitbreaker/doc.go
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions core/flow/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Package flow implements the flow shaping control.
//
// flow module supports two statistic metric: QPS and Concurrency.
//
// The TrafficShapingController consists of two part: TrafficShapingCalculator and TrafficShapingChecker
//
// 1. TrafficShapingCalculator calculates the actual traffic shaping token threshold. Currently, Sentinel supports two token calculate strategy: Direct and WarmUp.
// 2. TrafficShapingChecker performs checking logic according to current metrics and the traffic shaping strategy, then yield the token result. Currently, Sentinel supports two control behavior: Reject and Throttling.
//
// Besides, Sentinel supports customized TrafficShapingCalculator and TrafficShapingChecker. User could call function SetTrafficShapingGenerator to register customized TrafficShapingController and call function RemoveTrafficShapingGenerator to unregister TrafficShapingController.
// There are a few notes users need to be aware of:
//
// 1. The function both SetTrafficShapingGenerator and RemoveTrafficShapingGenerator is not thread safe.
// 2. Users can not override the Sentinel supported TrafficShapingController.
//
package flow

0 comments on commit f9ddf58

Please sign in to comment.