mirror of
https://github.com/alibaba/higress.git
synced 2026-06-09 04:37:31 +08:00
feat: 🎸 add frontend gray plugin (#1120)
Co-authored-by: Kent Dong <ch3cho@qq.com>
This commit is contained in:
78
plugins/wasm-go/extensions/frontend-gray/main.go
Normal file
78
plugins/wasm-go/extensions/frontend-gray/main.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/alibaba/higress/plugins/wasm-go/extensions/frontend-gray/config"
|
||||
"github.com/alibaba/higress/plugins/wasm-go/extensions/frontend-gray/util"
|
||||
|
||||
"github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper"
|
||||
"github.com/higress-group/proxy-wasm-go-sdk/proxywasm"
|
||||
"github.com/higress-group/proxy-wasm-go-sdk/proxywasm/types"
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
func main() {
|
||||
wrapper.SetCtx(
|
||||
"frontend-gray",
|
||||
wrapper.ParseConfigBy(parseConfig),
|
||||
wrapper.ProcessRequestHeadersBy(onHttpRequestHeaders),
|
||||
)
|
||||
}
|
||||
|
||||
func parseConfig(json gjson.Result, grayConfig *config.GrayConfig, log wrapper.Log) error {
|
||||
// 解析json 为GrayConfig
|
||||
config.JsonToGrayConfig(json, grayConfig)
|
||||
return nil
|
||||
}
|
||||
|
||||
// FilterGrayRule 过滤灰度规则
|
||||
func FilterGrayRule(grayConfig *config.GrayConfig, grayKeyValue string, log wrapper.Log) *config.GrayDeployments {
|
||||
for _, grayDeployment := range grayConfig.GrayDeployments {
|
||||
if !grayDeployment.Enabled {
|
||||
// 跳过Enabled=false
|
||||
continue
|
||||
}
|
||||
grayRule := util.GetRule(grayConfig.Rules, grayDeployment.Name)
|
||||
// 首先:先校验用户名单ID
|
||||
if grayRule.GrayKeyValue != nil && len(grayRule.GrayKeyValue) > 0 && grayKeyValue != "" {
|
||||
if util.Contains(grayRule.GrayKeyValue, grayKeyValue) {
|
||||
log.Infof("x-mse-tag: %s, grayKeyValue: %s", grayDeployment.Version, grayKeyValue)
|
||||
return grayDeployment
|
||||
}
|
||||
}
|
||||
// 第二:校验Cookie中的 GrayTagKey
|
||||
if grayRule.GrayTagKey != "" && grayRule.GrayTagValue != nil && len(grayRule.GrayTagValue) > 0 {
|
||||
cookieStr, _ := proxywasm.GetHttpRequestHeader("cookie")
|
||||
grayTagValue := util.GetValueByCookie(cookieStr, grayRule.GrayTagKey)
|
||||
if util.Contains(grayRule.GrayTagValue, grayTagValue) {
|
||||
log.Infof("x-mse-tag: %s, grayTag: %s=%s", grayDeployment.Version, grayRule.GrayTagKey, grayTagValue)
|
||||
return grayDeployment
|
||||
}
|
||||
}
|
||||
}
|
||||
log.Infof("x-mse-tag: %s, grayKeyValue: %s", grayConfig.BaseDeployment.Version, grayKeyValue)
|
||||
return nil
|
||||
}
|
||||
|
||||
func onHttpRequestHeaders(ctx wrapper.HttpContext, grayConfig config.GrayConfig, log wrapper.Log) types.Action {
|
||||
// 优先从cookie中获取,如果拿不到再从header中获取
|
||||
cookieStr, _ := proxywasm.GetHttpRequestHeader("cookie")
|
||||
grayHeaderKey, _ := proxywasm.GetHttpRequestHeader(grayConfig.GrayKey)
|
||||
grayKeyValue := util.GetValueByCookie(cookieStr, grayConfig.GrayKey)
|
||||
proxywasm.RemoveHttpRequestHeader("Accept-Encoding")
|
||||
// 优先从Cookie中获取,否则从header中获取
|
||||
if grayKeyValue == "" {
|
||||
grayKeyValue = grayHeaderKey
|
||||
}
|
||||
// 如果有子key, 尝试从子key中获取值
|
||||
if grayConfig.GraySubKey != "" {
|
||||
subKeyValue := util.GetBySubKey(grayKeyValue, grayConfig.GraySubKey)
|
||||
if subKeyValue != "" {
|
||||
grayKeyValue = subKeyValue
|
||||
}
|
||||
}
|
||||
grayDeployment := FilterGrayRule(&grayConfig, grayKeyValue, log)
|
||||
if grayDeployment != nil {
|
||||
proxywasm.AddHttpRequestHeader("x-mse-tag", grayDeployment.Version)
|
||||
}
|
||||
return types.ActionContinue
|
||||
}
|
||||
Reference in New Issue
Block a user