From 5f76be2cfd30858a5449ca88ae2fc8a05c7f5b49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sun, 13 Nov 2022 10:32:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/rpc_client.go | 16 +++++++- internal/rpc/rpc_test.go | 62 +++++++++++++++++++++++++++++ internal/stats/user_agent_parser.go | 9 +++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 internal/rpc/rpc_test.go diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index ed04eb9..ae6c189 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -27,6 +27,9 @@ type RPCClient struct { apiConfig *configs.APIConfig conns []*grpc.ClientConn + ctx context.Context + ctxUpdatedAt int64 + locker sync.RWMutex NodeRPC pb.NodeServiceClient @@ -94,7 +97,12 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) { // Context 节点上下文信息 func (this *RPCClient) Context() context.Context { - var ctx = context.Background() + var currentTime = time.Now().Unix() + + if this.ctx != nil && this.ctxUpdatedAt > currentTime-5 { + return this.ctx + } + var m = maps.Map{ "timestamp": time.Now().Unix(), "type": "node", @@ -111,7 +119,13 @@ func (this *RPCClient) Context() context.Context { return context.Background() } var token = base64.StdEncoding.EncodeToString(data) + + var ctx = context.Background() ctx = metadata.AppendToOutgoingContext(ctx, "nodeId", this.apiConfig.NodeId, "token", token) + + this.ctxUpdatedAt = currentTime + this.ctx = ctx + return ctx } diff --git a/internal/rpc/rpc_test.go b/internal/rpc/rpc_test.go new file mode 100644 index 0000000..c55bca0 --- /dev/null +++ b/internal/rpc/rpc_test.go @@ -0,0 +1,62 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package rpc_test + +import ( + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeNode/internal/rpc" + _ "github.com/iwind/TeaGo/bootstrap" + timeutil "github.com/iwind/TeaGo/utils/time" + "sync" + "testing" + "time" +) + +func TestRPCConcurrentCall(t *testing.T) { + rpcClient, err := rpc.SharedRPC() + if err != nil { + t.Fatal(err) + } + + var before = time.Now() + defer func() { + t.Log("cost:", time.Since(before).Seconds()*1000, "ms") + }() + + var concurrent = 3 + + var wg = sync.WaitGroup{} + wg.Add(concurrent) + + for i := 0; i < concurrent; i++ { + go func() { + defer wg.Done() + + _, err = rpcClient.NodeRPC.FindCurrentNodeConfig(rpcClient.Context(), &pb.FindCurrentNodeConfigRequest{}) + if err != nil { + t.Log(err) + } + }() + } + + wg.Wait() +} + +func TestRPC_Retry(t *testing.T) { + rpcClient, err := rpc.SharedRPC() + if err != nil { + t.Fatal(err) + } + + var ticker = time.NewTicker(1 * time.Second) + for range ticker.C { + go func() { + _, err = rpcClient.NodeRPC.FindCurrentNodeConfig(rpcClient.Context(), &pb.FindCurrentNodeConfigRequest{}) + if err != nil { + t.Log(timeutil.Format("H:i:s"), err) + } else { + t.Log(timeutil.Format("H:i:s"), "success") + } + }() + } +} diff --git a/internal/stats/user_agent_parser.go b/internal/stats/user_agent_parser.go index a815e0b..ba61e2e 100644 --- a/internal/stats/user_agent_parser.go +++ b/internal/stats/user_agent_parser.go @@ -73,6 +73,15 @@ func (this *UserAgentParser) Parse(userAgent string) (result UserAgentParserResu result.BrowserName, result.BrowserVersion = this.parser.Browser() result.IsMobile = this.parser.Mobile() + // 忽略特殊字符 + if len(result.BrowserName) > 0 { + for _, r := range result.BrowserName { + if r == '$' || r == '"' || r == '\'' || r == '<' || r == '>' || r == ')' { + return + } + } + } + if this.cacheCursor == 0 { this.cacheMap1[userAgent] = result if len(this.cacheMap1) >= this.maxCacheItems {