| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package router
- import (
- "github.com/golang/protobuf/proto"
- "github.com/v2fly/v2ray-core/v4/app/observatory/burst"
- "github.com/v2fly/v2ray-core/v4/app/router"
- "github.com/v2fly/v2ray-core/v4/infra/conf/cfgcommon/duration"
- "github.com/v2fly/v2ray-core/v4/infra/conf/cfgcommon/loader"
- )
- const (
- strategyRandom string = "random"
- strategyLeastLoad string = "leastload"
- strategyLeastPing string = "leastping"
- )
- var strategyConfigLoader = loader.NewJSONConfigLoader(loader.ConfigCreatorCache{
- strategyRandom: func() interface{} { return new(strategyEmptyConfig) },
- strategyLeastLoad: func() interface{} { return new(strategyLeastLoadConfig) },
- strategyLeastPing: func() interface{} { return new(strategyLeastPingConfig) },
- }, "type", "settings")
- type strategyEmptyConfig struct{}
- func (v *strategyEmptyConfig) Build() (proto.Message, error) {
- return nil, nil
- }
- type strategyLeastLoadConfig struct {
- // weight settings
- Costs []*router.StrategyWeight `json:"costs,omitempty"`
- // ping rtt baselines
- Baselines []duration.Duration `json:"baselines,omitempty"`
- // expected nodes count to select
- Expected int32 `json:"expected,omitempty"`
- // max acceptable rtt, filter away high delay nodes. defalut 0
- MaxRTT duration.Duration `json:"maxRTT,omitempty"`
- // acceptable failure rate
- Tolerance float64 `json:"tolerance,omitempty"`
- ObserverTag string `json:"observerTag,omitempty"`
- }
- // HealthCheckSettings holds settings for health Checker
- type HealthCheckSettings struct {
- Destination string `json:"destination"`
- Connectivity string `json:"connectivity"`
- Interval duration.Duration `json:"interval"`
- SamplingCount int `json:"sampling"`
- Timeout duration.Duration `json:"timeout"`
- }
- func (h HealthCheckSettings) Build() (proto.Message, error) {
- return &burst.HealthPingConfig{
- Destination: h.Destination,
- Connectivity: h.Connectivity,
- Interval: int64(h.Interval),
- Timeout: int64(h.Timeout),
- SamplingCount: int32(h.SamplingCount),
- }, nil
- }
- // Build implements Buildable.
- func (v *strategyLeastLoadConfig) Build() (proto.Message, error) {
- config := &router.StrategyLeastLoadConfig{}
- config.Costs = v.Costs
- config.Tolerance = float32(v.Tolerance)
- config.ObserverTag = v.ObserverTag
- if config.Tolerance < 0 {
- config.Tolerance = 0
- }
- if config.Tolerance > 1 {
- config.Tolerance = 1
- }
- config.Expected = v.Expected
- if config.Expected < 0 {
- config.Expected = 0
- }
- config.MaxRTT = int64(v.MaxRTT)
- if config.MaxRTT < 0 {
- config.MaxRTT = 0
- }
- config.Baselines = make([]int64, 0)
- for _, b := range v.Baselines {
- if b <= 0 {
- continue
- }
- config.Baselines = append(config.Baselines, int64(b))
- }
- return config, nil
- }
- type strategyLeastPingConfig struct {
- ObserverTag string `json:"observerTag,omitempty"`
- }
- func (s strategyLeastPingConfig) Build() (proto.Message, error) {
- return &router.StrategyLeastPingConfig{ObserverTag: s.ObserverTag}, nil
- }
|