Documentation ¶
Overview ¶
Package service_decorators is to simplify your work on building microservices. The common functions for the microservices (such as, Circuit break, Rate limit, Metric...) have be encapsulated in the reusable components(decorators). To build a service is to decorate the core business logic with the common decorators, so you can only focus on the core business logic. @Auth chaocai2001@icloud.com @Created on 2018-6
Example ¶
// Encapsulate the original function as service_decorators.serviceFunc method signature type encapsulatedReq struct { a int b int } encapsulatedFn := func(req Request) (Response, error) { innerReq, ok := req.(encapsulatedReq) if !ok { return nil, errors.New("invalid parameters") } return originalFunction(innerReq.a, innerReq.b) } // Add the logics with decorators // 1. Create the decorators var ( retryDec *RetryDecorator circuitBreakDec *CircuitBreakDecorator metricDec *MetricDecorator err error ) if retryDec, err = CreateRetryDecorator(3 /*max retry times*/, time.Second*1, time.Second*1, retriableChecker); err != nil { panic(err) } if circuitBreakDec, err = CreateCircuitBreakDecorator(). WithTimeout(time.Millisecond * 100). WithMaxCurrentRequests(1000). Build(); err != nil { panic(err) } gmet := g_met.CreateGMetInstanceByDefault("g_met_config/gmet_config.xml") if metricDec, err = CreateMetricDecorator(gmet). NeedsRecordingTimeSpent().Build(); err != nil { panic(err) } // 2. decorate the encapsulted function with decorators // be careful of the order of the decorators decFn := circuitBreakDec.Decorate(metricDec.Decorate(retryDec.Decorate(encapsulatedFn))) ret, err := decFn(encapsulatedReq{1, 2}) fmt.Println(ret, err)
Output: 3 <nil>
Index ¶
- Constants
- Variables
- type AdvancedCircuitBreakDecorator
- type ChaosEngineeringConfig
- type ChaosEngineeringDecorator
- type CircuitBreakDecorator
- type CircuitBreakDecoratorConfig
- func (config *CircuitBreakDecoratorConfig) Build() (*CircuitBreakDecorator, error)
- func (config *CircuitBreakDecoratorConfig) WithBeyondMaxConcurrencyFallbackFunction(fallbackFn ServiceFallbackFunc) *CircuitBreakDecoratorConfig
- func (config *CircuitBreakDecoratorConfig) WithMaxCurrentRequests(maxCurReq int) *CircuitBreakDecoratorConfig
- func (config *CircuitBreakDecoratorConfig) WithTimeout(timeOut time.Duration) *CircuitBreakDecoratorConfig
- func (config *CircuitBreakDecoratorConfig) WithTimeoutFallbackFunction(fallbackFn ServiceFallbackFunc) *CircuitBreakDecoratorConfig
- type ConfigStorage
- type ConsulConfigStorage
- type Decorator
- type ErrorClassifier
- type ErrorDistinguisherFn
- type MetricDecorator
- type MetricDecoratorConfig
- type RateLimitDecorator
- type Request
- type Response
- type RetryDecorator
- type ServiceFallbackFunc
- type ServiceFunc
Examples ¶
Constants ¶
const ( // TimeSpent is the metric item name of the time spent TimeSpent = "time_spent" // OccurredError is metric item name of the occurred error OccurredError = "occurred_error" )
Variables ¶
var ErrorBeyondRateLimit = errors.New("current request rate is beyond the limit")
ErrorBeyondRateLimit occurred when current request rate is beyond the limit
var ErrorCircuitBreakTimeout = errors.New("the invoking is timeout")
ErrorCircuitBreakTimeout happens when invoking is timeout
var ErrorCircuitBreakTooManyConcurrentRequests = errors.New("the concurrency is beyond the limit")
ErrorCircuitBreakTooManyConcurrentRequests happens when the number of the concurrent requests beyonds the setting
var ErrorRateLimitDecoratorConfig = errors.New("rate limit configuration is wrong")
ErrorRateLimitDecoratorConfig occurred when the configurations are invalid
Functions ¶
This section is empty.
Types ¶
type AdvancedCircuitBreakDecorator ¶
type AdvancedCircuitBreakDecorator struct { ErrorCounter int64 ErrorDistinguisher ErrorDistinguisherFn ErrorFrequencyThreshold int64 LastError error ResetIntervalOfErrorCounter time.Duration BackendRetryInterval time.Duration FallbackFn ServiceFallbackFunc // contains filtered or unexported fields }
AdvancedCircuitBreakDecorator is the advanced CircuitBeakDecorator, which can support complex circuit break stragtegy. For circuitBreak states transition, please refer to https://github.com/easierway/service_decorators/blob/master/doc_pics/circuit_breaker_states_transtion.png
1. Failure frequency will cause circuit breaker state to open state -- Failure frequency involves ErrorCount and ResetIntervalOfErrorCount
They are used to count the errors occurred in the time window.
-- ErrorDistinguisher is to decide what kind of errors would be counted with ErrrorCounter. -- ErrorCounter is to count the continous occurred errors in the time window -- ResetIntervalOfErrorCount is the interval of resetting error counter to 0
- When circuit breaker is in open state, the requests will be processed by fallback function (FallbackFn)
- BackendRetryInterval is to check if the backend service is health/recovered. The time interval since the last time of backend service invoked is beyond BackendRetryInterval even the circuit breaker is in close state, current request will be passed to backend service. If the request be processed successfully or no counted errors happen (decided by ErrorDistinguisher) the circuit break will switch to close state
func CreateAdvancedCircuitBreakDecorator ¶
func CreateAdvancedCircuitBreakDecorator( errorFrequencyThreshold int64, resetIntervalOfErrorCounter time.Duration, backendRetryInterval time.Duration, errorDistinguisher ErrorDistinguisherFn, fallbackFn ServiceFallbackFunc) *AdvancedCircuitBreakDecorator
func (*AdvancedCircuitBreakDecorator) Decorate ¶
func (dec *AdvancedCircuitBreakDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
type ChaosEngineeringConfig ¶
type ChaosEngineeringConfig struct { IsToInjectChaos bool `json:"IsToInjectChaos"` //Is it to start chaos injection, if it is false, all chaos injects (chaos function, slow response) will be stopped. AdditionalResponseTime int `json:"AdditionalResponseTime"` //Inject additional time spent to simulate slow response. ChaosRate int `json:"ChaosRate"` //The proportion of the chaos response, the range is 0-100 }
ChaosEngineeringConfig is the configuration.
type ChaosEngineeringDecorator ¶
type ChaosEngineeringDecorator struct {
// contains filtered or unexported fields
}
ChaosEngineeringDecorator is to inject the failure for Chaos Engineering
func CreateChaosEngineeringDecorator ¶
func CreateChaosEngineeringDecorator(configStorage ConfigStorage, configName string, chaosResponseFn ServiceFunc, refreshInterval time.Duration) (*ChaosEngineeringDecorator, error)
CreateChaosEngineeringDecorator is to create a CChaosEngineeringDecorator configStore: the storage is used to store the chaos configurations configName: the config name in the storage chaosResponseFn: the function is to inject the failure for chaos engineering
func (*ChaosEngineeringDecorator) Decorate ¶
func (dec *ChaosEngineeringDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
Decorate function is to add chaos engineering logic to the function
type CircuitBreakDecorator ¶
type CircuitBreakDecorator struct { // CircuitBreakDecoratorConfig Config *CircuitBreakDecoratorConfig // contains filtered or unexported fields }
CircuitBreakDecorator provides the circuit break, fallback, concurrency control
func (*CircuitBreakDecorator) Decorate ¶
func (dec *CircuitBreakDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
Decorate is to add the circuit break/concurrency control logic to the function
type CircuitBreakDecoratorConfig ¶
type CircuitBreakDecoratorConfig struct {
// contains filtered or unexported fields
}
CircuitBreakDecoratorConfig includes the settings of CircuitBreakDecorator
func CreateCircuitBreakDecorator ¶
func CreateCircuitBreakDecorator() *CircuitBreakDecoratorConfig
CreateCircuitBreakDecorator is the helper method of creating CircuitBreakDecorator. The settings can be defined by WithXX method chain
func (*CircuitBreakDecoratorConfig) Build ¶
func (config *CircuitBreakDecoratorConfig) Build() (*CircuitBreakDecorator, error)
Build will create CircuitBreakDecorator with the settings defined by WithXX method chain
func (*CircuitBreakDecoratorConfig) WithBeyondMaxConcurrencyFallbackFunction ¶
func (config *CircuitBreakDecoratorConfig) WithBeyondMaxConcurrencyFallbackFunction( fallbackFn ServiceFallbackFunc) *CircuitBreakDecoratorConfig
WithBeyondMaxConcurrencyFallbackFunction sets the fallback method for beyonding max concurrency error
func (*CircuitBreakDecoratorConfig) WithMaxCurrentRequests ¶
func (config *CircuitBreakDecoratorConfig) WithMaxCurrentRequests(maxCurReq int) *CircuitBreakDecoratorConfig
WithMaxCurrentRequests sets max concurrency
func (*CircuitBreakDecoratorConfig) WithTimeout ¶
func (config *CircuitBreakDecoratorConfig) WithTimeout(timeOut time.Duration) *CircuitBreakDecoratorConfig
WithTimeout sets the method execution timeout
func (*CircuitBreakDecoratorConfig) WithTimeoutFallbackFunction ¶
func (config *CircuitBreakDecoratorConfig) WithTimeoutFallbackFunction( fallbackFn ServiceFallbackFunc) *CircuitBreakDecoratorConfig
WithTimeoutFallbackFunction sets the fallback method for timeout error
type ConfigStorage ¶
ConfigStorage is to store the configuration
type ConsulConfigStorage ¶
type ConsulConfigStorage struct {
// contains filtered or unexported fields
}
ConsulConfigStorage the configuration storage with Consul KV
func CreateConsulConfigStorage ¶
func CreateConsulConfigStorage(consulConfig *api.Config) (*ConsulConfigStorage, error)
CreateConsulConfigStorage is to create a ConsulConfigStorage
type Decorator ¶
type Decorator interface { // Decorate function is to introdoce decorator's the functions Decorate(ServiceFunc) ServiceFunc }
Decorator is the interface of the decorators.
type ErrorClassifier ¶
ErrorClassifier is to decide the type/class of the error the return values are string: the type/class bool: if the error needs to be put into the metrics
type ErrorDistinguisherFn ¶
ErrorDistinguisherFn is to decide if the error should be counted.
type MetricDecorator ¶
type MetricDecorator struct {
// contains filtered or unexported fields
}
MetricDecorator is to introduce the metrics of the service. It is based on GMet (https://github.com/easierway/g_met)
func (*MetricDecorator) Decorate ¶
func (dec *MetricDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
Decorate is to add the metrics logic to the inner service function
type MetricDecoratorConfig ¶
type MetricDecoratorConfig struct {
// contains filtered or unexported fields
}
MetricDecoratorConfig is the configuration MetricDecorator
func CreateMetricDecorator ¶
func CreateMetricDecorator(gmetInstance g_met.GMet) *MetricDecoratorConfig
CreateMetricDecorator is the helper method of creating CreateMetricDecorator instance. The settings can be defined by WithXX method chain
func (*MetricDecoratorConfig) Build ¶
func (config *MetricDecoratorConfig) Build() (*MetricDecorator, error)
Build is to create a CreateMetricDecorator instance according to the settings
func (*MetricDecoratorConfig) NeedsRecordingTimeSpent ¶
func (config *MetricDecoratorConfig) NeedsRecordingTimeSpent() *MetricDecoratorConfig
NeedsRecordingTimeSpent is to turn on the time spent metrics
func (*MetricDecoratorConfig) WithErrorClassifier ¶
func (config *MetricDecoratorConfig) WithErrorClassifier(errClassifier ErrorClassifier) *MetricDecoratorConfig
WithErrorClassifier is to set the ErrorClassifier
type RateLimitDecorator ¶
type RateLimitDecorator struct {
// contains filtered or unexported fields
}
RateLimitDecorator provides the rate limit control RateLimitDecoratorConfig is the rate limit Configurations Rate = NumOfRequests / Interval
func CreateRateLimitDecorator ¶
func CreateRateLimitDecorator(interval time.Duration, numOfReqs int, tokenBucketSize int) (*RateLimitDecorator, error)
CreateRateLimitDecorator is to create a RateLimitDecorator
func (*RateLimitDecorator) Decorate ¶
func (dec *RateLimitDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
Decorate function is to add request rate limit logic to the function
type RetryDecorator ¶
type RetryDecorator struct {
// contains filtered or unexported fields
}
RetryDecorator is to add the retry logic to the decorated method.
func CreateRetryDecorator ¶
func CreateRetryDecorator(maxRetryTimes int, retryInterval time.Duration, intervalIncrement time.Duration, retriableChecker func(err error) bool) (*RetryDecorator, error)
CreateRetryDecorator is to create RetryDecorator according to the settings maxRetryTimes : max retry times retryInterval, intervalIncrement : the sleep time before next retrying is retryInterval + (retry times - 1) * intervalIncrement retriableChecker : the function to check wether the error is retriable
func (*RetryDecorator) Decorate ¶
func (dec *RetryDecorator) Decorate(innerFn ServiceFunc) ServiceFunc
Decorator function is to add the retry logic to the decorated method
type ServiceFallbackFunc ¶
ServiceFallbackFunc is the fallback function definition
type ServiceFunc ¶
ServiceFunc is the service function definition. To leverage the prebuilt decorators, the service function signature should follow it.