# 启动配置

type Entity struct {
	// Version 表示配置的格式版本。
	Version string
	// Sentinel 表示 Sentinel 的配置信息。
	Sentinel SentinelConfig
}
// SentinelConfig 表示 Sentinel 的一般配置。
type SentinelConfig struct {
	App struct {
		// Name 表示当前运行的服务的名称。
		Name string
		// Type 表示服务的分类(例如:web 服务、API 网关等)。
		Type int32
	}
	// Log 表示与日志记录相关的配置项。
	Log LogConfig
	// Stat 表示与统计相关的配置项。
	Stat StatConfig
	// UseCacheTime 表示是否缓存时间(以毫秒为单位)。
	UseCacheTime bool `yaml:"useCacheTime"`
}
// LogConfig 表示 Sentinel 中的日志配置。
type LogConfig struct {
	// Logger 表示是否使用日志记录器替代默认的日志记录。
    // 如果用户期望使用自定义的 Logger 去覆盖 Sentinel 默认的 logger,需要指定这个对象,如果指定了,Sentinel 就会使用这个对象打日志
	Logger logging.Logger
	// Dir 表示日志文件的存储目录路径。
	Dir string
	// UsePid 表示日志文件名是否以进程 ID(PID)结尾。
	UsePid bool `yaml:"usePid"`
	// Metric 表示指标日志的配置项。
	Metric MetricLogConfig
}
// MetricLogConfig 表示指标日志的配置项。
type MetricLogConfig struct {
    // 监控日志单个文件大小上限 50MB
	SingleFileMaxSize uint64 `yaml:"singleFileMaxSize"`
    // 监控日志最大文件数目 8
	MaxFileCount      uint32 `yaml:"maxFileCount"`
    // 监控日志聚合和刷盘的时间频率 1s
	FlushIntervalSec  uint32 `yaml:"flushIntervalSec"`
}
// StatConfig 表示统计相关的配置项。
type StatConfig struct {
	// GlobalStatisticSampleCountTotal 和 GlobalStatisticIntervalMsTotal 是每个资源的全局默认统计滑动窗口配置。
	GlobalStatisticSampleCountTotal uint32 `yaml:"globalStatisticSampleCountTotal"`
	GlobalStatisticIntervalMsTotal  uint32 `yaml:"globalStatisticIntervalMsTotal"`
	// MetricStatisticSampleCount 和 MetricStatisticIntervalMs 是每个资源的默认只读指标统计配置。
	// 这个默认的只读指标统计必须基于全局统计。
	MetricStatisticSampleCount uint32 `yaml:"metricStatisticSampleCount"`
	MetricStatisticIntervalMs  uint32 `yaml:"metricStatisticIntervalMs"`
	System SystemStatConfig `yaml:"system"`
}
// SystemStatConfig 表示系统统计的配置项。
type SystemStatConfig struct {
	// CollectIntervalMs 表示系统指标收集器的采集间隔。
	CollectIntervalMs uint32 `yaml:"collectIntervalMs"`
}

支持配置方式

api.InitDefault() // 默认配置
api.InitWithConfig(confEntity *config.Entity) // 自定义
api.InitWithConfigFile(configPath string) //yaml 文件

# 定义资源

https://sentinelguard.io/zh-cn/docs/golang/basic-api-usage.html

使用 Sentinel 的 Entry API 将业务逻辑封装起来,这一步称为 “埋点”。每个埋点都有一个资源名称(resource),代表触发了这个资源的调用或访问。

埋点 API 位于 api 包中:

  • Entry(resource string, opts ...Option) (*base.SentinelEntry, *base.BlockError)

其中 resource 代表埋点资源名, opts 代表埋点配置。这里需要注意的是,返回值参数列表的第一个和第二个参数是互斥的,也就是说,如果 Entry 执行 pass,那么 Sentinel 会返回 (*base.SentinelEntry, nil);如果 Entry 执行 blocked,那么 Sentinel 会返回 (nil, *base.BlockError)。

目前支持以下埋点配置:

  • WithTrafficType(entryType base.TrafficType) :标记该埋点资源的流量类型,其中 Inbound 代表入口流量,Outbound 代表出口流量。若不指定,默认为 Outbound。
  • WithResourceType(resourceType base.ResourceType) :标记该埋点资源的分类。
  • WithAcquireCount(acquireCount uint32) :标记每次触发该埋点计为几次调用(可以理解为 batch count)。若不指定,默认为 1。
  • WithArgs(args ...interface{}) :埋点携带的参数列表,为热点参数统计预留。
  • WithSlotChain(chain *base.SlotChain) :埋点执行的检查的 slotchain,若不指定,默认使用全局 slotchain

# 流量控制

type Rule struct {
	// ID represents the unique ID of the rule (optional).
	ID string `json:"id,omitempty"`
	// 资源名,即规则的作用目标。
	Resource               string                 `json:"resource"`
    // 当前流量控制器的 Token 计算策略。Direct 表示直接使用字段 Threshold 作为阈值;WarmUp 表示使用预热方式计算 Token 的阈值。
	TokenCalculateStrategy TokenCalculateStrategy `json:"tokenCalculateStrategy"`
    // 表示流量控制器的控制策略;Reject 表示超过阈值直接拒绝,Throttling 表示匀速排队。
	ControlBehavior        ControlBehavior        `json:"controlBehavior"`
	// 表示流控阈值;如果字段 StatIntervalInMs 是 1000 (也就是 1 秒),那么 Threshold 就表示 QPS,流量控制器也就会依据资源的 QPS 来做流控。
	Threshold         float64          `json:"threshold"`
    // 调用关系限流策略,CurrentResource 表示使用当前规则的 resource 做流控;AssociatedResource 表示使用关联的 resource 做流控,关联的 resource 在字段 RefResource 定义
	RelationStrategy  RelationStrategy `json:"relationStrategy"`
    // 关联的 resource
	RefResource       string           `json:"refResource"`
    // 匀速排队的最大等待时间,该字段仅仅对 Throttling ControlBehavior 生效
	MaxQueueingTimeMs uint32           `json:"maxQueueingTimeMs"`
    // 预热的时间长度,该字段仅仅对 WarmUp 的 TokenCalculateStrategy 生效
	WarmUpPeriodSec   uint32           `json:"warmUpPeriodSec"`
    // 预热的因子,默认是 3,该值的设置会影响预热的速度,该字段仅仅对 WarmUp 的 TokenCalculateStrategy 生效
	WarmUpColdFactor  uint32           `json:"warmUpColdFactor"`
	// 规则对应的流量控制器的独立统计结构的统计周期。如果 StatIntervalInMs 是 1000,也就是统计 QPS。
	StatIntervalInMs uint32 `json:"statIntervalInMs"`
}

这里特别强调一下 StatIntervalInMsThreshold 这两个字段,这两个字段决定了流量控制器的灵敏度。以 Direct + Reject 的流控策略为例,流量控制器的行为就是在 StatIntervalInMs 周期内,允许的最大请求数量是 Threshold 。比如如果 StatIntervalInMs 是 10000, Threshold 是 10000,那么流量控制器的行为就是控制该资源 10s 内运行最多 10000 次访问。

# 熔断降级

type Rule struct {
	// 表示 Sentinel 规则的全局唯一 ID,可选项。
	Id string `json:"id,omitempty"`
	// 熔断器规则生效的埋点资源的名称
	Resource string   `json:"resource"`
    // 熔断策略,目前支持 SlowRequestRatio、ErrorRatio、ErrorCount 三种
	Strategy Strategy `json:"strategy"`
	// 即熔断触发后持续的时间(单位为 ms)。资源进入熔断状态后,在配置的熔断时长内,请求都会快速失败。熔断结束后进入探测恢复模式(HALF-OPEN)
	RetryTimeoutMs uint32 `json:"retryTimeoutMs"`
	// 静默数量,如果当前统计周期内对资源的访问数量小于静默数量,那么熔断器就处于静默期。换言之,也就是触发熔断的最小请求数目,若当前统计周期内的请求数小于此值,即使达到熔断条件规则也不会触发。
	MinRequestAmount uint64 `json:"minRequestAmount"`
	// 统计的时间窗口长度(单位为 ms)。
	StatIntervalMs uint32 `json:"statIntervalMs"`
	// 仅对慢调用熔断策略生效,MaxAllowedRtMs 是判断请求是否是慢调用的临界值,也就是如果请求的 response time 小于或等于 MaxAllowedRtMs,那么就不是慢调用;如果 response time 大于 MaxAllowedRtMs,那么当前请求就属于慢调用。
	MaxAllowedRtMs uint64 `json:"maxAllowedRtMs"`
	// 对于慢调用熔断策略,Threshold 表示是慢调用比例的阈值 (小数表示,比如 0.1 表示 10%),也就是如果当前资源的慢调用比例如果高于 Threshold,那么熔断器就会断开;否则保持闭合状态。 对于错误比例策略,Threshold 表示的是错误比例的阈值 (小数表示,比如 0.1 表示 10%)。对于错误数策略,Threshold 是错误计数的阈值。
	Threshold float64 `json:"threshold"`
}
// 选择以慢调用比例 (SlowRequestRatio) 作为阈值,需要设置允许的最大响应时间(MaxAllowedRtMs),请求的响应时间大于该值则统计为慢调用。通过 Threshold 字段设置触发熔断的慢调用比例,取值范围为 [0.0, 1.0]。规则配置后,在单位统计时长内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求响应时间小于设置的最大 RT 则结束熔断,若大于设置的最大 RT 则会再次被熔断。
// 选择以错误比例 (ErrorRatio) 作为阈值,需要设置触发熔断的异常比例(Threshold),取值范围为 [0.0, 1.0]。规则配置后,在单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求没有错误则结束熔断,否则会再次被熔断。代码中可以通过 api.TraceError (entry, err) 函数来记录 error。

一些补充说明:

  • Resource、Strategy、RetryTimeoutMs、MinRequestAmount、StatIntervalMs、Threshold 每个规则都必设的字段,MaxAllowedRtMs 是慢调用比例熔断规则必设的字段。

  • MaxAllowedRtMs 字段仅仅对慢调用比例 (SlowRequestRatio) 策略有效,对其余策略均属于无效字段。

  • StatIntervalMs 表示熔断器的统计周期,单位是毫秒,这个值我们不建议设置的太大或则太小,一般情况下设置 10 秒左右都 OK,当然也要根据实际情况来适当调整。

  • RetryTimeoutMs 的设置需要根据实际情况设置探测周期,一般情况下设置 10 秒左右都 OK,当然也要根据实际情况来适当调整。

# 降级

//stateChangeTestListener 是一个用于监视断路器状态变化的监听器
type stateChangeTestListener struct {
}
// OnTransformToClosed 当从其他状态转换为关闭状态时触发
func (s *stateChangeTestListener) OnTransformToClosed(prev circuitbreaker.State, rule circuitbreaker.Rule) {
	fmt.Printf("rule.strategy: %+v, 从 %s 转换为关闭状态, 时间: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())
}
// OnTransformToOpen 当从其他状态转换为打开状态时触发
func (s *stateChangeTestListener) OnTransformToOpen(prev circuitbreaker.State, rule circuitbreaker.Rule, snapshot interface{}) {
	fmt.Printf("rule.strategy: %+v, 从 %s 转换为打开状态, 快照: %.2f, 时间: %d\n", rule.Strategy, prev.String(), snapshot, util.CurrentTimeMillis())
}
// OnTransformToHalfOpen 当从其他状态转换为半开状态时触发
func (s *stateChangeTestListener) OnTransformToHalfOpen(prev circuitbreaker.State, rule circuitbreaker.Rule) {
	fmt.Printf("rule.strategy: %+v, 从 %s 转换为半开状态, 时间: %d\n", rule.Strategy, prev.String(), util.CurrentTimeMillis())
}

# 监控日志

1529573107000|2018-06-21 17:25:07|foo-service|10|3601|10|0|27|0|5|1

日志字段说明:

index例子说明
11529573107000时间戳
22018-06-21 17:25:07日期
3foo-service资源名称
410这一秒通过的资源请求个数 (pass)
53601这一秒资源被拦截的个数 (block)
610这一秒完成调用的资源个数 (complete),包括正常结束和异常结束的情况
70这一秒资源的异常个数 (error)
827资源平均响应时间(ms)
90预留字段
105该秒的最大并发,预留用
111资源分类

# 官方指南

https://github.com/alibaba/sentinel-golang/wiki

更新于

请我喝[茶]~( ̄▽ ̄)~*

镜玄 微信支付

微信支付

镜玄 支付宝

支付宝

镜玄 贝宝

贝宝