From d416a2186c5554b712160fc91a4b03c35650d5dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sat, 12 Aug 2023 15:08:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86api.yaml=E4=BF=AE=E6=94=B9=E4=B8=BAapi?= =?UTF-8?q?=5Fnode.yaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/build.sh | 2 +- build/configs/.gitignore | 1 + build/configs/README.md | 2 +- ...i.template.yaml => api_node.template.yaml} | 0 cmd/edge-node/main.go | 4 +- internal/configs/api_config.go | 56 ++++++++++++------- internal/nodes/api_stream.go | 4 +- internal/nodes/node.go | 40 ++++++------- internal/nodes/node_tasks.go | 5 +- internal/nodes/task_sync_api_nodes.go | 8 +-- internal/rpc/rpc_client.go | 2 +- 11 files changed, 70 insertions(+), 54 deletions(-) rename build/configs/{api.template.yaml => api_node.template.yaml} (100%) diff --git a/build/build.sh b/build/build.sh index 58aeeb0..e9b40c9 100755 --- a/build/build.sh +++ b/build/build.sh @@ -49,7 +49,7 @@ function build() { fi fi - cp "$ROOT"/configs/api.template.yaml "$DIST"/configs + cp "$ROOT"/configs/api_node.template.yaml "$DIST"/configs cp "$ROOT"/configs/cluster.template.yaml "$DIST"/configs cp -R "$ROOT"/www "$DIST"/ cp -R "$ROOT"/pages "$DIST"/ diff --git a/build/configs/.gitignore b/build/configs/.gitignore index d10de96..1bdee8f 100644 --- a/build/configs/.gitignore +++ b/build/configs/.gitignore @@ -1,4 +1,5 @@ node.json api.yaml +api_node.yaml cluster.yaml *.cache \ No newline at end of file diff --git a/build/configs/README.md b/build/configs/README.md index a73f6ef..fb7989b 100644 --- a/build/configs/README.md +++ b/build/configs/README.md @@ -1,2 +1,2 @@ -* `api.template.yaml` - API相关配置模板 +* `api_node.template.yaml` - API相关配置模板 * `cluster.template.yaml` - 通过集群自动接入节点模板 \ No newline at end of file diff --git a/build/configs/api.template.yaml b/build/configs/api_node.template.yaml similarity index 100% rename from build/configs/api.template.yaml rename to build/configs/api_node.template.yaml diff --git a/cmd/edge-node/main.go b/cmd/edge-node/main.go index deea3d0..1a632e5 100644 --- a/cmd/edge-node/main.go +++ b/cmd/edge-node/main.go @@ -37,7 +37,7 @@ func main() { // validate config _, err := configs.LoadAPIConfig() if err != nil { - fmt.Println("[ERROR]start failed: load api config from '" + Tea.ConfigFile("api.yaml") + "' failed: " + err.Error()) + fmt.Println("[ERROR]start failed: load api config from '" + Tea.ConfigFile(configs.ConfigFileName) + "' failed: " + err.Error()) os.Exit(0) } }) @@ -64,7 +64,7 @@ func main() { // verify dir { fmt.Println("Checking '" + dir + "' ...") - for _, subDir := range []string{"bin", "configs/api.yaml", "logs"} { + for _, subDir := range []string{"bin/" + filepath.Base(exe), "configs", "logs"} { _, err := os.Stat(dir + "/" + subDir) if err != nil { fmt.Println("[ERROR]program directory structure has been broken, please remove it manually.") diff --git a/internal/configs/api_config.go b/internal/configs/api_config.go index 099b416..699ca20 100644 --- a/internal/configs/api_config.go +++ b/internal/configs/api_config.go @@ -7,14 +7,19 @@ import ( "os" ) -// APIConfig 节点API配置 +const ConfigFileName = "api_node.yaml" +const oldConfigFileName = "api.yaml" + type APIConfig struct { - RPC struct { + OldRPC struct { Endpoints []string `yaml:"endpoints" json:"endpoints"` DisableUpdate bool `yaml:"disableUpdate" json:"disableUpdate"` } `yaml:"rpc" json:"rpc"` - NodeId string `yaml:"nodeId" json:"nodeId"` - Secret string `yaml:"secret" json:"secret"` + + RPCEndpoints []string `yaml:"rpc.endpoints" json:"rpc.endpoints"` + RPCDisableUpdate bool `yaml:"rpc.disableUpdate" json:"rpc.disableUpdate"` + NodeId string `yaml:"nodeId" json:"nodeId"` + Secret string `yaml:"secret" json:"secret"` } func NewAPIConfig() *APIConfig { @@ -22,9 +27,16 @@ func NewAPIConfig() *APIConfig { } func (this *APIConfig) Init() error { - if len(this.RPC.Endpoints) == 0 { + // compatible with old + if len(this.RPCEndpoints) == 0 && len(this.OldRPC.Endpoints) > 0 { + this.RPCEndpoints = this.OldRPC.Endpoints + this.RPCDisableUpdate = this.OldRPC.DisableUpdate + } + + if len(this.RPCEndpoints) == 0 { return errors.New("no valid 'rpc.endpoints'") } + if len(this.NodeId) == 0 { return errors.New("'nodeId' required") } @@ -35,23 +47,29 @@ func (this *APIConfig) Init() error { } func LoadAPIConfig() (*APIConfig, error) { - data, err := os.ReadFile(Tea.ConfigFile("api.yaml")) - if err != nil { - return nil, err - } + for _, filename := range []string{ConfigFileName, oldConfigFileName} { + data, err := os.ReadFile(Tea.ConfigFile(filename)) + if err != nil { + if os.IsNotExist(err) { + continue + } + return nil, err + } - var config = &APIConfig{} - err = yaml.Unmarshal(data, config) - if err != nil { - return nil, err - } + var config = &APIConfig{} + err = yaml.Unmarshal(data, config) + if err != nil { + return nil, err + } - err = config.Init() - if err != nil { - return nil, errors.New("init error: " + err.Error()) - } + err = config.Init() + if err != nil { + return nil, errors.New("init error: " + err.Error()) + } - return config, nil + return config, nil + } + return nil, errors.New("no config file '" + ConfigFileName + "' found") } // WriteFile 保存到文件 diff --git a/internal/nodes/api_stream.go b/internal/nodes/api_stream.go index cafe288..7172602 100644 --- a/internal/nodes/api_stream.go +++ b/internal/nodes/api_stream.go @@ -438,10 +438,10 @@ func (this *APIStream) handleChangeAPINode(message *pb.NodeStreamMessage) error return nil } - config.RPC.Endpoints = []string{messageData.Addr} + config.RPCEndpoints = []string{messageData.Addr} // 保存到文件 - err = config.WriteFile(Tea.ConfigFile("api.yaml")) + err = config.WriteFile(Tea.ConfigFile(configs.ConfigFileName)) if err != nil { this.replyFail(message.RequestId, "save config file failed: "+err.Error()) return nil diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 9203b28..bbdf0ca 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -314,15 +314,15 @@ func (this *Node) syncConfig(taskVersion int64) error { this.locker.Lock() defer this.locker.Unlock() - // 检查api.yaml是否存在 - apiConfigFile := Tea.ConfigFile("api.yaml") + // 检查api_node.yaml是否存在 + var apiConfigFile = Tea.ConfigFile(configs.ConfigFileName) _, err := os.Stat(apiConfigFile) if err != nil { if os.IsNotExist(err) { clusterErr := this.checkClusterConfig() if clusterErr != nil { if os.IsNotExist(clusterErr) { - return errors.New("can not find config file 'configs/api.yaml'") + return fmt.Errorf("can not find config file 'configs/%s'", configs.ConfigFileName) } return fmt.Errorf("check cluster config failed: %w", clusterErr) } @@ -524,7 +524,7 @@ func (this *Node) startSyncTimer() { // 检查集群设置 func (this *Node) checkClusterConfig() error { - configFile := Tea.ConfigFile("cluster.yaml") + var configFile = Tea.ConfigFile("cluster.yaml") data, err := os.ReadFile(configFile) if err != nil { return err @@ -536,9 +536,10 @@ func (this *Node) checkClusterConfig() error { } rpcClient, err := rpc.NewRPCClient(&configs.APIConfig{ - RPC: config.RPC, - NodeId: config.ClusterId, - Secret: config.Secret, + RPCEndpoints: config.RPC.Endpoints, + RPCDisableUpdate: config.RPC.DisableUpdate, + NodeId: config.ClusterId, + Secret: config.Secret, }) if err != nil { return err @@ -556,22 +557,17 @@ func (this *Node) checkClusterConfig() error { resp.Endpoints = []string{} } var apiConfig = &configs.APIConfig{ - RPC: struct { - Endpoints []string `yaml:"endpoints" json:"endpoints"` - DisableUpdate bool `yaml:"disableUpdate" json:"disableUpdate"` - }{ - Endpoints: resp.Endpoints, - DisableUpdate: false, - }, - NodeId: resp.UniqueId, - Secret: resp.Secret, + RPCEndpoints: resp.Endpoints, + RPCDisableUpdate: false, + NodeId: resp.UniqueId, + Secret: resp.Secret, } - remotelogs.Debug("NODE", "writing 'configs/api.yaml' ...") - err = apiConfig.WriteFile(Tea.ConfigFile("api.yaml")) + remotelogs.Debug("NODE", "writing 'configs/"+configs.ConfigFileName+"' ...") + err = apiConfig.WriteFile(Tea.ConfigFile(configs.ConfigFileName)) if err != nil { return err } - remotelogs.Debug("NODE", "wrote 'configs/api.yaml' successfully") + remotelogs.Debug("NODE", "wrote 'configs/"+configs.ConfigFileName+"' successfully") return nil } @@ -1136,7 +1132,7 @@ func (this *Node) changeAPINodeAddrs(apiNodeAddrs []*serverconfigs.NetworkAddres if config == nil { return } - var oldEndpoints = config.RPC.Endpoints + var oldEndpoints = config.RPCEndpoints rpcClient, err := rpc.SharedRPC() if err != nil { @@ -1150,9 +1146,9 @@ func (this *Node) changeAPINodeAddrs(apiNodeAddrs []*serverconfigs.NetworkAddres go func(v int64) { // 测试新的API节点地址 if rpcClient.TestEndpoints(addrs) { - config.RPC.Endpoints = addrs + config.RPCEndpoints = addrs } else { - config.RPC.Endpoints = oldEndpoints + config.RPCEndpoints = oldEndpoints this.lastAPINodeAddrs = nil // 恢复为空,以便于下次更新重试 } diff --git a/internal/nodes/node_tasks.go b/internal/nodes/node_tasks.go index 84c09a6..276db26 100644 --- a/internal/nodes/node_tasks.go +++ b/internal/nodes/node_tasks.go @@ -9,6 +9,7 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ddosconfigs" + "github.com/TeaOSLab/EdgeNode/internal/configs" "github.com/TeaOSLab/EdgeNode/internal/firewalls" "github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/iplibrary" @@ -26,8 +27,8 @@ func (this *Node) loopTasks() error { var tr = trackers.Begin("CHECK_NODE_CONFIG_CHANGES") defer tr.End() - // 检查api.yaml是否存在 - var apiConfigFile = Tea.ConfigFile("api.yaml") + // 检查api_node.yaml是否存在 + var apiConfigFile = Tea.ConfigFile(configs.ConfigFileName) _, err := os.Stat(apiConfigFile) if err != nil { return nil diff --git a/internal/nodes/task_sync_api_nodes.go b/internal/nodes/task_sync_api_nodes.go index f7f085c..2b77dc4 100644 --- a/internal/nodes/task_sync_api_nodes.go +++ b/internal/nodes/task_sync_api_nodes.go @@ -70,7 +70,7 @@ func (this *SyncAPINodesTask) Loop() error { } // 是否禁止自动升级 - if config.RPC.DisableUpdate { + if config.RPCDisableUpdate { return nil } @@ -96,7 +96,7 @@ func (this *SyncAPINodesTask) Loop() error { } // 和现有的对比 - if utils.EqualStrings(newEndpoints, config.RPC.Endpoints) { + if utils.EqualStrings(newEndpoints, config.RPCEndpoints) { return nil } @@ -107,7 +107,7 @@ func (this *SyncAPINodesTask) Loop() error { } // 修改RPC对象配置 - config.RPC.Endpoints = newEndpoints + config.RPCEndpoints = newEndpoints // 更新当前RPC if !hasCustomizedAPINodeAddrs { @@ -118,7 +118,7 @@ func (this *SyncAPINodesTask) Loop() error { } // 保存到文件 - err = config.WriteFile(Tea.ConfigFile("api.yaml")) + err = config.WriteFile(Tea.ConfigFile(configs.ConfigFileName)) if err != nil { return err } diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index ec32b60..72c83a6 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -229,7 +229,7 @@ func (this *RPCClient) TestEndpoints(endpoints []string) bool { func (this *RPCClient) init() error { // 重新连接 var conns = []*grpc.ClientConn{} - for _, endpoint := range this.apiConfig.RPC.Endpoints { + for _, endpoint := range this.apiConfig.RPCEndpoints { u, err := url.Parse(endpoint) if err != nil { return fmt.Errorf("parse endpoint failed: %w", err)