Skip to content

Commit

Permalink
perf: Improve parsing of node information
Browse files Browse the repository at this point in the history
  • Loading branch information
fufuok committed Aug 22, 2024
1 parent e44cadd commit ce13d67
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 18 deletions.
4 changes: 4 additions & 0 deletions config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,10 @@ func initDefaultConfig() {
EnvMainFile = filepath.Join(EnvFilePath, BinName+".env")
}

if NodeInfoBackupFile == "" {
NodeInfoBackupFile = filepath.Join(ConfigPath, "node_info.backup")
}

if ReqUserAgent == "" {
ReqUserAgent = AppName + "/" + Version
}
Expand Down
68 changes: 59 additions & 9 deletions config/node.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package config

import (
"context"
"net"
"os"
"strings"
"time"

"github.com/fufuok/utils"
"github.com/fufuok/utils/myip"
"github.com/imroc/req/v3"

Expand All @@ -16,7 +18,12 @@ import (
const UnknownNodeType = -1

var (
NodeInfoFile = ""
// NodeInfoFile 配置中指定的节点基本信息配置文件路径
NodeInfoFile string

// NodeInfoBackupFile 节点基本信息备份文件路径
NodeInfoBackupFile string

nodeIPFetcherRunning bool

// NodeIPFromAPI 已获取成功的节点 IP
Expand Down Expand Up @@ -69,13 +76,18 @@ func parseNodeInfoConfig(cfg *MainConf) {
NodeType: UnknownNodeType,
}

// 加载节点本地文件: node_info.json
// 首选: 加载节点本地配置文件: node_info.json
parseNodeInfoJson(cfg)

// 次选: 加载上次保存的有效节点配置文件: etc/node_info.backup
if cfg.NodeConf.NodeInfo.NodeIP == "" {
parseNodeInfoJsonBackup(cfg)
}

// 节点 IP 为空时, 以出口 IP 作为节点 IP
ip := cfg.NodeConf.NodeInfo.NodeIP
if ip == "" && cfg.NodeConf.IPAPI != "" {
ip = GetNodeIPFromAPI(cfg.NodeConf.IPAPI)
ip = GetNodeIPFromAPIs(cfg.NodeConf.IPAPI)
if ip == "" {
// 节点出口 IP 没有获取成功时, 使用已保存的 NodeIP
ip = NodeIPFromAPI
Expand All @@ -89,6 +101,9 @@ func parseNodeInfoConfig(cfg *MainConf) {
nodeIP = net.IPv4zero
}
cfg.NodeConf.NodeInfo.NodeIP = nodeIP.String()

// 备份节点配置
saveNodeInfoBackup(cfg.NodeConf.NodeInfo)
}

func parseNodeInfoJson(cfg *MainConf) {
Expand Down Expand Up @@ -124,15 +139,50 @@ func parseNodeInfoJson(cfg *MainConf) {
}
}

// GetNodeIPFromAPI 请求 API, 返回 IP 结果
func GetNodeIPFromAPI(api string, timeout ...time.Duration) string {
func parseNodeInfoJsonBackup(cfg *MainConf) {
body, err := os.ReadFile(NodeInfoBackupFile)
if err != nil {
return
}
var nInfo NodeInfo
if err := json.Unmarshal(body, &nInfo); err != nil {
return
}
cfg.NodeConf.NodeInfo = nInfo
}

func saveNodeInfoBackup(info NodeInfo) {
if info.NodeIP != net.IPv4zero.String() {
_ = os.WriteFile(NodeInfoBackupFile, json.MustJSON(info), 0o600)
}
}

// GetNodeIPFromAPIs 同时请求多个 API, 返回 IP 结果
func GetNodeIPFromAPIs(ipapi string, timeout ...time.Duration) string {
dur := ReqTimeoutShortDuration
if len(timeout) > 0 {
dur = timeout[0]
}
resp, err := req.DefaultClient().Clone().SetTimeout(dur).R().Get(api)
if err == nil && resp.IsSuccessState() {
return strings.TrimSpace(resp.String())

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

apis := utils.TrimSlice(strings.Split(ipapi, ","))
ipChan := make(chan string, len(apis))
for _, api := range apis {
api := api
go func() {
resp, err := req.DefaultClient().Clone().SetTimeout(dur).R().SetContext(ctx).Get(api)
if err == nil && resp.IsSuccessState() {
ipChan <- strings.TrimSpace(resp.String())
}
}()
}

select {
case ip := <-ipChan:
return ip
case <-time.After(dur):
}
return ""
}
Expand Down Expand Up @@ -160,7 +210,7 @@ func nodeIPFetcher(api string) {
if Config().NodeConf.IPAPI != "" {
api = Config().NodeConf.IPAPI
}
ip := GetNodeIPFromAPI(api, ReqTimeoutDuration)
ip := GetNodeIPFromAPIs(api, ReqTimeoutDuration)
if ip == "" {
continue
}
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ require (
github.com/fufuok/cron v0.3.2
github.com/fufuok/freelru v0.13.3
github.com/fufuok/ntp v1.0.0
github.com/fufuok/utils v1.2.4
github.com/fufuok/utils v1.2.6
github.com/gin-gonic/gin v1.10.0
github.com/go-cmd/cmd v1.4.3
github.com/goccy/go-json v0.10.3
Expand All @@ -28,7 +28,7 @@ require (
github.com/bytedance/sonic v1.12.1 // indirect
github.com/bytedance/sonic/loader v0.2.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudflare/circl v1.3.9 // indirect
github.com/cloudflare/circl v1.4.0 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
Expand All @@ -53,7 +53,7 @@ require (
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/onsi/ginkgo/v2 v2.20.0 // indirect
github.com/onsi/ginkgo/v2 v2.20.1 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.46.0 // indirect
Expand Down
12 changes: 6 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ github.com/chenyahui/gin-cache v1.9.0/go.mod h1:wh30aYY5rRMUAJmQvw1qoIIcEVRV1EkM
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE=
github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY=
github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
Expand All @@ -44,8 +44,8 @@ github.com/fufuok/freelru v0.13.3 h1:x8c0mmJ5d8Ddr4Lxw1KjZkvgeIblor7OAKH1wshq80M
github.com/fufuok/freelru v0.13.3/go.mod h1:6B/BCmtS+iIJmAFmCDfSUaLsuQtPio0BpBkPuAOgQ0k=
github.com/fufuok/ntp v1.0.0 h1:xGm9RBUrHGt1RDbzSoZtLsglRjwjzrxaKetHBZG9UGI=
github.com/fufuok/ntp v1.0.0/go.mod h1:K+adSFG6KYUvHRKPZEFP1jj3GFSvEU31AvuCbt7u92Q=
github.com/fufuok/utils v1.2.4 h1:ZQHUhN0VL179pj7c3sXm/OVcH0qvGSNViH008YRpXns=
github.com/fufuok/utils v1.2.4/go.mod h1:iQlt8HkIAZirhKsN8Ktjka4XW3U3RA0QpOQl4xTDA0I=
github.com/fufuok/utils v1.2.6 h1:QvJ7LOT4dUSNETL71iJ1vQ9JBFyzFQuA0QzAxkDEaVY=
github.com/fufuok/utils v1.2.6/go.mod h1:iQlt8HkIAZirhKsN8Ktjka4XW3U3RA0QpOQl4xTDA0I=
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
Expand Down Expand Up @@ -159,8 +159,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw=
github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
Expand Down

0 comments on commit ce13d67

Please sign in to comment.