Archived
实现请求连接数等限制
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package serverconfigs
|
||||
|
||||
import "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||||
|
||||
// HTTPRequestLimitConfig HTTP请求限制相关限制配置
|
||||
type HTTPRequestLimitConfig struct {
|
||||
IsPrior bool `yaml:"isPrior" json:"isPrior"` // 是否覆盖父级
|
||||
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用
|
||||
MaxConns int `yaml:"maxConns" json:"maxConns"` // 并发连接数
|
||||
MaxConnsPerIP int `yaml:"maxConnsPerIP" json:"maxConnsPerIP"` // 单个IP并发连接数
|
||||
OutBandwidthPerConn *shared.SizeCapacity `yaml:"outBandwidthPerConn" json:"outBandwidthPerConn"` // 下行流量限制
|
||||
MaxBodySize *shared.SizeCapacity `yaml:"maxBodySize" json:"maxBodySize"` // 单个请求最大尺寸
|
||||
|
||||
outBandwidthPerConnBytes int64
|
||||
maxBodyBytes int64
|
||||
}
|
||||
|
||||
func (this *HTTPRequestLimitConfig) Init() error {
|
||||
if this.OutBandwidthPerConn != nil {
|
||||
this.outBandwidthPerConnBytes = this.OutBandwidthPerConn.Bytes()
|
||||
}
|
||||
if this.MaxBodySize != nil {
|
||||
this.maxBodyBytes = this.MaxBodySize.Bytes()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *HTTPRequestLimitConfig) OutBandwidthPerConnBytes() int64 {
|
||||
return this.outBandwidthPerConnBytes
|
||||
}
|
||||
|
||||
func (this *HTTPRequestLimitConfig) MaxBodyBytes() int64 {
|
||||
return this.maxBodyBytes
|
||||
}
|
||||
@@ -43,6 +43,8 @@ type HTTPWebConfig struct {
|
||||
|
||||
RemoteAddr *HTTPRemoteAddrConfig `yaml:"remoteAddr" json:"remoteAddr"` // 客户端IP获取方式
|
||||
MergeSlashes bool `yaml:"mergeSlashes" json:"mergeSlashes"` // 是否合并路径中的斜杠(/)
|
||||
|
||||
RequestLimit *HTTPRequestLimitConfig `yaml:"requestLimit" json:"requestLimit"` // 并发请求限制
|
||||
}
|
||||
|
||||
func (this *HTTPWebConfig) Init() error {
|
||||
@@ -252,6 +254,14 @@ func (this *HTTPWebConfig) Init() error {
|
||||
}
|
||||
}
|
||||
|
||||
// request limit
|
||||
if this.RequestLimit != nil {
|
||||
err := this.RequestLimit.Init()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -159,6 +159,11 @@ func (this *ServerConfig) Init() (results []error) {
|
||||
this.Web.Pages = groupWeb.Pages
|
||||
this.Web.Shutdown = groupWeb.Shutdown
|
||||
}
|
||||
|
||||
// request limit
|
||||
if groupWeb.RequestLimit != nil && groupWeb.RequestLimit.IsPrior {
|
||||
this.Web.RequestLimit = groupWeb.RequestLimit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ const (
|
||||
SizeCapacityUnitGB SizeCapacityUnit = "gb"
|
||||
SizeCapacityUnitTB SizeCapacityUnit = "tb"
|
||||
SizeCapacityUnitPB SizeCapacityUnit = "pb"
|
||||
SizeCapacityUnitEB SizeCapacityUnit = "eb"
|
||||
//SizeCapacityUnitZB SizeCapacityUnit = "zb" // zb和yb超出int64范围,暂不支持
|
||||
//SizeCapacityUnitYB SizeCapacityUnit = "yb"
|
||||
)
|
||||
|
||||
type SizeCapacity struct {
|
||||
@@ -26,15 +29,17 @@ func (this *SizeCapacity) Bytes() int64 {
|
||||
case SizeCapacityUnitByte:
|
||||
return this.Count
|
||||
case SizeCapacityUnitKB:
|
||||
return this.Count * 1024
|
||||
return this.Count * this.pow(1)
|
||||
case SizeCapacityUnitMB:
|
||||
return this.Count * 1024 * 1024
|
||||
return this.Count * this.pow(2)
|
||||
case SizeCapacityUnitGB:
|
||||
return this.Count * 1024 * 1024 * 1024
|
||||
return this.Count * this.pow(3)
|
||||
case SizeCapacityUnitTB:
|
||||
return this.Count * 1024 * 1024 * 1024 * 1024
|
||||
return this.Count * this.pow(4)
|
||||
case SizeCapacityUnitPB:
|
||||
return this.Count * 1024 * 1024 * 1024 * 1024 * 1024
|
||||
return this.Count * this.pow(5)
|
||||
case SizeCapacityUnitEB:
|
||||
return this.Count * this.pow(6)
|
||||
default:
|
||||
return this.Count
|
||||
}
|
||||
@@ -43,3 +48,13 @@ func (this *SizeCapacity) Bytes() int64 {
|
||||
func (this *SizeCapacity) AsJSON() ([]byte, error) {
|
||||
return json.Marshal(this)
|
||||
}
|
||||
|
||||
func (this *SizeCapacity) pow(n int) int64 {
|
||||
if n <= 0 {
|
||||
return 1
|
||||
}
|
||||
if n == 1 {
|
||||
return 1024
|
||||
}
|
||||
return this.pow(n-1) * 1024
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||||
|
||||
package shared
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestSizeCapacity_Bytes(t *testing.T) {
|
||||
for _, unit := range []string{
|
||||
SizeCapacityUnitByte,
|
||||
SizeCapacityUnitKB,
|
||||
SizeCapacityUnitMB,
|
||||
SizeCapacityUnitGB,
|
||||
SizeCapacityUnitTB,
|
||||
SizeCapacityUnitPB,
|
||||
SizeCapacityUnitEB,
|
||||
} {
|
||||
var capacity = &SizeCapacity{
|
||||
Count: 1,
|
||||
Unit: unit,
|
||||
}
|
||||
t.Log(unit, capacity.Bytes())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user