mirror of
https://github.com/TeaOSLab/EdgeCommon.git
synced 2025-11-09 00:20:25 +08:00
实现服务的缓存策略设置
This commit is contained in:
@@ -1,67 +0,0 @@
|
|||||||
package serverconfigs
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
|
||||||
"github.com/iwind/TeaGo/lists"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var DefaultSkippedResponseCacheControlValues = []string{"private", "no-cache", "no-store"}
|
|
||||||
|
|
||||||
type HTTPCacheCond struct {
|
|
||||||
Key string `yaml:"key" json:"key"` // 每个缓存的Key规则,里面可以有变量
|
|
||||||
Life *shared.TimeDuration `yaml:"life" json:"life"` // 时间
|
|
||||||
Status []int `yaml:"status" json:"status"` // 缓存的状态码列表
|
|
||||||
MaxSize *shared.SizeCapacity `yaml:"maxSize" json:"maxSize"` // 能够请求的最大尺寸
|
|
||||||
|
|
||||||
SkipResponseCacheControlValues []string `yaml:"skipCacheControlValues" json:"skipCacheControlValues"` // 可以跳过的响应的Cache-Control值
|
|
||||||
SkipResponseSetCookie bool `yaml:"skipSetCookie" json:"skipSetCookie"` // 是否跳过响应的Set-Cookie Header
|
|
||||||
EnableRequestCachePragma bool `yaml:"enableRequestCachePragma" json:"enableRequestCachePragma"` // 是否支持客户端的Pragma: no-cache
|
|
||||||
|
|
||||||
Conds *shared.HTTPRequestCondsConfig `yaml:"conds" json:"conds"` // 请求条件
|
|
||||||
|
|
||||||
life time.Duration
|
|
||||||
maxSize int64
|
|
||||||
uppercaseSkipCacheControlValues []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPCacheCond) Init() error {
|
|
||||||
if this.MaxSize != nil {
|
|
||||||
this.maxSize = this.MaxSize.Bytes()
|
|
||||||
}
|
|
||||||
if this.Life != nil {
|
|
||||||
this.life = this.Life.Duration()
|
|
||||||
}
|
|
||||||
|
|
||||||
// control-values
|
|
||||||
this.uppercaseSkipCacheControlValues = []string{}
|
|
||||||
for _, value := range this.SkipResponseCacheControlValues {
|
|
||||||
this.uppercaseSkipCacheControlValues = append(this.uppercaseSkipCacheControlValues, strings.ToUpper(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
// conds
|
|
||||||
if this.Conds != nil {
|
|
||||||
err := this.Conds.Init()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 最大数据尺寸
|
|
||||||
func (this *HTTPCacheCond) MaxDataSize() int64 {
|
|
||||||
return this.maxSize
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生命周期
|
|
||||||
func (this *HTTPCacheCond) LifeDuration() time.Duration {
|
|
||||||
return this.life
|
|
||||||
}
|
|
||||||
|
|
||||||
// 是否包含某个Cache-Control值
|
|
||||||
func (this *HTTPCacheCond) ContainsCacheControl(value string) bool {
|
|
||||||
return lists.ContainsString(this.uppercaseSkipCacheControlValues, strings.ToUpper(value))
|
|
||||||
}
|
|
||||||
18
pkg/serverconfigs/http_cache_config.go
Normal file
18
pkg/serverconfigs/http_cache_config.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package serverconfigs
|
||||||
|
|
||||||
|
type HTTPCacheConfig struct {
|
||||||
|
IsPrior bool `yaml:"isPrior" json:"isPrior"`
|
||||||
|
IsOn bool `yaml:"isOn" json:"isOn"`
|
||||||
|
|
||||||
|
CacheRefs []*HTTPCacheRef `yaml:"cacheRefs" json:"cacheRefs"` // 缓存配置
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *HTTPCacheConfig) Init() error {
|
||||||
|
for _, cacheRef := range this.CacheRefs {
|
||||||
|
err := cacheRef.Init()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package serverconfigs
|
|
||||||
|
|
||||||
type CachePolicyType = string
|
|
||||||
|
|
||||||
type HTTPFileCacheConfig struct {
|
|
||||||
Dir string `yaml:"dir" json:"dir"` // 目录
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPFileCacheConfig) Init() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package serverconfigs
|
|
||||||
|
|
||||||
type HTTPMemoryCacheConfig struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *HTTPMemoryCacheConfig) Init() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,7 @@ type HTTPCachePolicy struct {
|
|||||||
Capacity *shared.SizeCapacity `yaml:"capacity" json:"capacity"` // 最大内容容量 TODO 需要实现
|
Capacity *shared.SizeCapacity `yaml:"capacity" json:"capacity"` // 最大内容容量 TODO 需要实现
|
||||||
MaxKeys int64 `yaml:"maxKeys" json:"maxKeys"` // 最多Key值 TODO 需要实现
|
MaxKeys int64 `yaml:"maxKeys" json:"maxKeys"` // 最多Key值 TODO 需要实现
|
||||||
MaxSize *shared.SizeCapacity `yaml:"maxSize" json:"maxSize"` // 单个缓存最大尺寸 TODO 需要实现
|
MaxSize *shared.SizeCapacity `yaml:"maxSize" json:"maxSize"` // 单个缓存最大尺寸 TODO 需要实现
|
||||||
Type CachePolicyType `yaml:"type" json:"type"` // 类型
|
Type CachePolicyStorageType `yaml:"type" json:"type"` // 类型
|
||||||
Options map[string]interface{} `yaml:"options" json:"options"` // 选项
|
Options map[string]interface{} `yaml:"options" json:"options"` // 选项
|
||||||
|
|
||||||
capacity int64
|
capacity int64
|
||||||
|
|||||||
@@ -2,25 +2,27 @@ package serverconfigs
|
|||||||
|
|
||||||
import "github.com/iwind/TeaGo/maps"
|
import "github.com/iwind/TeaGo/maps"
|
||||||
|
|
||||||
|
type CachePolicyStorageType = string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CachePolicyTypeFile CachePolicyType = "file"
|
CachePolicyStorageFile CachePolicyStorageType = "file"
|
||||||
CachePolicyTypeMemory CachePolicyType = "memory"
|
CachePolicyStorageMemory CachePolicyStorageType = "memory"
|
||||||
)
|
)
|
||||||
|
|
||||||
var AllCachePolicyTypes = []maps.Map{
|
var AllCachePolicyStorageTypes = []maps.Map{
|
||||||
{
|
{
|
||||||
"name": "文件缓存",
|
"name": "文件缓存",
|
||||||
"type": CachePolicyTypeFile,
|
"type": CachePolicyStorageFile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "内存缓存",
|
"name": "内存缓存",
|
||||||
"type": CachePolicyTypeMemory,
|
"type": CachePolicyStorageMemory,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据类型查找名称
|
// 根据类型查找名称
|
||||||
func FindCachePolicyTypeName(policyType CachePolicyType) string {
|
func FindCachePolicyStorageName(policyType CachePolicyStorageType) string {
|
||||||
for _, t := range AllCachePolicyTypes {
|
for _, t := range AllCachePolicyStorageTypes {
|
||||||
if t.GetString("type") == policyType {
|
if t.GetString("type") == policyType {
|
||||||
return t.GetString("name")
|
return t.GetString("name")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,80 @@
|
|||||||
package serverconfigs
|
package serverconfigs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
|
||||||
|
"github.com/iwind/TeaGo/lists"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var DefaultSkippedResponseCacheControlValues = []string{"private", "no-cache", "no-store"}
|
||||||
|
|
||||||
type HTTPCacheRef struct {
|
type HTTPCacheRef struct {
|
||||||
IsPrior bool `yaml:"isPrior" json:"isPrior"` // 是否覆盖
|
IsOn bool `yaml:"isOn" json:"isOn"`
|
||||||
IsOn bool `yaml:"isOn" json:"isOn"` // 是否开启
|
CachePolicyId int64 `yaml:"cachePolicyId" json:"cachePolicyId"`
|
||||||
CachePolicyId int64 `yaml:"cachePolicyId" json:"cachePolicyId"` // 缓存策略ID
|
|
||||||
Cond *HTTPCacheCond `yaml:"cond" json:"cond"` // 条件
|
Key string `yaml:"key" json:"key"` // 每个缓存的Key规则,里面可以有变量
|
||||||
|
Life *shared.TimeDuration `yaml:"life" json:"life"` // 时间
|
||||||
|
Status []int `yaml:"status" json:"status"` // 缓存的状态码列表
|
||||||
|
MaxSize *shared.SizeCapacity `yaml:"maxSize" json:"maxSize"` // 能够请求的最大尺寸
|
||||||
|
|
||||||
|
SkipResponseCacheControlValues []string `yaml:"skipCacheControlValues" json:"skipCacheControlValues"` // 可以跳过的响应的Cache-Control值
|
||||||
|
SkipResponseSetCookie bool `yaml:"skipSetCookie" json:"skipSetCookie"` // 是否跳过响应的Set-Cookie Header
|
||||||
|
EnableRequestCachePragma bool `yaml:"enableRequestCachePragma" json:"enableRequestCachePragma"` // 是否支持客户端的Pragma: no-cache
|
||||||
|
|
||||||
|
Conds *shared.HTTPRequestCondsConfig `yaml:"conds" json:"conds"` // 请求条件
|
||||||
|
|
||||||
|
CachePolicy *HTTPCachePolicy `yaml:"cachePolicy" json:"cachePolicy"`
|
||||||
|
|
||||||
|
life time.Duration
|
||||||
|
maxSize int64
|
||||||
|
uppercaseSkipCacheControlValues []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *HTTPCacheRef) Init() error {
|
func (this *HTTPCacheRef) Init() error {
|
||||||
if this.Cond != nil {
|
if this.MaxSize != nil {
|
||||||
err := this.Cond.Init()
|
this.maxSize = this.MaxSize.Bytes()
|
||||||
|
}
|
||||||
|
if this.Life != nil {
|
||||||
|
this.life = this.Life.Duration()
|
||||||
|
}
|
||||||
|
|
||||||
|
// control-values
|
||||||
|
this.uppercaseSkipCacheControlValues = []string{}
|
||||||
|
for _, value := range this.SkipResponseCacheControlValues {
|
||||||
|
this.uppercaseSkipCacheControlValues = append(this.uppercaseSkipCacheControlValues, strings.ToUpper(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// conds
|
||||||
|
if this.Conds != nil {
|
||||||
|
err := this.Conds.Init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// policy
|
||||||
|
if this.CachePolicy != nil {
|
||||||
|
err := this.CachePolicy.Init()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 最大数据尺寸
|
||||||
|
func (this *HTTPCacheRef) MaxDataSize() int64 {
|
||||||
|
return this.maxSize
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生命周期
|
||||||
|
func (this *HTTPCacheRef) LifeDuration() time.Duration {
|
||||||
|
return this.life
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是否包含某个Cache-Control值
|
||||||
|
func (this *HTTPCacheRef) ContainsCacheControl(value string) bool {
|
||||||
|
return lists.ContainsString(this.uppercaseSkipCacheControlValues, strings.ToUpper(value))
|
||||||
|
}
|
||||||
|
|||||||
9
pkg/serverconfigs/http_cache_storage_file.go
Normal file
9
pkg/serverconfigs/http_cache_storage_file.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package serverconfigs
|
||||||
|
|
||||||
|
type HTTPFileCacheStorage struct {
|
||||||
|
Dir string `yaml:"dir" json:"dir"` // 目录
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *HTTPFileCacheStorage) Init() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
8
pkg/serverconfigs/http_cache_storage_memory.go
Normal file
8
pkg/serverconfigs/http_cache_storage_memory.go
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
package serverconfigs
|
||||||
|
|
||||||
|
type HTTPMemoryCacheStorage struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *HTTPMemoryCacheStorage) Init() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -17,8 +17,7 @@ type HTTPWebConfig struct {
|
|||||||
MaxRequestBodySize string `yaml:"maxRequestBodySize" json:"maxRequestBodySize"` // 请求body最大尺寸 TODO 需要实现
|
MaxRequestBodySize string `yaml:"maxRequestBodySize" json:"maxRequestBodySize"` // 请求body最大尺寸 TODO 需要实现
|
||||||
AccessLogRef *HTTPAccessLogRef `yaml:"accessLog" json:"accessLog"` // 访问日志配置
|
AccessLogRef *HTTPAccessLogRef `yaml:"accessLog" json:"accessLog"` // 访问日志配置
|
||||||
StatRef *HTTPStatRef `yaml:"statRef" json:"statRef"` // 统计配置
|
StatRef *HTTPStatRef `yaml:"statRef" json:"statRef"` // 统计配置
|
||||||
CacheRefs []*HTTPCacheRef `yaml:"cacheRefs" json:"cacheRefs"` // 缓存配置
|
Cache *HTTPCacheConfig `yaml:"cache" json:"cache"`
|
||||||
CachePolicies []*HTTPCachePolicy `yaml:"cachePolicies" json:"cachePolicies"` // 缓存策略
|
|
||||||
FirewallRef *HTTPFirewallRef `yaml:"firewallRef" json:"firewallRef"` // 防火墙设置
|
FirewallRef *HTTPFirewallRef `yaml:"firewallRef" json:"firewallRef"` // 防火墙设置
|
||||||
WebsocketRef *HTTPWebsocketRef `yaml:"websocketRef" json:"websocketRef"` // Websocket应用配置
|
WebsocketRef *HTTPWebsocketRef `yaml:"websocketRef" json:"websocketRef"` // Websocket应用配置
|
||||||
Websocket *HTTPWebsocketConfig `yaml:"websocket" json:"websocket"` // Websocket配置
|
Websocket *HTTPWebsocketConfig `yaml:"websocket" json:"websocket"` // Websocket配置
|
||||||
@@ -112,14 +111,8 @@ func (this *HTTPWebConfig) Init() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cache
|
// cache
|
||||||
for _, cacheRef := range this.CacheRefs {
|
if this.Cache != nil {
|
||||||
err := cacheRef.Init()
|
err := this.Cache.Init()
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, cachePolicy := range this.CachePolicies {
|
|
||||||
err := cachePolicy.Init()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user