# 启动配置
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"` | |
} |
这里特别强调一下 StatIntervalInMs
和 Threshold
这两个字段,这两个字段决定了流量控制器的灵敏度。以 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 | 例子 | 说明 |
---|---|---|
1 | 1529573107000 | 时间戳 |
2 | 2018-06-21 17:25:07 | 日期 |
3 | foo-service | 资源名称 |
4 | 10 | 这一秒通过的资源请求个数 (pass) |
5 | 3601 | 这一秒资源被拦截的个数 (block) |
6 | 10 | 这一秒完成调用的资源个数 (complete),包括正常结束和异常结束的情况 |
7 | 0 | 这一秒资源的异常个数 (error) |
8 | 27 | 资源平均响应时间(ms) |
9 | 0 | 预留字段 |
10 | 5 | 该秒的最大并发,预留用 |
11 | 1 | 资源分类 |
# 官方指南
https://github.com/alibaba/sentinel-golang/wiki