From 1763973d60ca25d93355fc1541930efbfa2b7b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 15:39:34 +0800 Subject: [PATCH 01/43] perf: optimize communication exceptions --- api/controller/manager.go | 12 +- api/controller/websocket.go | 49 +++-- api/db/database.go | 22 +++ api/db/db.go | 28 +-- api/handler/handler.go | 59 +++--- api/handler/proxy.go | 24 ++- api/middleware/middleware.go | 20 +- builder/exector/exector_test.go | 110 ----------- cmd/api/option/option.go | 10 +- cmd/api/server/server.go | 187 ++---------------- cmd/builder/server/server.go | 2 +- cmd/mqcli/main.go | 2 +- config/configs/config.go | 13 ++ monitor/api/router.go | 16 +- mq/client/client.go | 41 ++-- pkg/component/README.md | 1 + pkg/component/core.go | 101 ++++++++++ pkg/component/etcd/etcdCpmponent.go | 94 +++++++++ .../hubregistry/registryComponent.go | 55 ++++++ pkg/component/k8s/k8sComponent.go | 101 ++++++++++ pkg/gogo/go.go | 30 +++ pkg/gogo/option.go | 15 ++ pkg/rainbond/component.go | 38 ++++ pkg/rainbond/registry.go | 86 ++++++++ worker/discover/manager.go | 25 +-- 25 files changed, 696 insertions(+), 445 deletions(-) create mode 100644 api/db/database.go delete mode 100644 builder/exector/exector_test.go create mode 100644 config/configs/config.go create mode 100644 pkg/component/README.md create mode 100644 pkg/component/core.go create mode 100644 pkg/component/etcd/etcdCpmponent.go create mode 100644 pkg/component/hubregistry/registryComponent.go create mode 100644 pkg/component/k8s/k8sComponent.go create mode 100644 pkg/gogo/go.go create mode 100644 pkg/gogo/option.go create mode 100644 pkg/rainbond/component.go create mode 100644 pkg/rainbond/registry.go diff --git a/api/controller/manager.go b/api/controller/manager.go index 96cd6db7c4..19d0807509 100644 --- a/api/controller/manager.go +++ b/api/controller/manager.go @@ -22,11 +22,9 @@ import ( "net/http" "github.com/goodrain/rainbond/api/api" - "github.com/goodrain/rainbond/api/discover" "github.com/goodrain/rainbond/api/proxy" "github.com/goodrain/rainbond/cmd/api/option" mqclient "github.com/goodrain/rainbond/mq/client" - etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/goodrain/rainbond/worker/client" ) @@ -69,13 +67,7 @@ func GetManager() V2Manager { // NewManager new manager func NewManager(conf option.Config, statusCli *client.AppRuntimeSyncClient) (*V2Routes, error) { - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: conf.EtcdEndpoint, - CaFile: conf.EtcdCaFile, - CertFile: conf.EtcdCertFile, - KeyFile: conf.EtcdKeyFile, - } - mqClient, err := mqclient.NewMqClient(etcdClientArgs, conf.MQAPI) + mqClient, err := mqclient.NewMqClient(conf.MQAPI) if err != nil { return nil, err } @@ -86,7 +78,7 @@ func NewManager(conf option.Config, statusCli *client.AppRuntimeSyncClient) (*V2 v2r.GatewayStruct.cfg = &conf v2r.LabelController.optconfig = &conf eventServerProxy := proxy.CreateProxy("eventlog", "http", []string{"local=>rbd-eventlog:6363"}) - discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) v2r.EventLogStruct.EventlogServerProxy = eventServerProxy return &v2r, nil } diff --git a/api/controller/websocket.go b/api/controller/websocket.go index 4818ba6ad6..aaeaf59fe8 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -25,7 +25,6 @@ import ( "path" "github.com/go-chi/chi" - "github.com/goodrain/rainbond/api/discover" "github.com/goodrain/rainbond/api/handler" "github.com/goodrain/rainbond/api/proxy" ctxutil "github.com/goodrain/rainbond/api/util/ctx" @@ -33,7 +32,7 @@ import ( "github.com/sirupsen/logrus" ) -//DockerConsole docker console +// DockerConsole docker console type DockerConsole struct { socketproxy proxy.Proxy } @@ -43,7 +42,7 @@ var defaultEventLogEndpoints = []string{"local=>rbd-eventlog:6363"} var dockerConsole *DockerConsole -//GetDockerConsole get Docker console +// GetDockerConsole get Docker console func GetDockerConsole() *DockerConsole { if dockerConsole != nil { return dockerConsole @@ -51,92 +50,92 @@ func GetDockerConsole() *DockerConsole { dockerConsole = &DockerConsole{ socketproxy: proxy.CreateProxy("dockerconsole", "websocket", defaultDockerConsoleEndpoints), } - discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) + //discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) return dockerConsole } -//Get get +// Get get func (d DockerConsole) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) } var dockerLog *DockerLog -//DockerLog docker log +// DockerLog docker log type DockerLog struct { socketproxy proxy.Proxy } -//GetDockerLog get docker log +// GetDockerLog get docker log func GetDockerLog() *DockerLog { if dockerLog == nil { dockerLog = &DockerLog{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) } return dockerLog } -//Get get +// Get get func (d DockerLog) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) } -//MonitorMessage monitor message +// MonitorMessage monitor message type MonitorMessage struct { socketproxy proxy.Proxy } var monitorMessage *MonitorMessage -//GetMonitorMessage get MonitorMessage +// GetMonitorMessage get MonitorMessage func GetMonitorMessage() *MonitorMessage { if monitorMessage == nil { monitorMessage = &MonitorMessage{ socketproxy: proxy.CreateProxy("monitormessage", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) } return monitorMessage } -//Get get +// Get get func (d MonitorMessage) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) } -//EventLog event log +// EventLog event log type EventLog struct { socketproxy proxy.Proxy } var eventLog *EventLog -//GetEventLog get event log +// GetEventLog get event log func GetEventLog() *EventLog { if eventLog == nil { eventLog = &EventLog{ socketproxy: proxy.CreateProxy("eventlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) } return eventLog } -//Get get +// Get get func (d EventLog) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) } -//LogFile log file down server +// LogFile log file down server type LogFile struct { Root string } var logFile *LogFile -//GetLogFile get log file +// GetLogFile get log file func GetLogFile() *LogFile { root := os.Getenv("SERVICE_LOG_ROOT") if root == "" { @@ -151,7 +150,7 @@ func GetLogFile() *LogFile { return logFile } -//Get get +// Get get func (d LogFile) Get(w http.ResponseWriter, r *http.Request) { gid := chi.URLParam(r, "gid") filename := chi.URLParam(r, "filename") @@ -180,23 +179,23 @@ func (d LogFile) GetInstallLog(w http.ResponseWriter, r *http.Request) { var pubSubControll *PubSubControll -//PubSubControll service pub sub +// PubSubControll service pub sub type PubSubControll struct { socketproxy proxy.Proxy } -//GetPubSubControll get service pub sub controller +// GetPubSubControll get service pub sub controller func GetPubSubControll() *PubSubControll { if pubSubControll == nil { pubSubControll = &PubSubControll{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) } return pubSubControll } -//Get pubsub controller +// Get pubsub controller func (d PubSubControll) Get(w http.ResponseWriter, r *http.Request) { serviceID := chi.URLParam(r, "serviceID") name, _ := handler.GetEventHandler().GetLogInstance(serviceID) @@ -207,7 +206,7 @@ func (d PubSubControll) Get(w http.ResponseWriter, r *http.Request) { d.socketproxy.Proxy(w, r) } -//GetHistoryLog get service docker logs +// GetHistoryLog get service docker logs func (d PubSubControll) GetHistoryLog(w http.ResponseWriter, r *http.Request) { serviceID := r.Context().Value(ctxutil.ContextKey("service_id")).(string) name, _ := handler.GetEventHandler().GetLogInstance(serviceID) diff --git a/api/db/database.go b/api/db/database.go new file mode 100644 index 0000000000..b103fee91b --- /dev/null +++ b/api/db/database.go @@ -0,0 +1,22 @@ +package db + +import ( + "context" + "github.com/goodrain/rainbond/config/configs" + "github.com/sirupsen/logrus" +) + +// Database - +func Database() *ConDB { + return &ConDB{} +} + +// Start - +func (d *ConDB) Start(ctx context.Context, config *configs.Config) error { + logrus.Info("start db client...") + return CreateDBManager(config.APIConfig) +} + +// CloseHandle - +func (d *ConDB) CloseHandle() { +} diff --git a/api/db/db.go b/api/db/db.go index 91f38a5580..ff164b117a 100644 --- a/api/db/db.go +++ b/api/db/db.go @@ -37,14 +37,14 @@ import ( "github.com/sirupsen/logrus" ) -//ConDB struct +// ConDB struct type ConDB struct { ConnectionInfo string DBType string } -//CreateDBManager get db manager -//TODO: need to try when happened error, try 4 times +// CreateDBManager get db manager +// TODO: need to try when happened error, try 4 times func CreateDBManager(conf option.Config) error { dbCfg := config.Config{ MysqlConnectionInfo: conf.DBConnectionInfo, @@ -61,7 +61,7 @@ func CreateDBManager(conf option.Config) error { return nil } -//CreateEventManager create event manager +// CreateEventManager create event manager func CreateEventManager(conf option.Config) error { var tryTime time.Duration var err error @@ -83,6 +83,7 @@ func CreateEventManager(conf option.Config) error { break } } + if err != nil { logrus.Errorf("get event manager failed. %v", err.Error()) return err @@ -91,15 +92,14 @@ func CreateEventManager(conf option.Config) error { return nil } -//MQManager mq manager +// MQManager mq manager type MQManager struct { - EtcdClientArgs *etcdutil.ClientArgs - DefaultServer string + DefaultServer string } -//NewMQManager new mq manager +// NewMQManager new mq manager func (m *MQManager) NewMQManager() (client.MQClient, error) { - client, err := client.NewMqClient(m.EtcdClientArgs, m.DefaultServer) + client, err := client.NewMqClient(m.DefaultServer) if err != nil { logrus.Errorf("new mq manager error, %v", err) return client, err @@ -107,19 +107,19 @@ func (m *MQManager) NewMQManager() (client.MQClient, error) { return client, nil } -//TaskStruct task struct +// TaskStruct task struct type TaskStruct struct { TaskType string TaskBody model.TaskBody User string } -//OpentsdbManager OpentsdbManager +// OpentsdbManager OpentsdbManager type OpentsdbManager struct { Endpoint string } -//NewOpentsdbManager NewOpentsdbManager +// NewOpentsdbManager NewOpentsdbManager func (o *OpentsdbManager) NewOpentsdbManager() (tsdbClient.Client, error) { opentsdbCfg := tsdbConfig.OpenTSDBConfig{ OpentsdbHost: o.Endpoint, @@ -131,7 +131,7 @@ func (o *OpentsdbManager) NewOpentsdbManager() (tsdbClient.Client, error) { return tc, nil } -//BuildTask build task +// BuildTask build task func BuildTask(t *TaskStruct) (*pb.EnqueueRequest, error) { var er pb.EnqueueRequest taskJSON, err := json.Marshal(t.TaskBody) @@ -149,7 +149,7 @@ func BuildTask(t *TaskStruct) (*pb.EnqueueRequest, error) { return &er, nil } -//GetBegin get db transaction +// GetBegin get db transaction func GetBegin() *gorm.DB { return db.GetManager().Begin() } diff --git a/api/handler/handler.go b/api/handler/handler.go index 6a32c23c9a..1b3b725761 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -19,45 +19,34 @@ package handler import ( - "github.com/coreos/etcd/clientv3" "github.com/goodrain/rainbond/api/client/prometheus" api_db "github.com/goodrain/rainbond/api/db" "github.com/goodrain/rainbond/api/handler/group" "github.com/goodrain/rainbond/api/handler/share" - "github.com/goodrain/rainbond/builder/sources/registry" "github.com/goodrain/rainbond/cmd/api/option" "github.com/goodrain/rainbond/db" - "github.com/goodrain/rainbond/pkg/generated/clientset/versioned" - etcdutil "github.com/goodrain/rainbond/util/etcd" - "github.com/goodrain/rainbond/worker/client" + "github.com/goodrain/rainbond/pkg/component/etcd" + "github.com/goodrain/rainbond/pkg/component/hubregistry" + "github.com/goodrain/rainbond/pkg/component/k8s" "github.com/sirupsen/logrus" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "kubevirt.io/client-go/kubecli" - k8sclient "sigs.k8s.io/controller-runtime/pkg/client" - gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/typed/apis/v1beta1" ) // InitHandle 初始化handle -func InitHandle(conf option.Config, - etcdClientArgs *etcdutil.ClientArgs, - statusCli *client.AppRuntimeSyncClient, - etcdcli *clientv3.Client, - kubeClient *kubernetes.Clientset, - rainbondClient versioned.Interface, - k8sClient k8sclient.Client, - config *rest.Config, - mapper meta.RESTMapper, - dynamicClient dynamic.Interface, - gatewayClient *gateway.GatewayV1beta1Client, - kubevirtCli kubecli.KubevirtClient, - registryCli *registry.Registry, -) error { +func InitHandle(conf option.Config) error { + etcdcli := etcd.Default().EtcdClient + statusCli := etcd.Default().StatusClient + clientset := k8s.Default().Clientset + rainbondClient := k8s.Default().RainbondClient + k8sClient := k8s.K8sClient().K8sClient + restconfig := k8s.K8sClient().RestConfig + dynamicClient := k8s.K8sClient().DynamicClient + gatewayClient := k8s.K8sClient().GatewayClient + kubevirtCli := k8s.K8sClient().KubevirtCli + mapper := k8s.K8sClient().Mapper + registryCli := hubregistry.Default().RegistryCli + mq := api_db.MQManager{ - EtcdClientArgs: etcdClientArgs, - DefaultServer: conf.MQAPI, + DefaultServer: conf.MQAPI, } mqClient, errMQ := mq.NewMQManager() if errMQ != nil { @@ -72,11 +61,11 @@ func InitHandle(conf option.Config, return err } dbmanager := db.GetManager() - defaultServieHandler = CreateManager(conf, mqClient, etcdcli, statusCli, prometheusCli, rainbondClient, kubeClient, kubevirtCli, dbmanager, registryCli) + defaultServieHandler = CreateManager(conf, mqClient, etcdcli, statusCli, prometheusCli, rainbondClient, clientset, kubevirtCli, dbmanager, registryCli) defaultPluginHandler = CreatePluginManager(mqClient) defaultAppHandler = CreateAppManager(mqClient) - defaultTenantHandler = CreateTenManager(mqClient, statusCli, &conf, kubeClient, prometheusCli, k8sClient) - defaultHelmHandler = CreateHelmManager(kubeClient, rainbondClient, config, mapper) + defaultTenantHandler = CreateTenManager(mqClient, statusCli, &conf, clientset, prometheusCli, k8sClient) + defaultHelmHandler = CreateHelmManager(clientset, rainbondClient, restconfig, mapper) defaultNetRulesHandler = CreateNetRulesManager(etcdcli) defaultCloudHandler = CreateCloudManager(conf) defaultAPPBackupHandler = group.CreateBackupHandle(mqClient, statusCli, etcdcli) @@ -87,20 +76,20 @@ func InitHandle(conf option.Config, logrus.Errorf("create token identification mannager error, %v", err) return err } - defaultGatewayHandler = CreateGatewayManager(dbmanager, mqClient, etcdcli, gatewayClient, kubeClient) + defaultGatewayHandler = CreateGatewayManager(dbmanager, mqClient, etcdcli, gatewayClient, clientset) def3rdPartySvcHandler = Create3rdPartySvcHandler(dbmanager, statusCli) operationHandler = CreateOperationHandler(mqClient) batchOperationHandler = CreateBatchOperationHandler(mqClient, statusCli, operationHandler) defaultAppRestoreHandler = NewAppRestoreHandler() defPodHandler = NewPodHandler(statusCli) - defClusterHandler = NewClusterHandler(kubeClient, conf.RbdNamespace, conf.GrctlImage, config, mapper, prometheusCli, rainbondClient, statusCli, dynamicClient, gatewayClient, mqClient) + defClusterHandler = NewClusterHandler(clientset, conf.RbdNamespace, conf.GrctlImage, restconfig, mapper, prometheusCli, rainbondClient, statusCli, dynamicClient, gatewayClient, mqClient) defaultVolumeTypeHandler = CreateVolumeTypeManger(statusCli) defaultEtcdHandler = NewEtcdHandler(etcdcli) defaultmonitorHandler = NewMonitorHandler(prometheusCli) defServiceEventHandler = NewServiceEventHandler() - defApplicationHandler = NewApplicationHandler(statusCli, prometheusCli, rainbondClient, kubeClient, dynamicClient) + defApplicationHandler = NewApplicationHandler(statusCli, prometheusCli, rainbondClient, clientset, dynamicClient) defRegistryAuthSecretHandler = CreateRegistryAuthSecretManager(dbmanager, mqClient, etcdcli) - defNodesHandler = NewNodesHandler(kubeClient, conf.RbdNamespace, config, mapper, prometheusCli) + defNodesHandler = NewNodesHandler(clientset, conf.RbdNamespace, restconfig, mapper, prometheusCli) return nil } diff --git a/api/handler/proxy.go b/api/handler/proxy.go index 68ac6193e7..bf042dd3fb 100644 --- a/api/handler/proxy.go +++ b/api/handler/proxy.go @@ -19,7 +19,6 @@ package handler import ( - "github.com/goodrain/rainbond/api/discover" "github.com/goodrain/rainbond/api/proxy" "github.com/goodrain/rainbond/cmd/api/option" ) @@ -30,11 +29,10 @@ var prometheusProxy proxy.Proxy var monitorProxy proxy.Proxy var kubernetesDashboard proxy.Proxy -//InitProxy 初始化 +// InitProxy 初始化 func InitProxy(conf option.Config) { if nodeProxy == nil { nodeProxy = proxy.CreateProxy("acp_node", "http", conf.NodeAPI) - discover.GetEndpointDiscover().AddProject("acp_node", nodeProxy) } if builderProxy == nil { builderProxy = proxy.CreateProxy("builder", "http", conf.BuilderAPI) @@ -42,34 +40,34 @@ func InitProxy(conf option.Config) { if prometheusProxy == nil { prometheusProxy = proxy.CreateProxy("prometheus", "http", []string{conf.PrometheusEndpoint}) } - if monitorProxy == nil { - monitorProxy = proxy.CreateProxy("monitor", "http", []string{"127.0.0.1:3329"}) - discover.GetEndpointDiscover().AddProject("monitor", monitorProxy) - } + //if monitorProxy == nil { + // monitorProxy = proxy.CreateProxy("monitor", "http", []string{"127.0.0.1:3329"}) + // discover.GetEndpointDiscover().AddProject("monitor", monitorProxy) + //} if kubernetesDashboard == nil { kubernetesDashboard = proxy.CreateProxy("kubernetesdashboard", "http", []string{conf.KuberentesDashboardAPI}) } } -//GetNodeProxy GetNodeProxy +// GetNodeProxy GetNodeProxy func GetNodeProxy() proxy.Proxy { return nodeProxy } -//GetBuilderProxy GetNodeProxy +// GetBuilderProxy GetNodeProxy func GetBuilderProxy() proxy.Proxy { return builderProxy } -//GetPrometheusProxy GetPrometheusProxy +// GetPrometheusProxy GetPrometheusProxy func GetPrometheusProxy() proxy.Proxy { return prometheusProxy } //GetMonitorProxy GetMonitorProxy -func GetMonitorProxy() proxy.Proxy { - return monitorProxy -} +//func GetMonitorProxy() proxy.Proxy { +// return monitorProxy +//} // GetKubernetesDashboardProxy returns the kubernetes dashboard proxy. func GetKubernetesDashboardProxy() proxy.Proxy { diff --git a/api/middleware/middleware.go b/api/middleware/middleware.go index 0a8aea5cd6..b458100ccc 100644 --- a/api/middleware/middleware.go +++ b/api/middleware/middleware.go @@ -46,7 +46,7 @@ func init() { } } -//InitTenant 实现中间件 +// InitTenant 实现中间件 func InitTenant(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { debugRequestBody(r) @@ -75,7 +75,7 @@ func InitTenant(next http.Handler) http.Handler { return http.HandlerFunc(fn) } -//InitService 实现serviceinit中间件 +// InitService 实现serviceinit中间件 func InitService(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { serviceAlias := chi.URLParam(r, "service_alias") @@ -120,7 +120,7 @@ func InitApplication(next http.Handler) http.Handler { return http.HandlerFunc(fn) } -//InitPlugin 实现plugin init中间件 +// InitPlugin 实现plugin init中间件 func InitPlugin(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { debugRequestBody(r) @@ -147,7 +147,7 @@ func InitPlugin(next http.Handler) http.Handler { return http.HandlerFunc(fn) } -//SetLog SetLog +// SetLog SetLog func SetLog(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { eventID := chi.URLParam(r, "event_id") @@ -160,7 +160,7 @@ func SetLog(next http.Handler) http.Handler { return http.HandlerFunc(fn) } -//Proxy 反向代理中间件 +// Proxy 反向代理中间件 func Proxy(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { if strings.HasPrefix(r.RequestURI, "/v2/nodes") { @@ -191,10 +191,10 @@ func Proxy(next http.Handler) http.Handler { handler.GetNodeProxy().Proxy(w, r) return } - if strings.HasPrefix(r.RequestURI, "/v2/rules") { - handler.GetMonitorProxy().Proxy(w, r) - return - } + //if strings.HasPrefix(r.RequestURI, "/v2/rules") { + // handler.GetMonitorProxy().Proxy(w, r) + // return + //} if strings.HasPrefix(r.RequestURI, "/kubernetes/dashboard") { proxy := handler.GetKubernetesDashboardProxy() r.URL.Path = strings.Replace(r.URL.Path, "/kubernetes/dashboard", "", 1) @@ -242,7 +242,7 @@ func (w *resWriter) WriteHeader(statusCode int) { func WrapEL(f http.HandlerFunc, target, optType string, synType int) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var ( - serviceKind string + serviceKind string ) serviceObj := r.Context().Value(ctxutil.ContextKey("service")) if serviceObj != nil { diff --git a/builder/exector/exector_test.go b/builder/exector/exector_test.go deleted file mode 100644 index 358c84b1ef..0000000000 --- a/builder/exector/exector_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package exector - -import ( - "context" - "encoding/json" - "runtime" - "testing" - "time" - - "github.com/docker/docker/client" - "k8s.io/client-go/kubernetes" - - "github.com/goodrain/rainbond/builder/parser/code" - "github.com/goodrain/rainbond/cmd/builder/option" - "github.com/goodrain/rainbond/event" - "github.com/goodrain/rainbond/mq/api/grpc/pb" - - mqclient "github.com/goodrain/rainbond/mq/client" - etcdutil "github.com/goodrain/rainbond/util/etcd" - k8sutil "github.com/goodrain/rainbond/util/k8s" -) - -func Test_exectorManager_buildFromSourceCode(t *testing.T) { - conf := option.Config{ - EtcdEndPoints: []string{"192.168.2.203:2379"}, - MQAPI: "192.168.2.203:6300", - EventLogServers: []string{"192.168.2.203:6366"}, - RbdRepoName: "rbd-dns", - RbdNamespace: "rbd-system", - MysqlConnectionInfo: "EeM2oc:lee7OhQu@tcp(192.168.2.203:3306)/region", - } - etcdArgs := etcdutil.ClientArgs{Endpoints: conf.EtcdEndPoints} - event.NewManager(event.EventConfig{ - EventLogServers: conf.EventLogServers, - DiscoverArgs: &etcdArgs, - }) - restConfig, err := k8sutil.NewRestConfig("/Users/fanyangyang/Documents/company/goodrain/admin.kubeconfig") - if err != nil { - t.Fatal(err) - } - kubeClient, err := kubernetes.NewForConfig(restConfig) - dockerClient, err := client.NewEnvClient() - if err != nil { - t.Fatal(err) - } - etcdCli, err := clientv3.New(clientv3.Config{ - Endpoints: conf.EtcdEndPoints, - DialTimeout: 10 * time.Second, - }) - var maxConcurrentTask int - if conf.MaxTasks == 0 { - maxConcurrentTask = runtime.NumCPU() * 2 - } else { - maxConcurrentTask = conf.MaxTasks - } - mqClient, err := mqclient.NewMqClient(&etcdArgs, conf.MQAPI) - if err != nil { - t.Fatal(err) - } - ctx, cancel := context.WithCancel(context.Background()) - e := &exectorManager{ - DockerClient: dockerClient, - KubeClient: kubeClient, - EtcdCli: etcdCli, - tasks: make(chan *pb.TaskMessage, maxConcurrentTask), - maxConcurrentTask: maxConcurrentTask, - mqClient: mqClient, - ctx: ctx, - cancel: cancel, - cfg: conf, - } - taskBodym := make(map[string]interface{}) - taskBodym["repo_url"] = "https://github.com/goodrain/java-maven-demo.git" - taskBodym["branch"] = "master" - taskBodym["tenant_id"] = "5d7bd886e6dc4425bb6c2ac5fc9fa593" - taskBodym["service_id"] = "4eaa41ccf145b8e43a6aeb1a5efeab53" - taskBodym["deploy_version"] = "20200115193617" - taskBodym["lang"] = code.JavaMaven - taskBodym["event_id"] = "0000" - taskBodym["envs"] = map[string]string{} - - taskBody, _ := json.Marshal(taskBodym) - task := pb.TaskMessage{ - TaskType: "build_from_source_code", - TaskBody: taskBody, - } - i := NewSouceCodeBuildItem(task.TaskBody) - if err := i.Run(30 * time.Second); err != nil { - t.Fatal(err) - } - e.buildFromSourceCode(&task) -} diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 20eb23f175..a2107c9529 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -64,6 +64,7 @@ type Config struct { RbdNamespace string ShowSQL bool GrctlImage string + RbdHub string } // APIServer apiserver server @@ -95,10 +96,8 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.WebsocketCertFile, "ws-ssl-certfile", "/etc/ssl/goodrain.com/goodrain.com.crt", "websocket and fileserver ssl cert file") fs.StringVar(&a.WebsocketKeyFile, "ws-ssl-keyfile", "/etc/ssl/goodrain.com/goodrain.com.key", "websocket and fileserver ssl key file") fs.StringVar(&a.V1API, "v1-api", "127.0.0.1:8887", "the region v1 api") - fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"127.0.0.1:6100"}, "the node server api") fs.StringSliceVar(&a.BuilderAPI, "builder-api", []string{"rbd-chaos:3228"}, "the builder api") fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"127.0.0.1:6366"}, "event log server address. simple lb") - fs.StringVar(&a.MQAPI, "mq-api", "127.0.0.1:6300", "acp_mq api") fs.BoolVar(&a.StartRegionAPI, "start", false, "Whether to start region old api") fs.StringSliceVar(&a.EtcdEndpoint, "etcd", []string{"http://127.0.0.1:2379"}, "etcd server or proxy address") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "verify etcd certificates of TLS-enabled secure servers using this CA bundle") @@ -115,10 +114,15 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogPath, "log-path", "/grdata/logs", "Where Docker log files and event log files are stored.") fs.StringVar(&a.KubeConfigPath, "kube-config", "", "kube config file path, No setup is required to run in a cluster.") fs.StringVar(&a.KuberentesDashboardAPI, "k8s-dashboard-api", "kubernetes-dashboard.rbd-system:443", "The service DNS name of Kubernetes dashboard. Default to kubernetes-dashboard.kubernetes-dashboard") - fs.StringVar(&a.PrometheusEndpoint, "prom-api", "rbd-monitor:9999", "The service DNS name of Prometheus api. Default to rbd-monitor:9999") fs.StringVar(&a.RbdNamespace, "rbd-namespace", "rbd-system", "rbd component namespace") fs.BoolVar(&a.ShowSQL, "show-sql", false, "The trigger for showing sql.") fs.StringVar(&a.GrctlImage, "shell-image", "registry.cn-hangzhou.aliyuncs.com/goodrain/rbd-shell:v5.13.0-release", "use shell image") + + fs.StringVar(&a.PrometheusEndpoint, "prom-api", "rbd-monitor:9999", "The service DNS name of Prometheus api. Default to rbd-monitor:9999") + fs.StringVar(&a.RbdHub, "hub-api", "http://rbd-hub:5000", "the rbd-hub server api") + fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") + fs.StringVar(&a.MQAPI, "mq-api", "127.0.0.1:6300", "the rbd-mq server api") + } // SetLog 设置log diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 589216c990..796e83607f 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -20,179 +20,26 @@ package server import ( "context" - rainbondv1alpha1 "github.com/goodrain/rainbond-operator/api/v1alpha1" - "github.com/goodrain/rainbond/api/controller" - "github.com/goodrain/rainbond/api/db" - "github.com/goodrain/rainbond/api/discover" - "github.com/goodrain/rainbond/api/handler" - "github.com/goodrain/rainbond/api/server" - registry "github.com/goodrain/rainbond/builder/sources/registry" "github.com/goodrain/rainbond/cmd/api/option" - "github.com/goodrain/rainbond/event" - "github.com/goodrain/rainbond/grctl/clients" - "github.com/goodrain/rainbond/pkg/generated/clientset/versioned" - rainbondscheme "github.com/goodrain/rainbond/pkg/generated/clientset/versioned/scheme" - etcdutil "github.com/goodrain/rainbond/util/etcd" - k8sutil "github.com/goodrain/rainbond/util/k8s" - "github.com/goodrain/rainbond/worker/client" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/restmapper" - "kubevirt.io/client-go/kubecli" - "os" - "os/signal" - k8sclient "sigs.k8s.io/controller-runtime/pkg/client" - gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/typed/apis/v1beta1" - "syscall" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/pkg/component" + "github.com/goodrain/rainbond/pkg/rainbond" ) // Run start run func Run(s *option.APIServer) error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - errChan := make(chan error) - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: s.Config.EtcdEndpoint, - CaFile: s.Config.EtcdCaFile, - CertFile: s.Config.EtcdCertFile, - KeyFile: s.Config.EtcdKeyFile, - } - //启动服务发现 - if _, err := discover.CreateEndpointDiscover(etcdClientArgs); err != nil { - return err - } - //创建db manager - if err := db.CreateDBManager(s.Config); err != nil { - logrus.Debugf("create db manager error, %v", err) - return err - } - //创建event manager - if err := db.CreateEventManager(s.Config); err != nil { - logrus.Debugf("create event manager error, %v", err) - } - - config, err := k8sutil.NewRestConfig(s.KubeConfigPath) - if err != nil { - return err - } - clientset, err := kubernetes.NewForConfig(config) - if err != nil { - return err - } - gatewayClient, err := gateway.NewForConfig(config) - if err != nil { - return err - } - dynamicClient, err := dynamic.NewForConfig(config) - if err != nil { - return err - } - - rainbondClient := versioned.NewForConfigOrDie(config) - - // k8s runtime client - scheme := runtime.NewScheme() - clientgoscheme.AddToScheme(scheme) - rainbondscheme.AddToScheme(scheme) - k8sClient, err := k8sclient.New(config, k8sclient.Options{ - Scheme: scheme, - }) - if err != nil { - return errors.WithMessage(err, "create k8s client") - } - // rest mapper - gr, err := restmapper.GetAPIGroupResources(clientset) - if err != nil { - return err - } - mapper := restmapper.NewDiscoveryRESTMapper(gr) - - if err := event.NewManager(event.EventConfig{ - EventLogServers: s.Config.EventLogServers, - DiscoverArgs: etcdClientArgs, - }); err != nil { - return err - } - defer event.CloseManager() - //create app status client - cli, err := client.NewClient(ctx, client.AppRuntimeSyncClientConf{ - EtcdEndpoints: s.Config.EtcdEndpoint, - EtcdCaFile: s.Config.EtcdCaFile, - EtcdCertFile: s.Config.EtcdCertFile, - EtcdKeyFile: s.Config.EtcdKeyFile, - NonBlock: s.Config.Debug, - }) - if err != nil { - logrus.Errorf("create app status client error, %v", err) - return err - } - - etcdcli, err := etcdutil.NewClient(ctx, etcdClientArgs) - if err != nil { - logrus.Errorf("create etcd client v3 error, %v", err) - return err - } - - kubevirtCli, err := kubecli.GetKubevirtClientFromRESTConfig(config) - if err != nil { - logrus.Errorf("create kubevirt cli failure: %v", err) - return err - } - - var cluster rainbondv1alpha1.RainbondCluster - err = clients.K8SClientInitClient(clientset, config) - if err != nil { - logrus.Errorf("k8s client init rainbondClient failure: %v", err) - return err - } - if err := clients.RainbondKubeClient.Get(context.Background(), types.NamespacedName{Namespace: "rbd-system", Name: "rainbondcluster"}, &cluster); err != nil { - return errors.Wrap(err, "get configuration from rainbond cluster") - } - - registryConfig := cluster.Spec.ImageHub - if registryConfig.Domain == "goodrain.me" { - registryConfig.Domain = "http://rbd-hub:5000" - } - - registryCli, err := registry.NewInsecure(registryConfig.Domain, registryConfig.Username, registryConfig.Password) - if err != nil { - return errors.WithMessage(err, "create registry cleaner") - } - - //初始化 middleware - handler.InitProxy(s.Config) - //创建handle - if err := handler.InitHandle(s.Config, etcdClientArgs, cli, etcdcli, clientset, rainbondClient, k8sClient, config, mapper, dynamicClient, gatewayClient, kubevirtCli, registryCli); err != nil { - logrus.Errorf("init all handle error, %v", err) - return err - } - //创建v2Router manager - if err := controller.CreateV2RouterManager(s.Config, cli); err != nil { - logrus.Errorf("create v2 route manager error, %v", err) - } - // 启动api - apiManager := server.NewManager(s.Config, etcdcli) - if err := apiManager.Start(); err != nil { - return err - } - defer apiManager.Stop() - logrus.Info("api router is running...") - - //step finally: listen Signal - term := make(chan os.Signal) - signal.Notify(term, os.Interrupt, syscall.SIGTERM) - select { - case s := <-term: - logrus.Infof("Received a Signal %s, exiting gracefully...", s.String()) - case err := <-errChan: - logrus.Errorf("Received a error %s, exiting gracefully...", err.Error()) - } - logrus.Info("See you next time!") - return nil + cfg := &configs.Config{ + AppName: "rbd-api", + APIConfig: s.Config, + } + return rainbond.New(context.Background(), cfg). + Registry(component.Database()). + //Registry(component.Event()). + Registry(component.K8sClient()). + Registry(component.HubRegistry()). + Registry(component.Proxy()). + Registry(component.Etcd()). + Registry(component.Handler()). + Registry(component.Router()). + Start() } diff --git a/cmd/builder/server/server.go b/cmd/builder/server/server.go index 96c95bae5d..917cb158d8 100644 --- a/cmd/builder/server/server.go +++ b/cmd/builder/server/server.go @@ -72,7 +72,7 @@ func Run(s *option.Builder) error { return err } defer event.CloseManager() - mqClient, err := client.NewMqClient(etcdClientArgs, s.Config.MQAPI) + mqClient, err := client.NewMqClient(s.Config.MQAPI) if err != nil { logrus.Errorf("new Mq mqClient error, %v", err) return err diff --git a/cmd/mqcli/main.go b/cmd/mqcli/main.go index c9b512de71..d9d865ef7f 100644 --- a/cmd/mqcli/main.go +++ b/cmd/mqcli/main.go @@ -42,7 +42,7 @@ var mode string func main() { AddFlags(pflag.CommandLine) pflag.Parse() - c, err := client.NewMqClient(nil, server) + c, err := client.NewMqClient(server) if err != nil { logrus.Error("new mq client error.", err.Error()) os.Exit(1) diff --git a/config/configs/config.go b/config/configs/config.go new file mode 100644 index 0000000000..97783dd296 --- /dev/null +++ b/config/configs/config.go @@ -0,0 +1,13 @@ +package configs + +import "github.com/goodrain/rainbond/cmd/api/option" + +type Env string + +type Config struct { + AppName string + Version string + Env Env + Debug bool + APIConfig option.Config +} diff --git a/monitor/api/router.go b/monitor/api/router.go index 1029f7cdc2..fd7b8e594a 100644 --- a/monitor/api/router.go +++ b/monitor/api/router.go @@ -28,7 +28,7 @@ import ( httputil "github.com/goodrain/rainbond/util/http" ) -//Server api server +// Server api server func Server(c *controller.RuleControllerManager) *chi.Mux { r := chi.NewRouter() r.Route("/monitor", func(r chi.Router) { @@ -37,13 +37,13 @@ func Server(c *controller.RuleControllerManager) *chi.Mux { httputil.ReturnSuccess(r, w, bean) }) }) - r.Route("/v2/rules", func(r chi.Router) { - r.Post("/", c.AddRules) - r.Put("/{rules_name}", c.RegRules) - r.Delete("/{rules_name}", c.DelRules) - r.Get("/{rules_name}", c.GetRules) - r.Get("/all", c.GetAllRules) - }) + //r.Route("/v2/rules", func(r chi.Router) { + // r.Post("/", c.AddRules) + // r.Put("/{rules_name}", c.RegRules) + // r.Delete("/{rules_name}", c.DelRules) + // r.Get("/{rules_name}", c.GetRules) + // r.Get("/all", c.GetAllRules) + //}) util.ProfilerSetup(r) return r } diff --git a/mq/client/client.go b/mq/client/client.go index 437c049501..04022ede7c 100644 --- a/mq/client/client.go +++ b/mq/client/client.go @@ -24,23 +24,21 @@ import ( "time" "github.com/goodrain/rainbond/mq/api/grpc/pb" - etcdutil "github.com/goodrain/rainbond/util/etcd" - grpcutil "github.com/goodrain/rainbond/util/grpc" "github.com/sirupsen/logrus" context "golang.org/x/net/context" grpc "google.golang.org/grpc" ) -//BuilderTopic builder for linux +// BuilderTopic builder for linux var BuilderTopic = "builder" -//WindowsBuilderTopic builder for windows +// WindowsBuilderTopic builder for windows var WindowsBuilderTopic = "windows_builder" -//WorkerTopic worker topic +// WorkerTopic worker topic var WorkerTopic = "worker" -//MQClient mq client +// MQClient mq client type MQClient interface { pb.TaskQueueClient Close() @@ -53,27 +51,12 @@ type mqClient struct { cancel context.CancelFunc } -//NewMqClient new a mq client -func NewMqClient(etcdClientArgs *etcdutil.ClientArgs, defaultserver string) (MQClient, error) { +// NewMqClient new a mq client +func NewMqClient(mqAddr string) (MQClient, error) { ctx, cancel := context.WithCancel(context.Background()) - var conn *grpc.ClientConn - if etcdClientArgs != nil && etcdClientArgs.Endpoints != nil && len(defaultserver) > 1 { - c, err := etcdutil.NewClient(ctx, etcdClientArgs) - if err != nil { - return nil, err - } - r := &grpcutil.GRPCResolver{Client: c} - b := grpc.RoundRobin(r) - conn, err = grpc.DialContext(ctx, "/rainbond/discover/rainbond_mq", grpc.WithBalancer(b), grpc.WithInsecure()) - if err != nil { - return nil, err - } - } else { - var err error - conn, err = grpc.DialContext(ctx, defaultserver, grpc.WithInsecure()) - if err != nil { - return nil, err - } + conn, err := grpc.DialContext(ctx, mqAddr, grpc.WithInsecure()) + if err != nil { + return nil, err } cli := pb.NewTaskQueueClient(conn) client := &mqClient{ @@ -84,12 +67,12 @@ func NewMqClient(etcdClientArgs *etcdutil.ClientArgs, defaultserver string) (MQC return client, nil } -//Close mq grpc client must be closed after uesd +// Close mq grpc client must be closed after uesd func (m *mqClient) Close() { m.cancel() } -//TaskStruct task struct +// TaskStruct task struct type TaskStruct struct { Topic string Arch string @@ -97,7 +80,7 @@ type TaskStruct struct { TaskBody interface{} } -//buildTask build task +// buildTask build task func buildTask(t TaskStruct) (*pb.EnqueueRequest, error) { var er pb.EnqueueRequest taskJSON, err := json.Marshal(t.TaskBody) diff --git a/pkg/component/README.md b/pkg/component/README.md new file mode 100644 index 0000000000..3e52f0c715 --- /dev/null +++ b/pkg/component/README.md @@ -0,0 +1 @@ +# 通用的封装的组件 \ No newline at end of file diff --git a/pkg/component/core.go b/pkg/component/core.go new file mode 100644 index 0000000000..75cb791310 --- /dev/null +++ b/pkg/component/core.go @@ -0,0 +1,101 @@ +package component + +import ( + "context" + "github.com/goodrain/rainbond/api/controller" + "github.com/goodrain/rainbond/api/db" + "github.com/goodrain/rainbond/api/handler" + "github.com/goodrain/rainbond/api/server" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/event" + "github.com/goodrain/rainbond/pkg/component/etcd" + "github.com/goodrain/rainbond/pkg/component/hubregistry" + "github.com/goodrain/rainbond/pkg/component/k8s" + "github.com/goodrain/rainbond/pkg/rainbond" + etcdutil "github.com/goodrain/rainbond/util/etcd" + "github.com/sirupsen/logrus" + "time" +) + +// Database - +func Database() rainbond.Component { + return db.Database() +} + +// K8sClient - +func K8sClient() rainbond.Component { + return k8s.K8sClient() +} + +// HubRegistry - +func HubRegistry() rainbond.Component { + return hubregistry.HubRegistry() +} + +// Etcd - +func Etcd() rainbond.Component { + return etcd.Etcd() +} + +// Event - +func Event() rainbond.FuncComponent { + logrus.Infof("init event...") + return func(ctx context.Context, cfg *configs.Config) error { + var tryTime time.Duration + var err error + etcdClientArgs := &etcdutil.ClientArgs{ + Endpoints: cfg.APIConfig.EtcdEndpoint, + CaFile: cfg.APIConfig.EtcdCaFile, + CertFile: cfg.APIConfig.EtcdCertFile, + KeyFile: cfg.APIConfig.EtcdKeyFile, + } + for tryTime < 4 { + tryTime++ + if err = event.NewManager(event.EventConfig{ + EventLogServers: cfg.APIConfig.EventLogServers, + DiscoverArgs: etcdClientArgs, + }); err != nil { + logrus.Errorf("get event manager failed, try time is %v,%s", tryTime, err.Error()) + time.Sleep((5 + tryTime*10) * time.Second) + } else { + break + } + } + if err != nil { + logrus.Errorf("get event manager failed. %v", err.Error()) + return err + } + logrus.Info("init event manager success") + return nil + } +} + +// Handler - +func Handler() rainbond.FuncComponent { + return func(ctx context.Context, cfg *configs.Config) error { + return handler.InitHandle(cfg.APIConfig) + } +} + +func Router() rainbond.FuncComponent { + return func(ctx context.Context, cfg *configs.Config) error { + if err := controller.CreateV2RouterManager(cfg.APIConfig, etcd.Default().StatusClient); err != nil { + logrus.Errorf("create v2 route manager error, %v", err) + } + // 启动api + apiManager := server.NewManager(cfg.APIConfig, etcd.Default().EtcdClient) + if err := apiManager.Start(); err != nil { + return err + } + //defer apiManager.Stop() + logrus.Info("api router is running...") + return nil + } +} + +func Proxy() rainbond.FuncComponent { + return func(ctx context.Context, cfg *configs.Config) error { + handler.InitProxy(cfg.APIConfig) + return nil + } +} diff --git a/pkg/component/etcd/etcdCpmponent.go b/pkg/component/etcd/etcdCpmponent.go new file mode 100644 index 0000000000..0ba5cf78f2 --- /dev/null +++ b/pkg/component/etcd/etcdCpmponent.go @@ -0,0 +1,94 @@ +package etcd + +import ( + "context" + "github.com/coreos/etcd/clientv3" + "github.com/coreos/etcd/pkg/transport" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/pkg/gogo" + etcdutil "github.com/goodrain/rainbond/util/etcd" + "github.com/goodrain/rainbond/worker/client" + "github.com/sirupsen/logrus" + "log" + "time" +) + +var defaultEtcdComponent *Component + +type Component struct { + EtcdClient *clientv3.Client + StatusClient *client.AppRuntimeSyncClient +} + +func Etcd() *Component { + defaultEtcdComponent = &Component{} + return &Component{} +} + +func Default() *Component { + return defaultEtcdComponent +} + +var ( + defaultDialTimeout = 5 * time.Second + defaultAotuSyncInterval = 10 * time.Second +) + +func (e Component) Start(ctx context.Context, cfg *configs.Config) error { + logrus.Info("start etcd client...") + clientArgs := &etcdutil.ClientArgs{ + Endpoints: cfg.APIConfig.EtcdEndpoint, + CaFile: cfg.APIConfig.EtcdCaFile, + CertFile: cfg.APIConfig.EtcdCertFile, + KeyFile: cfg.APIConfig.EtcdKeyFile, + } + if clientArgs.DialTimeout <= 5 { + clientArgs.DialTimeout = defaultDialTimeout + } + if clientArgs.AutoSyncInterval <= 30 { + clientArgs.AutoSyncInterval = defaultAotuSyncInterval + } + + config := clientv3.Config{ + Context: ctx, + Endpoints: clientArgs.Endpoints, + DialTimeout: clientArgs.DialTimeout, + DialKeepAliveTime: time.Second * 2, + DialKeepAliveTimeout: time.Second * 6, + AutoSyncInterval: clientArgs.AutoSyncInterval, + } + + if clientArgs.CaFile != "" && clientArgs.CertFile != "" && clientArgs.KeyFile != "" { + // create etcd client with tls + tlsInfo := transport.TLSInfo{ + CertFile: clientArgs.CertFile, + KeyFile: clientArgs.KeyFile, + TrustedCAFile: clientArgs.CaFile, + } + tlsConfig, err := tlsInfo.ClientConfig() + if err != nil { + return err + } + config.TLS = tlsConfig + } + c, err := clientv3.New(config) + if err != nil { + log.Println(err) + } + e.EtcdClient = c + + gogo.Go(func(ctx context.Context) error { + e.StatusClient, err = client.NewClient(ctx, client.AppRuntimeSyncClientConf{ + EtcdEndpoints: clientArgs.Endpoints, + EtcdCaFile: clientArgs.CaFile, + EtcdCertFile: clientArgs.CertFile, + EtcdKeyFile: clientArgs.KeyFile, + NonBlock: cfg.APIConfig.Debug, + }) + return err + }) + return nil +} + +func (e Component) CloseHandle() { +} diff --git a/pkg/component/hubregistry/registryComponent.go b/pkg/component/hubregistry/registryComponent.go new file mode 100644 index 0000000000..9a1fbb6c93 --- /dev/null +++ b/pkg/component/hubregistry/registryComponent.go @@ -0,0 +1,55 @@ +package hubregistry + +import ( + "context" + rainbondv1alpha1 "github.com/goodrain/rainbond-operator/api/v1alpha1" + "github.com/goodrain/rainbond/builder/sources/registry" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/grctl/clients" + "github.com/goodrain/rainbond/pkg/component/k8s" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/types" +) + +var defaultRegistryComponent *RegistryComponent + +type RegistryComponent struct { + RegistryCli *registry.Registry +} + +func HubRegistry() *RegistryComponent { + defaultRegistryComponent = &RegistryComponent{} + return defaultRegistryComponent +} + +func (r RegistryComponent) Start(ctx context.Context, cfg *configs.Config) error { + logrus.Infof("init hub registry...") + var cluster rainbondv1alpha1.RainbondCluster + + err := clients.K8SClientInitClient(k8s.Default().Clientset, k8s.Default().RestConfig) + if err != nil { + logrus.Errorf("k8s client init rainbondClient failure: %v", err) + return err + } + if err := clients.RainbondKubeClient.Get(context.Background(), types.NamespacedName{Namespace: "rbd-system", Name: "rainbondcluster"}, &cluster); err != nil { + return errors.Wrap(err, "get configuration from rainbond cluster") + } + + registryConfig := cluster.Spec.ImageHub + if registryConfig.Domain == "goodrain.me" { + registryConfig.Domain = cfg.APIConfig.RbdHub + } + + r.RegistryCli, err = registry.NewInsecure(registryConfig.Domain, registryConfig.Username, registryConfig.Password) + logrus.Info("init hub registry success") + return err +} + +func (r RegistryComponent) CloseHandle() { + +} + +func Default() *RegistryComponent { + return defaultRegistryComponent +} diff --git a/pkg/component/k8s/k8sComponent.go b/pkg/component/k8s/k8sComponent.go new file mode 100644 index 0000000000..1c8465d966 --- /dev/null +++ b/pkg/component/k8s/k8sComponent.go @@ -0,0 +1,101 @@ +package k8s + +import ( + "context" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/pkg/generated/clientset/versioned" + rainbondscheme "github.com/goodrain/rainbond/pkg/generated/clientset/versioned/scheme" + k8sutil "github.com/goodrain/rainbond/util/k8s" + "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/kubernetes" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" + "kubevirt.io/client-go/kubecli" + k8sclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/typed/apis/v1beta1" + gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/typed/apis/v1beta1" +) + +// k8sComponent - +type K8sComponent struct { + RestConfig *rest.Config + Clientset *kubernetes.Clientset + GatewayClient *v1beta1.GatewayV1beta1Client + DynamicClient *dynamic.DynamicClient + + RainbondClient *versioned.Clientset + K8sClient k8sclient.Client + KubevirtCli kubecli.KubevirtClient + + Mapper meta.RESTMapper +} + +var defaultK8sComponent *K8sComponent + +func K8sClient() *K8sComponent { + defaultK8sComponent = &K8sComponent{} + return defaultK8sComponent +} + +func (k *K8sComponent) Start(ctx context.Context, cfg *configs.Config) error { + logrus.Infof("init k8s client...") + config, err := k8sutil.NewRestConfig(cfg.APIConfig.KubeConfigPath) + k.RestConfig = config + if err != nil { + logrus.Errorf("create k8s config failure: %v", err) + return err + } + k.Clientset, err = kubernetes.NewForConfig(config) + if err != nil { + logrus.Errorf("create k8s client failure: %v", err) + return err + } + k.GatewayClient, err = gateway.NewForConfig(config) + if err != nil { + logrus.Errorf("create gateway client failure: %v", err) + return err + } + k.DynamicClient, err = dynamic.NewForConfig(config) + if err != nil { + logrus.Errorf("create dynamic client failure: %v", err) + return err + } + + k.RainbondClient = versioned.NewForConfigOrDie(config) + + scheme := runtime.NewScheme() + clientgoscheme.AddToScheme(scheme) + rainbondscheme.AddToScheme(scheme) + k.K8sClient, err = k8sclient.New(config, k8sclient.Options{ + Scheme: scheme, + }) + if err != nil { + logrus.Errorf("create k8s client failure: %v", err) + return err + } + + k.KubevirtCli, err = kubecli.GetKubevirtClientFromRESTConfig(config) + if err != nil { + logrus.Errorf("create kubevirt cli failure: %v", err) + return err + } + + gr, err := restmapper.GetAPIGroupResources(k.Clientset) + if err != nil { + return err + } + k.Mapper = restmapper.NewDiscoveryRESTMapper(gr) + logrus.Infof("init k8s client success") + return nil +} + +func (k *K8sComponent) CloseHandle() { +} + +func Default() *K8sComponent { + return defaultK8sComponent +} diff --git a/pkg/gogo/go.go b/pkg/gogo/go.go new file mode 100644 index 0000000000..9871586d31 --- /dev/null +++ b/pkg/gogo/go.go @@ -0,0 +1,30 @@ +package gogo + +import ( + "context" + "sync" +) + +var wg sync.WaitGroup + +// Go 框架处理协程,用于优雅启停 +func Go(fun func(ctx context.Context) error, opts ...Option) error { + wg.Add(1) + options := &Options{} + for _, o := range opts { + o(options) + } + if options.ctx == nil { + options.ctx = context.Background() + } + go func() { + defer wg.Done() + _ = fun(options.ctx) + }() + return nil +} + +// Wait 等待所有协程结束 +func Wait() { + wg.Wait() +} diff --git a/pkg/gogo/option.go b/pkg/gogo/option.go new file mode 100644 index 0000000000..f5640c9b93 --- /dev/null +++ b/pkg/gogo/option.go @@ -0,0 +1,15 @@ +package gogo + +import "context" + +type Option func(*Options) + +type Options struct { + ctx context.Context +} + +func WithContext(ctx context.Context) Option { + return func(o *Options) { + o.ctx = ctx + } +} diff --git a/pkg/rainbond/component.go b/pkg/rainbond/component.go new file mode 100644 index 0000000000..98b2d8f845 --- /dev/null +++ b/pkg/rainbond/component.go @@ -0,0 +1,38 @@ +package rainbond + +import ( + "context" + "github.com/goodrain/rainbond/config/configs" +) + +type Component interface { + Start(ctx context.Context, cfg *configs.Config) error + CloseHandle() +} + +type ComponentCancel interface { + Component + StartCancel(ctx context.Context, cancel context.CancelFunc, cfg *configs.Config) error +} + +type FuncComponent func(ctx context.Context, cfg *configs.Config) error + +func (f FuncComponent) Start(ctx context.Context, cfg *configs.Config) error { + return f(ctx, cfg) +} + +func (f FuncComponent) CloseHandle() { +} + +type FuncComponentCancel func(ctx context.Context, cancel context.CancelFunc, cfg *configs.Config) error + +func (f FuncComponentCancel) Start(ctx context.Context, cfg *configs.Config) error { + return f.StartCancel(ctx, nil, cfg) +} + +func (f FuncComponentCancel) StartCancel(ctx context.Context, cancel context.CancelFunc, cfg *configs.Config) error { + return f(ctx, cancel, cfg) +} + +func (f FuncComponentCancel) CloseHandle() { +} diff --git a/pkg/rainbond/registry.go b/pkg/rainbond/registry.go new file mode 100644 index 0000000000..6cc1e90efa --- /dev/null +++ b/pkg/rainbond/registry.go @@ -0,0 +1,86 @@ +package rainbond + +import ( + "context" + "errors" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/pkg/gogo" + "log" + "os" + "os/signal" + "reflect" + "syscall" + "time" +) + +type Rainbond struct { + ctx context.Context + cancel context.CancelFunc + cfg *configs.Config + components []Component + disableLog bool +} + +type CloseHandle func() + +// New 初始化cago +func New(ctx context.Context, cfg *configs.Config) *Rainbond { + ctx, cancel := context.WithCancel(ctx) + cago := &Rainbond{ + ctx: ctx, + cancel: cancel, + cfg: cfg, + } + return cago +} + +// Registry 注册组件 +func (r *Rainbond) Registry(component Component) *Rainbond { + err := component.Start(r.ctx, r.cfg) + if err != nil { + panic(err) + } + r.components = append(r.components, component) + return r +} + +// RegistryCancel 注册cancel组件 +func (r *Rainbond) RegistryCancel(component ComponentCancel) *Rainbond { + err := component.StartCancel(r.ctx, r.cancel, r.cfg) + if err != nil { + panic(errors.New("start component error: " + reflect.TypeOf(component).String() + " " + err.Error())) + } + r.components = append(r.components, component) + return r +} + +// Start 启动框架,在此之前组件已全部启动,此处只做停止等待 +func (r *Rainbond) Start() error { + quitSignal := make(chan os.Signal, 1) + // 优雅启停 + signal.Notify( + quitSignal, + syscall.SIGINT, syscall.SIGTERM, + ) + select { + case <-quitSignal: + r.cancel() + case <-r.ctx.Done(): + } + log.Println(r.cfg.AppName + " is stopping...") + for _, v := range r.components { + v.CloseHandle() + } + // 等待所有组件退出 + stopCh := make(chan struct{}) + go func() { + gogo.Wait() + close(stopCh) + }() + select { + case <-stopCh: + case <-time.After(time.Second * 10): + } + log.Println(r.cfg.AppName + " is stopped") + return nil +} diff --git a/worker/discover/manager.go b/worker/discover/manager.go index 908894b3e7..778b32bff8 100644 --- a/worker/discover/manager.go +++ b/worker/discover/manager.go @@ -30,7 +30,6 @@ import ( "github.com/goodrain/rainbond/cmd/worker/option" "github.com/goodrain/rainbond/mq/api/grpc/pb" "github.com/goodrain/rainbond/mq/client" - etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/goodrain/rainbond/worker/appm/controller" "github.com/goodrain/rainbond/worker/appm/store" "github.com/goodrain/rainbond/worker/discover/model" @@ -42,13 +41,13 @@ import ( var healthStatus = make(map[string]string, 1) -//TaskNum exec task number +// TaskNum exec task number var TaskNum float64 -//TaskError exec error task number +// TaskError exec error task number var TaskError float64 -//TaskManager task +// TaskManager task type TaskManager struct { ctx context.Context cancel context.CancelFunc @@ -60,7 +59,7 @@ type TaskManager struct { clientset *kubernetes.Clientset } -//NewTaskManager return *TaskManager +// NewTaskManager return *TaskManager func NewTaskManager(cfg option.Config, store store.Storer, controllermanager *controller.Manager, @@ -84,15 +83,9 @@ func NewTaskManager(cfg option.Config, } } -//Start 启动 +// Start 启动 func (t *TaskManager) Start() error { - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: t.config.EtcdEndPoints, - CaFile: t.config.EtcdCaFile, - CertFile: t.config.EtcdCertFile, - KeyFile: t.config.EtcdKeyFile, - } - client, err := client.NewMqClient(etcdClientArgs, t.config.MQAPI) + client, err := client.NewMqClient(t.config.MQAPI) if err != nil { logrus.Errorf("new Mq client error, %v", err) healthStatus["status"] = "unusual" @@ -105,7 +98,7 @@ func (t *TaskManager) Start() error { return nil } -//Do do +// Do do func (t *TaskManager) Do() { logrus.Info("start receive task from mq") hostname, _ := os.Hostname() @@ -164,7 +157,7 @@ func (t *TaskManager) Do() { } } -//Stop 停止 +// Stop 停止 func (t *TaskManager) Stop() error { logrus.Info("discover manager is stoping.") t.cancel() @@ -174,7 +167,7 @@ func (t *TaskManager) Stop() error { return nil } -//HealthCheck health check +// HealthCheck health check func HealthCheck() map[string]string { return healthStatus } From 6b7d7bfd5b057472278de170b378cc372fdf67a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 15:52:37 +0800 Subject: [PATCH 02/43] perf: optimize communication exceptions --- api/controller/manager.go | 3 +- api/controller/websocket.go | 11 ++-- .../{etcdCpmponent.go => etcdComponent.go} | 34 +++++----- worker/client/client.go | 45 ++++++------- worker/client/client_test.go | 63 ------------------- 5 files changed, 45 insertions(+), 111 deletions(-) rename pkg/component/etcd/{etcdCpmponent.go => etcdComponent.go} (75%) delete mode 100644 worker/client/client_test.go diff --git a/api/controller/manager.go b/api/controller/manager.go index 19d0807509..bcf5c44a88 100644 --- a/api/controller/manager.go +++ b/api/controller/manager.go @@ -19,6 +19,7 @@ package controller import ( + "github.com/goodrain/rainbond/api/discover" "net/http" "github.com/goodrain/rainbond/api/api" @@ -78,7 +79,7 @@ func NewManager(conf option.Config, statusCli *client.AppRuntimeSyncClient) (*V2 v2r.GatewayStruct.cfg = &conf v2r.LabelController.optconfig = &conf eventServerProxy := proxy.CreateProxy("eventlog", "http", []string{"local=>rbd-eventlog:6363"}) - //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) + discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) v2r.EventLogStruct.EventlogServerProxy = eventServerProxy return &v2r, nil } diff --git a/api/controller/websocket.go b/api/controller/websocket.go index aaeaf59fe8..b0bec590eb 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -20,6 +20,7 @@ package controller import ( "context" + "github.com/goodrain/rainbond/api/discover" "net/http" "os" "path" @@ -50,7 +51,7 @@ func GetDockerConsole() *DockerConsole { dockerConsole = &DockerConsole{ socketproxy: proxy.CreateProxy("dockerconsole", "websocket", defaultDockerConsoleEndpoints), } - //discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) + discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) return dockerConsole } @@ -72,7 +73,7 @@ func GetDockerLog() *DockerLog { dockerLog = &DockerLog{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - //discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) + discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) } return dockerLog } @@ -95,7 +96,7 @@ func GetMonitorMessage() *MonitorMessage { monitorMessage = &MonitorMessage{ socketproxy: proxy.CreateProxy("monitormessage", "websocket", defaultEventLogEndpoints), } - //discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) + discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) } return monitorMessage } @@ -118,7 +119,7 @@ func GetEventLog() *EventLog { eventLog = &EventLog{ socketproxy: proxy.CreateProxy("eventlog", "websocket", defaultEventLogEndpoints), } - //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) + discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) } return eventLog } @@ -190,7 +191,7 @@ func GetPubSubControll() *PubSubControll { pubSubControll = &PubSubControll{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - //discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) + discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) } return pubSubControll } diff --git a/pkg/component/etcd/etcdCpmponent.go b/pkg/component/etcd/etcdComponent.go similarity index 75% rename from pkg/component/etcd/etcdCpmponent.go rename to pkg/component/etcd/etcdComponent.go index 0ba5cf78f2..657d56a6ee 100644 --- a/pkg/component/etcd/etcdCpmponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -9,7 +9,6 @@ import ( etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/goodrain/rainbond/worker/client" "github.com/sirupsen/logrus" - "log" "time" ) @@ -71,21 +70,26 @@ func (e Component) Start(ctx context.Context, cfg *configs.Config) error { } config.TLS = tlsConfig } - c, err := clientv3.New(config) - if err != nil { - log.Println(err) - } - e.EtcdClient = c - gogo.Go(func(ctx context.Context) error { - e.StatusClient, err = client.NewClient(ctx, client.AppRuntimeSyncClientConf{ - EtcdEndpoints: clientArgs.Endpoints, - EtcdCaFile: clientArgs.CaFile, - EtcdCertFile: clientArgs.CertFile, - EtcdKeyFile: clientArgs.KeyFile, - NonBlock: cfg.APIConfig.Debug, - }) - return err + var etcdClient *clientv3.Client + var err error + for { + etcdClient, err = clientv3.New(config) + if err == nil { + logrus.Infof("etcd.v3 client is ready") + e.EtcdClient = etcdClient + e.StatusClient, err = client.NewClient(ctx, client.AppRuntimeSyncClientConf{ + EtcdEndpoints: clientArgs.Endpoints, + EtcdCaFile: clientArgs.CaFile, + EtcdCertFile: clientArgs.CertFile, + EtcdKeyFile: clientArgs.KeyFile, + NonBlock: cfg.APIConfig.Debug, + }, etcdClient) + return nil + } + logrus.Errorf("create etcd.v3 client failed, try time is %d,%s", 10, err.Error()) + time.Sleep(10 * time.Second) + } }) return nil } diff --git a/worker/client/client.go b/worker/client/client.go index 977d963f72..7e283b0d3c 100644 --- a/worker/client/client.go +++ b/worker/client/client.go @@ -20,12 +20,12 @@ package client import ( "context" + "github.com/coreos/etcd/clientv3" "strings" "time" "github.com/goodrain/rainbond/db/model" "github.com/goodrain/rainbond/util" - etcdutil "github.com/goodrain/rainbond/util/etcd" grpcutil "github.com/goodrain/rainbond/util/grpc" v1 "github.com/goodrain/rainbond/worker/appm/types/v1" "github.com/goodrain/rainbond/worker/server/pb" @@ -33,7 +33,7 @@ import ( "google.golang.org/grpc" ) -//AppRuntimeSyncClient grpc client +// AppRuntimeSyncClient grpc client type AppRuntimeSyncClient struct { pb.AppRuntimeSyncClient AppRuntimeSyncClientConf @@ -41,7 +41,7 @@ type AppRuntimeSyncClient struct { ctx context.Context } -//AppRuntimeSyncClientConf client conf +// AppRuntimeSyncClientConf client conf type AppRuntimeSyncClientConf struct { NonBlock bool EtcdEndpoints []string @@ -51,23 +51,14 @@ type AppRuntimeSyncClientConf struct { DefaultServerAddress []string } -//NewClient new client -//ctx must be cancel where client not used -func NewClient(ctx context.Context, conf AppRuntimeSyncClientConf) (*AppRuntimeSyncClient, error) { +// NewClient new client +// ctx must be cancel where client not used +func NewClient(ctx context.Context, conf AppRuntimeSyncClientConf, etcdClient *clientv3.Client) (c *AppRuntimeSyncClient, err error) { var arsc AppRuntimeSyncClient arsc.AppRuntimeSyncClientConf = conf arsc.ctx = ctx - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: conf.EtcdEndpoints, - CaFile: conf.EtcdCaFile, - CertFile: conf.EtcdCertFile, - KeyFile: conf.EtcdKeyFile, - } - c, err := etcdutil.NewClient(ctx, etcdClientArgs) - if err != nil { - return nil, err - } - r := &grpcutil.GRPCResolver{Client: c} + + r := &grpcutil.GRPCResolver{Client: etcdClient} b := grpc.RoundRobin(r) dialOpts := []grpc.DialOption{ grpc.WithBalancer(b), @@ -84,12 +75,12 @@ func NewClient(ctx context.Context, conf AppRuntimeSyncClientConf) (*AppRuntimeS return &arsc, nil } -//when watch occurred error,will exec this method +// when watch occurred error,will exec this method func (a *AppRuntimeSyncClient) Error(err error) { logrus.Errorf("discover app runtime sync server address occurred err:%s", err.Error()) } -//GetStatus get status +// GetStatus get status func (a *AppRuntimeSyncClient) GetStatus(serviceID string) string { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -102,7 +93,7 @@ func (a *AppRuntimeSyncClient) GetStatus(serviceID string) string { return status.Status[serviceID] } -//GetOperatorWatchData get operator watch data +// GetOperatorWatchData get operator watch data func (a *AppRuntimeSyncClient) GetOperatorWatchData(appID string) (*pb.OperatorManaged, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -115,7 +106,7 @@ func (a *AppRuntimeSyncClient) GetOperatorWatchData(appID string) (*pb.OperatorM return status, nil } -//GetStatuss get multiple app status +// GetStatuss get multiple app status func (a *AppRuntimeSyncClient) GetStatuss(serviceIDs string) map[string]string { ctx, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel() @@ -133,7 +124,7 @@ func (a *AppRuntimeSyncClient) GetStatuss(serviceIDs string) map[string]string { return status.Status } -//GetAllStatus get all status +// GetAllStatus get all status func (a *AppRuntimeSyncClient) GetAllStatus() map[string]string { ctx, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel() @@ -146,7 +137,7 @@ func (a *AppRuntimeSyncClient) GetAllStatus() map[string]string { return status.Status } -//GetNeedBillingStatus get need billing status +// GetNeedBillingStatus get need billing status func (a *AppRuntimeSyncClient) GetNeedBillingStatus() (map[string]string, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*15) defer cancel() @@ -163,7 +154,7 @@ func (a *AppRuntimeSyncClient) GetNeedBillingStatus() (map[string]string, error) return res, nil } -//GetServiceDeployInfo get service deploy info +// GetServiceDeployInfo get service deploy info func (a *AppRuntimeSyncClient) GetServiceDeployInfo(serviceID string) (*pb.DeployInfo, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -176,12 +167,12 @@ func (a *AppRuntimeSyncClient) GetServiceDeployInfo(serviceID string) (*pb.Deplo return re, nil } -//IsClosedStatus check status +// IsClosedStatus check status func (a *AppRuntimeSyncClient) IsClosedStatus(curStatus string) bool { return curStatus == "" || curStatus == v1.BUILDEFAILURE || curStatus == v1.CLOSED || curStatus == v1.UNDEPLOY || curStatus == v1.BUILDING || curStatus == v1.UNKNOW } -//GetTenantResource get tenant resource +// GetTenantResource get tenant resource func (a *AppRuntimeSyncClient) GetTenantResource(tenantID string) (*pb.TenantResource, error) { if logrus.IsLevelEnabled(logrus.DebugLevel) { defer util.Elapsed("[AppRuntimeSyncClient] get tenant resource")() @@ -192,7 +183,7 @@ func (a *AppRuntimeSyncClient) GetTenantResource(tenantID string) (*pb.TenantRes return a.AppRuntimeSyncClient.GetTenantResource(ctx, &pb.TenantRequest{TenantId: tenantID}) } -//GetAllTenantResource get all tenant resource +// GetAllTenantResource get all tenant resource func (a *AppRuntimeSyncClient) GetAllTenantResource() (*pb.TenantResourceList, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() diff --git a/worker/client/client_test.go b/worker/client/client_test.go deleted file mode 100644 index ba06c47db2..0000000000 --- a/worker/client/client_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// RAINBOND, Application Management Platform -// Copyright (C) 2014-2017 Goodrain Co., Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package client - -import ( - "context" - "testing" - "time" - - "github.com/goodrain/rainbond/worker/server/pb" -) - -func TestGetAppStatus(t *testing.T) { - client, err := NewClient(context.Background(), AppRuntimeSyncClientConf{ - EtcdEndpoints: []string{"192.168.3.252:2379"}, - }) - if err != nil { - t.Fatal(err) - } - time.Sleep(3 * time.Second) - status, err := client.GetAppStatus(context.Background(), &pb.AppStatusReq{ - AppId: "43eaae441859eda35b02075d37d83589", - }) - if err != nil { - t.Fatal(err) - } - t.Log(status) -} - -func TestGetPodDetail(t *testing.T) { - client, err := NewClient(context.Background(), AppRuntimeSyncClientConf{ - EtcdEndpoints: []string{"127.0.0.1:2379"}, - }) - if err != nil { - t.Fatalf("error creating grpc client: %v", err) - } - - time.Sleep(3 * time.Second) - - sid := "bc2e153243e4917acaf0c6088789fa12" - podname := "bc2e153243e4917acaf0c6088789fa12-deployment-6cc445949b-2dh25" - detail, err := client.GetPodDetail(sid, podname) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - t.Logf("pod detail: %+v", detail) -} From e200abd81b077a165b0c280fbb7bba9d111f8670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:05:45 +0800 Subject: [PATCH 03/43] perf: optimize communication exceptions --- api/controller/manager.go | 3 +- api/controller/websocket.go | 11 +- db/3rd_party_db_test.go | 178 ---------------------------- db/etcd/etcd.go | 1 + pkg/component/etcd/etcdComponent.go | 6 +- 5 files changed, 11 insertions(+), 188 deletions(-) delete mode 100644 db/3rd_party_db_test.go diff --git a/api/controller/manager.go b/api/controller/manager.go index bcf5c44a88..19d0807509 100644 --- a/api/controller/manager.go +++ b/api/controller/manager.go @@ -19,7 +19,6 @@ package controller import ( - "github.com/goodrain/rainbond/api/discover" "net/http" "github.com/goodrain/rainbond/api/api" @@ -79,7 +78,7 @@ func NewManager(conf option.Config, statusCli *client.AppRuntimeSyncClient) (*V2 v2r.GatewayStruct.cfg = &conf v2r.LabelController.optconfig = &conf eventServerProxy := proxy.CreateProxy("eventlog", "http", []string{"local=>rbd-eventlog:6363"}) - discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventServerProxy) v2r.EventLogStruct.EventlogServerProxy = eventServerProxy return &v2r, nil } diff --git a/api/controller/websocket.go b/api/controller/websocket.go index b0bec590eb..aaeaf59fe8 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -20,7 +20,6 @@ package controller import ( "context" - "github.com/goodrain/rainbond/api/discover" "net/http" "os" "path" @@ -51,7 +50,7 @@ func GetDockerConsole() *DockerConsole { dockerConsole = &DockerConsole{ socketproxy: proxy.CreateProxy("dockerconsole", "websocket", defaultDockerConsoleEndpoints), } - discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) + //discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) return dockerConsole } @@ -73,7 +72,7 @@ func GetDockerLog() *DockerLog { dockerLog = &DockerLog{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) } return dockerLog } @@ -96,7 +95,7 @@ func GetMonitorMessage() *MonitorMessage { monitorMessage = &MonitorMessage{ socketproxy: proxy.CreateProxy("monitormessage", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) } return monitorMessage } @@ -119,7 +118,7 @@ func GetEventLog() *EventLog { eventLog = &EventLog{ socketproxy: proxy.CreateProxy("eventlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) } return eventLog } @@ -191,7 +190,7 @@ func GetPubSubControll() *PubSubControll { pubSubControll = &PubSubControll{ socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), } - discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) + //discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) } return pubSubControll } diff --git a/db/3rd_party_db_test.go b/db/3rd_party_db_test.go deleted file mode 100644 index 2c265a8371..0000000000 --- a/db/3rd_party_db_test.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package db - -import ( - "context" - "fmt" - dbconfig "github.com/goodrain/rainbond/db/config" - "github.com/goodrain/rainbond/db/model" - "github.com/goodrain/rainbond/util" - "github.com/testcontainers/testcontainers-go" - "testing" - "time" -) - -func TestEndpointDaoImpl_UpdateModel(t *testing.T) { - dbname := "region" - rootpw := "rainbond" - - ctx := context.Background() - req := testcontainers.ContainerRequest{ - Image: "mariadb", - ExposedPorts: []string{"3306/tcp"}, - Env: map[string]string{ - "MYSQL_ROOT_PASSWORD": rootpw, - "MYSQL_DATABASE": dbname, - }, - Cmd: []string{"character-set-server=utf8mb4", "collation-server=utf8mb4_unicode_ci"}, - } - mariadb, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ - ContainerRequest: req, - Started: true, - }) - if err != nil { - t.Fatal(err) - } - defer mariadb.Terminate(ctx) - - host, err := mariadb.Host(ctx) - if err != nil { - t.Error(err) - } - port, err := mariadb.MappedPort(ctx, "3306") - if err != nil { - t.Error(err) - } - - connInfo := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", "root", - rootpw, host, port.Int(), dbname) - tryTimes := 3 - for { - if err := CreateManager(dbconfig.Config{ - DBType: "mysql", - MysqlConnectionInfo: connInfo, - }); err != nil { - if tryTimes == 0 { - t.Fatalf("Connect info: %s; error creating db manager: %v", connInfo, err) - } else { - tryTimes = tryTimes - 1 - time.Sleep(10 * time.Second) - continue - } - } - break - } - - trueVal := true - falseVal := false - ep := &model.Endpoint{ - UUID: util.NewUUID(), - ServiceID: util.NewUUID(), - IP: "10.10.10.10", - IsOnline: &trueVal, - } - err = GetManager().EndpointsDao().AddModel(ep) - if err != nil { - t.Fatalf("error adding endpoint: %v", err) - } - ep.IsOnline = &falseVal - err = GetManager().EndpointsDao().UpdateModel(ep) - if err != nil { - t.Fatalf("error updating endpoint: %v", err) - } - e, err := GetManager().EndpointsDao().GetByUUID(ep.UUID) - if err != nil { - t.Fatalf("error getting endpoint: %v", err) - } - if *e.IsOnline != false { - t.Errorf("Expected %v for e.IsOnline, but returned %v", false, e.IsOnline) - } -} - -func TestEndpointDaoImpl_AddModel(t *testing.T) { - dbname := "region" - rootpw := "rainbond" - - ctx := context.Background() - req := testcontainers.ContainerRequest{ - Image: "mariadb", - ExposedPorts: []string{"3306/tcp"}, - Env: map[string]string{ - "MYSQL_ROOT_PASSWORD": rootpw, - "MYSQL_DATABASE": dbname, - }, - Cmd: []string{"character-set-server=utf8mb4", "collation-server=utf8mb4_unicode_ci"}, - } - mariadb, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ - ContainerRequest: req, - Started: true, - }) - if err != nil { - t.Fatal(err) - } - defer mariadb.Terminate(ctx) - - host, err := mariadb.Host(ctx) - if err != nil { - t.Fatal(err) - } - port, err := mariadb.MappedPort(ctx, "3306") - if err != nil { - t.Fatal(err) - } - - connInfo := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", "root", - rootpw, host, port.Int(), dbname) - tryTimes := 3 - for { - if err := CreateManager(dbconfig.Config{ - DBType: "mysql", - MysqlConnectionInfo: connInfo, - }); err != nil { - if tryTimes == 0 { - t.Fatalf("Connect info: %s; error creating db manager: %v", connInfo, err) - } else { - tryTimes = tryTimes - 1 - time.Sleep(10 * time.Second) - continue - } - } - break - } - - falseVal := false - ep := &model.Endpoint{ - UUID: util.NewUUID(), - ServiceID: util.NewUUID(), - IP: "10.10.10.10", - IsOnline: &falseVal, - } - err = GetManager().EndpointsDao().AddModel(ep) - if err != nil { - t.Fatalf("error adding endpoint: %v", err) - } - e, err := GetManager().EndpointsDao().GetByUUID(ep.UUID) - if err != nil { - t.Fatalf("error getting endpoint: %v", err) - } - if *e.IsOnline != false { - t.Errorf("Expected %v for e.IsOnline, but returned %v", false, e.IsOnline) - } -} diff --git a/db/etcd/etcd.go b/db/etcd/etcd.go index 45f859edaa..45aff9cd7e 100644 --- a/db/etcd/etcd.go +++ b/db/etcd/etcd.go @@ -20,6 +20,7 @@ package etcd import ( "context" + "github.com/coreos/etcd/clientv3" "sync" "github.com/goodrain/rainbond/db/config" diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 657d56a6ee..a5e18fbf51 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -76,7 +76,6 @@ func (e Component) Start(ctx context.Context, cfg *configs.Config) error { for { etcdClient, err = clientv3.New(config) if err == nil { - logrus.Infof("etcd.v3 client is ready") e.EtcdClient = etcdClient e.StatusClient, err = client.NewClient(ctx, client.AppRuntimeSyncClientConf{ EtcdEndpoints: clientArgs.Endpoints, @@ -85,7 +84,10 @@ func (e Component) Start(ctx context.Context, cfg *configs.Config) error { EtcdKeyFile: clientArgs.KeyFile, NonBlock: cfg.APIConfig.Debug, }, etcdClient) - return nil + if err == nil { + logrus.Infof("etcd.v3 client is ready") + return nil + } } logrus.Errorf("create etcd.v3 client failed, try time is %d,%s", 10, err.Error()) time.Sleep(10 * time.Second) From 5e3ecf1188800b0e849dfcdc3ce9046a99a1518c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:33:23 +0800 Subject: [PATCH 04/43] perf: optimize communication exceptions --- cmd/api/option/option.go | 4 +++- pkg/component/core.go | 8 +++++++- pkg/component/etcd/etcdComponent.go | 16 ++------------- pkg/component/grpc/grpcComponent.go | 30 +++++++++++++++++++++++++++++ worker/client/client.go | 28 +++------------------------ 5 files changed, 45 insertions(+), 41 deletions(-) create mode 100644 pkg/component/grpc/grpcComponent.go diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index a2107c9529..8e0dfc935e 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -65,6 +65,7 @@ type Config struct { ShowSQL bool GrctlImage string RbdHub string + RbdWorker string } // APIServer apiserver server @@ -121,7 +122,8 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.PrometheusEndpoint, "prom-api", "rbd-monitor:9999", "The service DNS name of Prometheus api. Default to rbd-monitor:9999") fs.StringVar(&a.RbdHub, "hub-api", "http://rbd-hub:5000", "the rbd-hub server api") fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") - fs.StringVar(&a.MQAPI, "mq-api", "127.0.0.1:6300", "the rbd-mq server api") + fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") + fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-mq server api") } diff --git a/pkg/component/core.go b/pkg/component/core.go index 75cb791310..b8659875f2 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -9,6 +9,7 @@ import ( "github.com/goodrain/rainbond/config/configs" "github.com/goodrain/rainbond/event" "github.com/goodrain/rainbond/pkg/component/etcd" + "github.com/goodrain/rainbond/pkg/component/grpc" "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/k8s" "github.com/goodrain/rainbond/pkg/rainbond" @@ -37,6 +38,11 @@ func Etcd() rainbond.Component { return etcd.Etcd() } +// Grpc - +func Grpc() rainbond.Component { + return grpc.Grpc() +} + // Event - func Event() rainbond.FuncComponent { logrus.Infof("init event...") @@ -79,7 +85,7 @@ func Handler() rainbond.FuncComponent { func Router() rainbond.FuncComponent { return func(ctx context.Context, cfg *configs.Config) error { - if err := controller.CreateV2RouterManager(cfg.APIConfig, etcd.Default().StatusClient); err != nil { + if err := controller.CreateV2RouterManager(cfg.APIConfig, grpc.Default().StatusClient); err != nil { logrus.Errorf("create v2 route manager error, %v", err) } // 启动api diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index a5e18fbf51..79a704b156 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -7,7 +7,6 @@ import ( "github.com/goodrain/rainbond/config/configs" "github.com/goodrain/rainbond/pkg/gogo" etcdutil "github.com/goodrain/rainbond/util/etcd" - "github.com/goodrain/rainbond/worker/client" "github.com/sirupsen/logrus" "time" ) @@ -15,8 +14,7 @@ import ( var defaultEtcdComponent *Component type Component struct { - EtcdClient *clientv3.Client - StatusClient *client.AppRuntimeSyncClient + EtcdClient *clientv3.Client } func Etcd() *Component { @@ -77,17 +75,7 @@ func (e Component) Start(ctx context.Context, cfg *configs.Config) error { etcdClient, err = clientv3.New(config) if err == nil { e.EtcdClient = etcdClient - e.StatusClient, err = client.NewClient(ctx, client.AppRuntimeSyncClientConf{ - EtcdEndpoints: clientArgs.Endpoints, - EtcdCaFile: clientArgs.CaFile, - EtcdCertFile: clientArgs.CertFile, - EtcdKeyFile: clientArgs.KeyFile, - NonBlock: cfg.APIConfig.Debug, - }, etcdClient) - if err == nil { - logrus.Infof("etcd.v3 client is ready") - return nil - } + return nil } logrus.Errorf("create etcd.v3 client failed, try time is %d,%s", 10, err.Error()) time.Sleep(10 * time.Second) diff --git a/pkg/component/grpc/grpcComponent.go b/pkg/component/grpc/grpcComponent.go new file mode 100644 index 0000000000..36d7f89f38 --- /dev/null +++ b/pkg/component/grpc/grpcComponent.go @@ -0,0 +1,30 @@ +package grpc + +import ( + "context" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/worker/client" +) + +var defaultGrpcComponent *Component + +type Component struct { + StatusClient *client.AppRuntimeSyncClient +} + +func (c Component) Start(ctx context.Context, cfg *configs.Config) (err error) { + c.StatusClient, err = client.NewClient(ctx, cfg.APIConfig.RbdWorker) + return err +} + +func (c Component) CloseHandle() { +} + +func Grpc() *Component { + defaultGrpcComponent = &Component{} + return &Component{} +} + +func Default() *Component { + return defaultGrpcComponent +} diff --git a/worker/client/client.go b/worker/client/client.go index 7e283b0d3c..917d15041c 100644 --- a/worker/client/client.go +++ b/worker/client/client.go @@ -20,13 +20,11 @@ package client import ( "context" - "github.com/coreos/etcd/clientv3" "strings" "time" "github.com/goodrain/rainbond/db/model" "github.com/goodrain/rainbond/util" - grpcutil "github.com/goodrain/rainbond/util/grpc" v1 "github.com/goodrain/rainbond/worker/appm/types/v1" "github.com/goodrain/rainbond/worker/server/pb" "github.com/sirupsen/logrus" @@ -36,38 +34,18 @@ import ( // AppRuntimeSyncClient grpc client type AppRuntimeSyncClient struct { pb.AppRuntimeSyncClient - AppRuntimeSyncClientConf cc *grpc.ClientConn ctx context.Context } -// AppRuntimeSyncClientConf client conf -type AppRuntimeSyncClientConf struct { - NonBlock bool - EtcdEndpoints []string - EtcdCaFile string - EtcdCertFile string - EtcdKeyFile string - DefaultServerAddress []string -} - // NewClient new client // ctx must be cancel where client not used -func NewClient(ctx context.Context, conf AppRuntimeSyncClientConf, etcdClient *clientv3.Client) (c *AppRuntimeSyncClient, err error) { +func NewClient(ctx context.Context, grpcServer string) (c *AppRuntimeSyncClient, err error) { var arsc AppRuntimeSyncClient - arsc.AppRuntimeSyncClientConf = conf arsc.ctx = ctx - r := &grpcutil.GRPCResolver{Client: etcdClient} - b := grpc.RoundRobin(r) - dialOpts := []grpc.DialOption{ - grpc.WithBalancer(b), - grpc.WithInsecure(), - } - if !conf.NonBlock { - dialOpts = append(dialOpts, grpc.WithBlock()) - } - arsc.cc, err = grpc.DialContext(ctx, "/rainbond/discover/app_sync_runtime_server", dialOpts...) + arsc.cc, err = grpc.Dial(grpcServer, grpc.WithInsecure()) + if err != nil { return nil, err } From 3cd83115590c203a21c4ddbea1350e70f56625a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:33:37 +0800 Subject: [PATCH 05/43] perf: optimize communication exceptions --- cmd/api/option/option.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 8e0dfc935e..0d7a200205 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -123,7 +123,7 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.RbdHub, "hub-api", "http://rbd-hub:5000", "the rbd-hub server api") fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") - fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-mq server api") + fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-worker server api") } From 18feabbd9995cb65c65bae250c36df0c72dd302a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:37:30 +0800 Subject: [PATCH 06/43] perf: optimize communication exceptions --- api/handler/handler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/handler/handler.go b/api/handler/handler.go index 1b3b725761..ebbd750787 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -26,6 +26,7 @@ import ( "github.com/goodrain/rainbond/cmd/api/option" "github.com/goodrain/rainbond/db" "github.com/goodrain/rainbond/pkg/component/etcd" + "github.com/goodrain/rainbond/pkg/component/grpc" "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/k8s" "github.com/sirupsen/logrus" @@ -34,7 +35,7 @@ import ( // InitHandle 初始化handle func InitHandle(conf option.Config) error { etcdcli := etcd.Default().EtcdClient - statusCli := etcd.Default().StatusClient + statusCli := grpc.Default().StatusClient clientset := k8s.Default().Clientset rainbondClient := k8s.Default().RainbondClient k8sClient := k8s.K8sClient().K8sClient From 0c899fd4a4a21195e64d56f874b0cfed026599d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:43:39 +0800 Subject: [PATCH 07/43] perf: optimize communication exceptions --- cmd/api/server/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 796e83607f..9797d055dc 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -34,6 +34,7 @@ func Run(s *option.APIServer) error { } return rainbond.New(context.Background(), cfg). Registry(component.Database()). + Registry(component.Grpc()). //Registry(component.Event()). Registry(component.K8sClient()). Registry(component.HubRegistry()). From f8d15b12c18bf1c8b694ab9c40faa07170bed085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:48:06 +0800 Subject: [PATCH 08/43] perf: optimize communication exceptions --- cmd/api/server/server.go | 2 +- event/manager.go | 66 +++++++++++++++++++--------------------- pkg/component/core.go | 8 ----- 3 files changed, 33 insertions(+), 43 deletions(-) diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go index 9797d055dc..59a214d261 100644 --- a/cmd/api/server/server.go +++ b/cmd/api/server/server.go @@ -35,7 +35,7 @@ func Run(s *option.APIServer) error { return rainbond.New(context.Background(), cfg). Registry(component.Database()). Registry(component.Grpc()). - //Registry(component.Event()). + Registry(component.Event()). Registry(component.K8sClient()). Registry(component.HubRegistry()). Registry(component.Proxy()). diff --git a/event/manager.go b/event/manager.go index 5bb6ced0b7..499acdc3dc 100644 --- a/event/manager.go +++ b/event/manager.go @@ -27,19 +27,17 @@ import ( "sync/atomic" "time" - "github.com/goodrain/rainbond/discover" "github.com/goodrain/rainbond/discover/config" eventclient "github.com/goodrain/rainbond/eventlog/entry/grpc/client" eventpb "github.com/goodrain/rainbond/eventlog/entry/grpc/pb" "github.com/goodrain/rainbond/util" - etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/pquerna/ffjson/ffjson" "github.com/sirupsen/logrus" "golang.org/x/net/context" ) -//Manager 操作日志,客户端服务 -//客户端负载均衡 +// Manager 操作日志,客户端服务 +// 客户端负载均衡 type Manager interface { GetLogger(eventID string) Logger Start() error @@ -50,7 +48,7 @@ type Manager interface { // EventConfig event config struct type EventConfig struct { EventLogServers []string - DiscoverArgs *etcdutil.ClientArgs + //DiscoverArgs *etcdutil.ClientArgs } type manager struct { ctx context.Context @@ -62,7 +60,7 @@ type manager struct { lock sync.Mutex eventServer []string abnormalServer map[string]string - dis discover.Discover + //dis discover.Discover } var defaultManager Manager @@ -75,30 +73,30 @@ const ( buffersize = 1000 ) -//NewManager 创建manager +// NewManager 创建manager func NewManager(conf EventConfig) error { - dis, err := discover.GetDiscover(config.DiscoverConfig{EtcdClientArgs: conf.DiscoverArgs}) - if err != nil { - logrus.Error("create discover manager error.", err.Error()) - if len(conf.EventLogServers) < 1 { - return err - } - } + //dis, err := discover.GetDiscover(config.DiscoverConfig{EtcdClientArgs: conf.DiscoverArgs}) + //if err != nil { + // logrus.Error("create discover manager error.", err.Error()) + // if len(conf.EventLogServers) < 1 { + // return err + // } + //} ctx, cancel := context.WithCancel(context.Background()) defaultManager = &manager{ - ctx: ctx, - cancel: cancel, - config: conf, - loggers: make(map[string]Logger, 1024), - handles: make(map[string]handle), - eventServer: conf.EventLogServers, - dis: dis, + ctx: ctx, + cancel: cancel, + config: conf, + loggers: make(map[string]Logger, 1024), + handles: make(map[string]handle), + eventServer: conf.EventLogServers, + //dis: dis, abnormalServer: make(map[string]string), } return defaultManager.Start() } -//GetManager 获取日志服务 +// GetManager 获取日志服务 func GetManager() Manager { return defaultManager } @@ -108,7 +106,7 @@ func NewTestManager(m Manager) { defaultManager = m } -//CloseManager 关闭日志服务 +// CloseManager 关闭日志服务 func CloseManager() { if defaultManager != nil { defaultManager.Close() @@ -129,9 +127,9 @@ func (m *manager) Start() error { m.handles[m.eventServer[i]] = h go h.HandleLog() } - if m.dis != nil { - m.dis.AddProject("event_log_event_grpc", m) - } + //if m.dis != nil { + // m.dis.AddProject("event_log_event_grpc", m) + //} go m.GC() return nil } @@ -182,9 +180,9 @@ func (m *manager) Error(err error) { } func (m *manager) Close() error { m.cancel() - if m.dis != nil { - m.dis.Stop() - } + //if m.dis != nil { + // m.dis.Stop() + //} return nil } @@ -208,8 +206,8 @@ func (m *manager) GC() { }, time.Second*20) } -//GetLogger -//使用完成后必须调用ReleaseLogger方法 +// GetLogger +// 使用完成后必须调用ReleaseLogger方法 func (m *manager) GetLogger(eventID string) Logger { m.lock.Lock() defer m.lock.Unlock() @@ -336,7 +334,7 @@ func (m *handle) Stop() { close(m.stop) } -//Logger 日志发送器 +// Logger 日志发送器 type Logger interface { Info(string, map[string]string) Error(string, map[string]string) @@ -406,7 +404,7 @@ func (l *logger) send(message string, info map[string]string) { } } -//LoggerWriter logger writer +// LoggerWriter logger writer type LoggerWriter interface { io.Writer SetFormat(map[string]interface{}) @@ -475,7 +473,7 @@ func (l *loggerWriter) Write(b []byte) (n int, err error) { return len(b), nil } -//GetTestLogger GetTestLogger +// GetTestLogger GetTestLogger func GetTestLogger() Logger { return &testLogger{} } diff --git a/pkg/component/core.go b/pkg/component/core.go index b8659875f2..bbe7cf503b 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -13,7 +13,6 @@ import ( "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/k8s" "github.com/goodrain/rainbond/pkg/rainbond" - etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/sirupsen/logrus" "time" ) @@ -49,17 +48,10 @@ func Event() rainbond.FuncComponent { return func(ctx context.Context, cfg *configs.Config) error { var tryTime time.Duration var err error - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: cfg.APIConfig.EtcdEndpoint, - CaFile: cfg.APIConfig.EtcdCaFile, - CertFile: cfg.APIConfig.EtcdCertFile, - KeyFile: cfg.APIConfig.EtcdKeyFile, - } for tryTime < 4 { tryTime++ if err = event.NewManager(event.EventConfig{ EventLogServers: cfg.APIConfig.EventLogServers, - DiscoverArgs: etcdClientArgs, }); err != nil { logrus.Errorf("get event manager failed, try time is %v,%s", tryTime, err.Error()) time.Sleep((5 + tryTime*10) * time.Second) From 742a68b5c514e4cdcc834c7a7af9f2cd913515ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:50:49 +0800 Subject: [PATCH 09/43] perf: optimize communication exceptions --- event/manager.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/event/manager.go b/event/manager.go index 499acdc3dc..7664397407 100644 --- a/event/manager.go +++ b/event/manager.go @@ -20,6 +20,7 @@ package event import ( "fmt" + etcdutil "github.com/goodrain/rainbond/util/etcd" "io" "os" "strings" @@ -48,7 +49,7 @@ type Manager interface { // EventConfig event config struct type EventConfig struct { EventLogServers []string - //DiscoverArgs *etcdutil.ClientArgs + DiscoverArgs *etcdutil.ClientArgs } type manager struct { ctx context.Context From 057a9258c0fd801d50433107c363162a191af512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 16:56:02 +0800 Subject: [PATCH 10/43] perf: optimize communication exceptions --- worker/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/client/client.go b/worker/client/client.go index 917d15041c..b68f79b915 100644 --- a/worker/client/client.go +++ b/worker/client/client.go @@ -43,7 +43,7 @@ type AppRuntimeSyncClient struct { func NewClient(ctx context.Context, grpcServer string) (c *AppRuntimeSyncClient, err error) { var arsc AppRuntimeSyncClient arsc.ctx = ctx - + logrus.Infof("discover app runtime sync server address %s", grpcServer) arsc.cc, err = grpc.Dial(grpcServer, grpc.WithInsecure()) if err != nil { From 9d8d6a0693ce77a520c2e2ebc5707eefd3d58f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 17:02:34 +0800 Subject: [PATCH 11/43] perf: optimize communication exceptions --- cmd/api/option/option.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 0d7a200205..67d3f3b3e0 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -98,7 +98,6 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.WebsocketKeyFile, "ws-ssl-keyfile", "/etc/ssl/goodrain.com/goodrain.com.key", "websocket and fileserver ssl key file") fs.StringVar(&a.V1API, "v1-api", "127.0.0.1:8887", "the region v1 api") fs.StringSliceVar(&a.BuilderAPI, "builder-api", []string{"rbd-chaos:3228"}, "the builder api") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"127.0.0.1:6366"}, "event log server address. simple lb") fs.BoolVar(&a.StartRegionAPI, "start", false, "Whether to start region old api") fs.StringSliceVar(&a.EtcdEndpoint, "etcd", []string{"http://127.0.0.1:2379"}, "etcd server or proxy address") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "verify etcd certificates of TLS-enabled secure servers using this CA bundle") @@ -124,6 +123,7 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-worker server api") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") } From 7e601ec8a9cb3e55f29c6e6b48422042e01e42aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 17:15:57 +0800 Subject: [PATCH 12/43] perf: optimize communication exceptions --- worker/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/client/client.go b/worker/client/client.go index b68f79b915..598723d826 100644 --- a/worker/client/client.go +++ b/worker/client/client.go @@ -44,7 +44,7 @@ func NewClient(ctx context.Context, grpcServer string) (c *AppRuntimeSyncClient, var arsc AppRuntimeSyncClient arsc.ctx = ctx logrus.Infof("discover app runtime sync server address %s", grpcServer) - arsc.cc, err = grpc.Dial(grpcServer, grpc.WithInsecure()) + arsc.cc, err = grpc.Dial(grpcServer) if err != nil { return nil, err From aecd19367190c678fe980c144fddf836cbdb52d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 17:54:53 +0800 Subject: [PATCH 13/43] perf: optimize communication exceptions --- api/handler/handler.go | 12 ++++++------ pkg/component/etcd/etcdComponent.go | 4 ++-- pkg/component/grpc/grpcComponent.go | 4 ++-- pkg/component/hubregistry/registryComponent.go | 2 +- worker/client/client.go | 11 ++++++----- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/api/handler/handler.go b/api/handler/handler.go index ebbd750787..5617bcb9ef 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -38,12 +38,12 @@ func InitHandle(conf option.Config) error { statusCli := grpc.Default().StatusClient clientset := k8s.Default().Clientset rainbondClient := k8s.Default().RainbondClient - k8sClient := k8s.K8sClient().K8sClient - restconfig := k8s.K8sClient().RestConfig - dynamicClient := k8s.K8sClient().DynamicClient - gatewayClient := k8s.K8sClient().GatewayClient - kubevirtCli := k8s.K8sClient().KubevirtCli - mapper := k8s.K8sClient().Mapper + k8sClient := k8s.Default().K8sClient + restconfig := k8s.Default().RestConfig + dynamicClient := k8s.Default().DynamicClient + gatewayClient := k8s.Default().GatewayClient + kubevirtCli := k8s.Default().KubevirtCli + mapper := k8s.Default().Mapper registryCli := hubregistry.Default().RegistryCli mq := api_db.MQManager{ diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 79a704b156..7995cf7709 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -31,7 +31,7 @@ var ( defaultAotuSyncInterval = 10 * time.Second ) -func (e Component) Start(ctx context.Context, cfg *configs.Config) error { +func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { logrus.Info("start etcd client...") clientArgs := &etcdutil.ClientArgs{ Endpoints: cfg.APIConfig.EtcdEndpoint, @@ -84,5 +84,5 @@ func (e Component) Start(ctx context.Context, cfg *configs.Config) error { return nil } -func (e Component) CloseHandle() { +func (e *Component) CloseHandle() { } diff --git a/pkg/component/grpc/grpcComponent.go b/pkg/component/grpc/grpcComponent.go index 36d7f89f38..9c77a4d1bc 100644 --- a/pkg/component/grpc/grpcComponent.go +++ b/pkg/component/grpc/grpcComponent.go @@ -12,12 +12,12 @@ type Component struct { StatusClient *client.AppRuntimeSyncClient } -func (c Component) Start(ctx context.Context, cfg *configs.Config) (err error) { +func (c *Component) Start(ctx context.Context, cfg *configs.Config) (err error) { c.StatusClient, err = client.NewClient(ctx, cfg.APIConfig.RbdWorker) return err } -func (c Component) CloseHandle() { +func (c *Component) CloseHandle() { } func Grpc() *Component { diff --git a/pkg/component/hubregistry/registryComponent.go b/pkg/component/hubregistry/registryComponent.go index 9a1fbb6c93..2bfc354ef8 100644 --- a/pkg/component/hubregistry/registryComponent.go +++ b/pkg/component/hubregistry/registryComponent.go @@ -23,7 +23,7 @@ func HubRegistry() *RegistryComponent { return defaultRegistryComponent } -func (r RegistryComponent) Start(ctx context.Context, cfg *configs.Config) error { +func (r *RegistryComponent) Start(ctx context.Context, cfg *configs.Config) error { logrus.Infof("init hub registry...") var cluster rainbondv1alpha1.RainbondCluster diff --git a/worker/client/client.go b/worker/client/client.go index 598723d826..75bfaffa3d 100644 --- a/worker/client/client.go +++ b/worker/client/client.go @@ -41,16 +41,17 @@ type AppRuntimeSyncClient struct { // NewClient new client // ctx must be cancel where client not used func NewClient(ctx context.Context, grpcServer string) (c *AppRuntimeSyncClient, err error) { - var arsc AppRuntimeSyncClient - arsc.ctx = ctx + c = new(AppRuntimeSyncClient) + c.ctx = ctx logrus.Infof("discover app runtime sync server address %s", grpcServer) - arsc.cc, err = grpc.Dial(grpcServer) + c.cc, err = grpc.Dial(grpcServer, grpc.WithInsecure()) if err != nil { return nil, err } - arsc.AppRuntimeSyncClient = pb.NewAppRuntimeSyncClient(arsc.cc) - return &arsc, nil + c.AppRuntimeSyncClient = pb.NewAppRuntimeSyncClient(c.cc) + + return c, nil } // when watch occurred error,will exec this method From f379a9bfd066d9077595318d8f7da18c489233ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 18:08:10 +0800 Subject: [PATCH 14/43] perf: optimize communication exceptions --- pkg/component/grpc/grpcComponent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/component/grpc/grpcComponent.go b/pkg/component/grpc/grpcComponent.go index 9c77a4d1bc..439f32badc 100644 --- a/pkg/component/grpc/grpcComponent.go +++ b/pkg/component/grpc/grpcComponent.go @@ -22,7 +22,7 @@ func (c *Component) CloseHandle() { func Grpc() *Component { defaultGrpcComponent = &Component{} - return &Component{} + return defaultGrpcComponent } func Default() *Component { From 1e34ca769cc58a0584a29ba489fb6a79105f9384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 18:32:54 +0800 Subject: [PATCH 15/43] perf: optimize communication exceptions --- pkg/component/etcd/etcdComponent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 7995cf7709..56f78a2987 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -19,7 +19,7 @@ type Component struct { func Etcd() *Component { defaultEtcdComponent = &Component{} - return &Component{} + return defaultEtcdComponent } func Default() *Component { From ada3c8e4eacaa60280780f9eda179db0e0ddc388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 18:42:31 +0800 Subject: [PATCH 16/43] perf: optimize communication exceptions --- pkg/component/etcd/etcdComponent.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 56f78a2987..3dd5e489e2 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -75,6 +75,7 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { etcdClient, err = clientv3.New(config) if err == nil { e.EtcdClient = etcdClient + logrus.Infof("create etcd.v3 client success") return nil } logrus.Errorf("create etcd.v3 client failed, try time is %d,%s", 10, err.Error()) From 2912f59b412c776b75e7ba9ca9f6f72aec34ff59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 18:43:49 +0800 Subject: [PATCH 17/43] perf: optimize communication exceptions --- pkg/component/etcd/etcdComponent.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 3dd5e489e2..88e4a59311 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -69,12 +69,10 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { config.TLS = tlsConfig } gogo.Go(func(ctx context.Context) error { - var etcdClient *clientv3.Client var err error for { - etcdClient, err = clientv3.New(config) + e.EtcdClient, err = clientv3.New(config) if err == nil { - e.EtcdClient = etcdClient logrus.Infof("create etcd.v3 client success") return nil } From 9f85f719ccf62478e9fe9f9f1fe47eda4b87c18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Mon, 8 Jan 2024 19:05:03 +0800 Subject: [PATCH 18/43] perf: optimize communication exceptions --- pkg/component/etcd/etcdComponent.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 88e4a59311..abf16bcd89 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -8,6 +8,7 @@ import ( "github.com/goodrain/rainbond/pkg/gogo" etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/sirupsen/logrus" + "google.golang.org/grpc" "time" ) @@ -67,6 +68,8 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { return err } config.TLS = tlsConfig + config.DialOptions = []grpc.DialOption{grpc.WithInsecure()} + } gogo.Go(func(ctx context.Context) error { var err error @@ -80,6 +83,7 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { time.Sleep(10 * time.Second) } }) + time.Sleep(5 * time.Second) return nil } From 0f095dfd126b18a324aa20f4799150b6b1036d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 09:44:45 +0800 Subject: [PATCH 19/43] perf: optimize communication exceptions --- cmd/api/option/option.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 67d3f3b3e0..29f8d75df5 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -123,7 +123,7 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-worker server api") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6363"}, "event log server address. simple lb") } From 4b3258bad7ab0f4055de6dee0574e9c729befdee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 10:14:47 +0800 Subject: [PATCH 20/43] perf: optimize communication exceptions --- api/daemon/region_api.go | 65 ---------- api/server/api.go | 3 +- builder/build/code_build_test.go | 171 ------------------------- builder/build/dockerfile_build_test.go | 37 ------ builder/build/netcore_build_test.go | 51 -------- cmd/api/main.go | 25 +++- cmd/api/server/server.go | 46 ------- node/api/router/router.go | 5 +- pkg/component/core.go | 3 +- pkg/interceptors/http.go | 48 +++++++ util/comman_test.go | 6 - 11 files changed, 75 insertions(+), 385 deletions(-) delete mode 100644 api/daemon/region_api.go delete mode 100644 builder/build/code_build_test.go delete mode 100644 builder/build/dockerfile_build_test.go delete mode 100644 builder/build/netcore_build_test.go delete mode 100644 cmd/api/server/server.go create mode 100644 pkg/interceptors/http.go diff --git a/api/daemon/region_api.go b/api/daemon/region_api.go deleted file mode 100644 index cdeb27a325..0000000000 --- a/api/daemon/region_api.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package daemon - -import ( - "github.com/goodrain/rainbond/api/util" - "net/http" - "os" - "os/exec" - "time" - - "github.com/sirupsen/logrus" -) - -//StartRegionAPI 启动 -func StartRegionAPI(ch chan os.Signal) { - logrus.Info("old region api begin start..") - arg := []string{"region_api.wsgi", "-b=127.0.0.1:8887", "--max-requests=5000", "--reload", "--debug", "--workers=4", "--log-file", "-", "--access-logfile", "-", "--error-logfile", "-"} - cmd := exec.Command("gunicorn", arg...) - cmd.Stdin = os.Stdin - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - go func() { - if err := cmd.Start(); err != nil { - logrus.Error("start region old api error.", err.Error()) - } - tick := time.NewTicker(time.Second * 5) - select { - case si := <-ch: - cmd.Process.Signal(si) - return - case <-tick.C: - monitor() - } - }() - return -} -func monitor() { - response, err := http.Get("http://127.0.0.1:8887/monitor") - if err != nil { - logrus.Error("monitor region old api error.", err.Error()) - return - } - defer util.CloseResponse(response) - if response != nil && response.StatusCode/100 > 2 { - logrus.Errorf("monitor region old api error. response code is %s", response.Status) - } - -} diff --git a/api/server/api.go b/api/server/api.go index c05ab5574b..4825a4e507 100644 --- a/api/server/api.go +++ b/api/server/api.go @@ -23,6 +23,7 @@ import ( "crypto/tls" "crypto/x509" "github.com/coreos/etcd/clientv3" + "github.com/goodrain/rainbond/pkg/interceptors" "io/ioutil" "log" "net/http" @@ -105,7 +106,7 @@ func (m *Manager) SetMiddleware() { r.Use(middleware.DefaultLogger) } //Gracefully absorb panics and prints the stack trace - r.Use(middleware.Recoverer) + r.Use(interceptors.Recoverer) //request time out r.Use(middleware.Timeout(time.Second * 5)) //simple authz diff --git a/builder/build/code_build_test.go b/builder/build/code_build_test.go deleted file mode 100644 index b792359394..0000000000 --- a/builder/build/code_build_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package build - -import ( - "archive/tar" - "compress/gzip" - "context" - "fmt" - "io" - "os" - "strings" - "testing" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - jobc "github.com/goodrain/rainbond/builder/job" - "github.com/goodrain/rainbond/builder/parser/code" - "github.com/goodrain/rainbond/builder/sources" - "github.com/goodrain/rainbond/cmd/builder/option" - "github.com/goodrain/rainbond/event" - - etcdutil "github.com/goodrain/rainbond/util/etcd" - k8sutil "github.com/goodrain/rainbond/util/k8s" - - "k8s.io/client-go/kubernetes" -) - -func TestCreateJob(t *testing.T) { - conf := option.Config{ - EtcdEndPoints: []string{"192.168.2.203:2379"}, - MQAPI: "192.168.2.203:6300", - EventLogServers: []string{"192.168.2.203:6366"}, - RbdRepoName: "rbd-dns", - RbdNamespace: "rbd-system", - MysqlConnectionInfo: "EeM2oc:lee7OhQu@tcp(192.168.2.203:3306)/region", - } - event.NewManager(event.EventConfig{ - EventLogServers: conf.EventLogServers, - DiscoverArgs: &etcdutil.ClientArgs{Endpoints: conf.EtcdEndPoints}, - }) - restConfig, err := k8sutil.NewRestConfig("/Users/fanyangyang/Documents/company/goodrain/remote/192.168.2.206/admin.kubeconfig") - if err != nil { - t.Fatal(err) - } - clientset, err := kubernetes.NewForConfig(restConfig) - if err != nil { - t.Fatal(err) - } - dockerClient, err := client.NewEnvClient() - if err != nil { - t.Fatal("new docker error: ", err.Error()) - } - logger := event.GetManager().GetLogger("0000") - req := Request{ - ServerType: "git", - DockerClient: dockerClient, - KubeClient: clientset, - ServiceID: "d9b8d718510dc53118af1e1219e36d3a", - DeployVersion: "123", - TenantID: "7c89455140284fd7b263038b44dc65bc", - Lang: code.JavaMaven, - Runtime: "1.8", - Logger: logger, - } - req.BuildEnvs = map[string]string{ - "PROCFILE": "web: java $JAVA_OPTS -jar target/java-maven-demo-0.0.1.jar", - "PROC_ENV": `{"procfile": "", "dependencies": {}, "language": "Java-maven", "runtimes": "1.8"}`, - "RUNTIME": "1.8", - } - req.CacheDir = fmt.Sprintf("/cache/build/%s/cache/%s", req.TenantID, req.ServiceID) - req.TGZDir = fmt.Sprintf("/grdata/build/tenant/%s/slug/%s", req.TenantID, req.ServiceID) - req.SourceDir = fmt.Sprintf("/cache/source/build/%s/%s", req.TenantID, req.ServiceID) - sb := slugBuild{tgzDir: "string"} - if err := sb.runBuildJob(&req); err != nil { - t.Fatal(err) - } - fmt.Println("create job finished") - -} - -func Test1(t *testing.T) { - tarFile := "/opt/rainbond/pkg/rainbond-pkg-V5.2-dev.tgz" - srcFile, err := os.Open(tarFile) - if err != nil { - t.Fatal(err) - } - defer srcFile.Close() - gr, err := gzip.NewReader(srcFile) //handle gzip feature - if err != nil { - t.Fatal(err) - } - defer gr.Close() - tr := tar.NewReader(gr) // tar reader - now := time.Now() - for hdr, err := tr.Next(); err != io.EOF; hdr, err = tr.Next() { // next range tar info - if err != nil { - t.Fatal(err) - } - // 读取文件信息 - fi := hdr.FileInfo() - - if !strings.HasPrefix(fi.Name(), "._") && strings.HasSuffix(fi.Name(), ".tgz") { - t.Logf("name: %s, size: %d", fi.Name(), fi.Size()) - - } - } - t.Logf("cost: %d", time.Since(now)) -} - -func TestDockerClient(t *testing.T) { - dockerClient, err := client.NewEnvClient() - if err != nil { - t.Fatal("new docker error: ", err.Error()) - } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - containers, err := dockerClient.ContainerList(ctx, types.ContainerListOptions{}) - if err != nil { - t.Fatal(err) - } - for _, container := range containers { - t.Log("container id : ", container.ID) - } - // images, err := dockerClient.ImageList(ctx, types.ImageListOptions{}) - // for _, image := range images { - // t.Log("image is : ", image.ID) - // } -} - -func TestBuildFromOSS(t *testing.T) { - restConfig, err := k8sutil.NewRestConfig("/Users/barnett/.kube/config") - if err != nil { - t.Fatal(err) - } - os.Setenv("IMAGE_PULL_SECRET", "rbd-hub-credentials") - clientset, err := kubernetes.NewForConfig(restConfig) - if err != nil { - t.Fatal(err) - } - stop := make(chan struct{}) - if err := jobc.InitJobController("rbd-system", stop, clientset); err != nil { - t.Fatal(err) - } - logger := event.GetTestLogger() - req := &Request{ - ServerType: "oss", - RepositoryURL: "http://8081.gr021644.64q1jlfb.17f4cc.grapps.cn/artifactory/dev/java-war-demo-master.zip", - CodeSouceInfo: sources.CodeSourceInfo{ - User: "demo", - Password: "gr123465!", - }, - KubeClient: clientset, - Ctx: context.Background(), - ServiceID: "d9b8d718510dc53118af1e1219e36d3a", - DeployVersion: "123asdadsadsasdasd1", - TenantID: "7c89455140284fd7b263038b44dc65bc", - Lang: code.OSS, - Logger: logger, - GRDataPVCName: "rbd-cpt-grdata", - CachePVCName: "rbd-chaos-cache", - } - build, err := GetBuild(code.OSS) - if err != nil { - t.Fatal(err) - } - res, err := build.Build(req) - if err != nil { - t.Fatal(err) - } - t.Log(res.MediumPath) -} diff --git a/builder/build/dockerfile_build_test.go b/builder/build/dockerfile_build_test.go deleted file mode 100644 index be2165ec20..0000000000 --- a/builder/build/dockerfile_build_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// RAINBOND, Application Management Platform -// Copyright (C) 2014-2017 Goodrain Co., Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package build - -import ( - "testing" -) - -func TestGetARGs(t *testing.T) { - buildEnvs := make(map[string]string) - buildEnvs["ARG_TEST"] = "abcdefg" - buildEnvs["PROC_ENV"] = "{\"procfile\": \"\", \"dependencies\": {}, \"language\": \"dockerfile\", \"runtimes\": \"\"}" - - args := GetARGs(buildEnvs) - if v := buildEnvs["ARG_TEST"]; *args["TEST"] != v { - t.Errorf("Expected %s for arg[\"%s\"], but returned %s", buildEnvs["ARG_TEST"], "ARG_TEST", *args["TEST"]) - } - if procEnv := args["PROC_ENV"]; procEnv != nil { - t.Errorf("Expected nil for args[\"PROC_ENV\"], but returned %v", procEnv) - } -} diff --git a/builder/build/netcore_build_test.go b/builder/build/netcore_build_test.go deleted file mode 100644 index 116bc71727..0000000000 --- a/builder/build/netcore_build_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// RAINBOND, Application Management Platform -// Copyright (C) 2014-2017 Goodrain Co., Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package build - -import ( - "testing" - - "github.com/docker/docker/client" - "github.com/goodrain/rainbond/builder/parser/code" - "github.com/goodrain/rainbond/event" -) - -func TestBuildNetCore(t *testing.T) { - build, err := netcoreBuilder() - if err != nil { - t.Fatal(err) - } - dockerCli, _ := client.NewEnvClient() - req := &Request{ - SourceDir: "/Users/qingguo/goodrain/dotnet-docker/samples/aspnetapp/test", - CacheDir: "/Users/qingguo/goodrain/dotnet-docker/samples/aspnetapp/test/cache", - RepositoryURL: "https://github.com/dotnet/dotnet-docker.git", - ServiceAlias: "gr123456", - DeployVersion: "666666", - Commit: Commit{User: "barnett"}, - Lang: code.NetCore, - Logger: event.GetTestLogger(), - DockerClient: dockerCli, - } - res, err := build.Build(req) - if err != nil { - t.Fatal(err) - } - t.Log(*res) -} diff --git a/cmd/api/main.go b/cmd/api/main.go index 57b0d6532e..65d5105fb3 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -20,12 +20,15 @@ package main import ( - "fmt" + "context" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/pkg/component" + "github.com/goodrain/rainbond/pkg/rainbond" + "github.com/sirupsen/logrus" "os" "github.com/goodrain/rainbond/cmd" "github.com/goodrain/rainbond/cmd/api/option" - "github.com/goodrain/rainbond/cmd/api/server" "github.com/spf13/pflag" ) @@ -38,8 +41,20 @@ func main() { s.AddFlags(pflag.CommandLine) pflag.Parse() s.SetLog() - if err := server.Run(s); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) + err := rainbond.New(context.Background(), &configs.Config{ + AppName: "rbd-api", + APIConfig: s.Config, + }).Registry(component.Database()). + Registry(component.Grpc()). + Registry(component.Event()). + Registry(component.K8sClient()). + Registry(component.HubRegistry()). + Registry(component.Proxy()). + Registry(component.Etcd()). + Registry(component.Handler()). + Registry(component.Router()). + Start() + if err != nil { + logrus.Errorf("start rbd-api error %s", err.Error()) } } diff --git a/cmd/api/server/server.go b/cmd/api/server/server.go deleted file mode 100644 index 59a214d261..0000000000 --- a/cmd/api/server/server.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package server - -import ( - "context" - "github.com/goodrain/rainbond/cmd/api/option" - "github.com/goodrain/rainbond/config/configs" - "github.com/goodrain/rainbond/pkg/component" - "github.com/goodrain/rainbond/pkg/rainbond" -) - -// Run start run -func Run(s *option.APIServer) error { - cfg := &configs.Config{ - AppName: "rbd-api", - APIConfig: s.Config, - } - return rainbond.New(context.Background(), cfg). - Registry(component.Database()). - Registry(component.Grpc()). - Registry(component.Event()). - Registry(component.K8sClient()). - Registry(component.HubRegistry()). - Registry(component.Proxy()). - Registry(component.Etcd()). - Registry(component.Handler()). - Registry(component.Router()). - Start() -} diff --git a/node/api/router/router.go b/node/api/router/router.go index ddcddea754..f5e34895ce 100644 --- a/node/api/router/router.go +++ b/node/api/router/router.go @@ -19,6 +19,7 @@ package router import ( + "github.com/goodrain/rainbond/pkg/interceptors" "time" "github.com/sirupsen/logrus" @@ -30,7 +31,7 @@ import ( "github.com/go-chi/chi/middleware" ) -//Routers 路由 +// Routers 路由 func Routers(mode string) *chi.Mux { r := chi.NewRouter() r.Use(middleware.RequestID) //每个请求的上下文中注册一个id @@ -41,7 +42,7 @@ func Routers(mode string) *chi.Mux { logger.SetLevel(logrus.GetLevel()) r.Use(log.NewStructuredLogger(logger)) //Gracefully absorb panics and prints the stack trace - r.Use(middleware.Recoverer) + r.Use(interceptors.Recoverer) //request time out r.Use(middleware.Timeout(time.Second * 5)) r.Mount("/v1", DisconverRoutes()) diff --git a/pkg/component/core.go b/pkg/component/core.go index bbe7cf503b..36014314e3 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -75,6 +75,7 @@ func Handler() rainbond.FuncComponent { } } +// Router - func Router() rainbond.FuncComponent { return func(ctx context.Context, cfg *configs.Config) error { if err := controller.CreateV2RouterManager(cfg.APIConfig, grpc.Default().StatusClient); err != nil { @@ -85,12 +86,12 @@ func Router() rainbond.FuncComponent { if err := apiManager.Start(); err != nil { return err } - //defer apiManager.Stop() logrus.Info("api router is running...") return nil } } +// Proxy - func Proxy() rainbond.FuncComponent { return func(ctx context.Context, cfg *configs.Config) error { handler.InitProxy(cfg.APIConfig) diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go new file mode 100644 index 0000000000..6c81cea5b8 --- /dev/null +++ b/pkg/interceptors/http.go @@ -0,0 +1,48 @@ +package interceptors + +import ( + "fmt" + "github.com/go-chi/chi/middleware" + "github.com/goodrain/rainbond/pkg/component/etcd" + "net/http" + "runtime/debug" + "strings" +) + +func Recoverer(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + defer func() { + if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { + // Check if the panic is a nil pointer exception + if isNilPointerException(rvr) && etcd.Default().EtcdClient == nil { + w.WriteHeader(http.StatusServiceUnavailable) + return + } + + // Handle other types of panics or re-panic + logEntry := middleware.GetLogEntry(r) + if logEntry != nil { + logEntry.Panic(rvr, debug.Stack()) + } else { + middleware.PrintPrettyStack(rvr) + } + + w.WriteHeader(http.StatusInternalServerError) + } + }() + + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +// Check if the panic is a nil pointer exception +func isNilPointerException(p interface{}) bool { + if p == nil { + return false + } + + errMsg := fmt.Sprintf("%v", p) + return strings.Contains(errMsg, "runtime error: invalid memory address or nil pointer dereference") +} diff --git a/util/comman_test.go b/util/comman_test.go index 61a070d6aa..9a2206d9d5 100644 --- a/util/comman_test.go +++ b/util/comman_test.go @@ -58,12 +58,6 @@ func TestZip(t *testing.T) { } } -func TestUnzip(t *testing.T) { - if err := Unzip("/tmp/cache.zip", "/tmp/cache0"); err != nil { - t.Fatal(err) - } -} - func TestCreateVersionByTime(t *testing.T) { if re := CreateVersionByTime(); re != "" { t.Log(re) From f3888a046249e8c6bc3b17f7e3096470b7dfbc69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 10:22:32 +0800 Subject: [PATCH 21/43] perf: optimize communication exceptions --- pkg/interceptors/http.go | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index 6c81cea5b8..353e432b01 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -1,6 +1,7 @@ package interceptors import ( + "encoding/json" "fmt" "github.com/go-chi/chi/middleware" "github.com/goodrain/rainbond/pkg/component/etcd" @@ -9,13 +10,14 @@ import ( "strings" ) +// Recoverer - func Recoverer(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { defer func() { if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { // Check if the panic is a nil pointer exception - if isNilPointerException(rvr) && etcd.Default().EtcdClient == nil { - w.WriteHeader(http.StatusServiceUnavailable) + if isNilPointerException(rvr) { + handleServiceUnavailable(w, r) return } @@ -37,7 +39,7 @@ func Recoverer(next http.Handler) http.Handler { return http.HandlerFunc(fn) } -// Check if the panic is a nil pointer exception +// isNilPointerException Check if the panic is a nil pointer exception func isNilPointerException(p interface{}) bool { if p == nil { return false @@ -46,3 +48,33 @@ func isNilPointerException(p interface{}) bool { errMsg := fmt.Sprintf("%v", p) return strings.Contains(errMsg, "runtime error: invalid memory address or nil pointer dereference") } + +// handleServiceUnavailable - +func handleServiceUnavailable(w http.ResponseWriter, r *http.Request) { + // Additional information about why etcd service is not available + errorMessage := "部分服务不可用" + + if etcd.Default().EtcdClient == nil { + errorMessage = "Etcd 服务不可用" + } + + // Create a response JSON + response := map[string]interface{}{ + "error": errorMessage, + } + + // Convert the response to JSON + responseJSON, err := json.Marshal(response) + if err != nil { + // Handle JSON marshaling error + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + // Set appropriate headers + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusServiceUnavailable) + + // Write the JSON response to the client + _, _ = w.Write(responseJSON) +} From 9f3bf3688374db5b794b3835e73cc6edc566cb26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 10:47:03 +0800 Subject: [PATCH 22/43] perf: optimize communication exceptions --- api/handler/handler.go | 21 ++++------------ cmd/api/main.go | 4 ++++ pkg/component/core.go | 12 ++++++++++ pkg/component/mq/mqComponent.go | 31 ++++++++++++++++++++++++ pkg/component/prom/promComponent.go | 37 +++++++++++++++++++++++++++++ pkg/interceptors/http.go | 26 +++++++++++++------- 6 files changed, 106 insertions(+), 25 deletions(-) create mode 100644 pkg/component/mq/mqComponent.go create mode 100644 pkg/component/prom/promComponent.go diff --git a/api/handler/handler.go b/api/handler/handler.go index 5617bcb9ef..588f592336 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -19,8 +19,6 @@ package handler import ( - "github.com/goodrain/rainbond/api/client/prometheus" - api_db "github.com/goodrain/rainbond/api/db" "github.com/goodrain/rainbond/api/handler/group" "github.com/goodrain/rainbond/api/handler/share" "github.com/goodrain/rainbond/cmd/api/option" @@ -29,6 +27,8 @@ import ( "github.com/goodrain/rainbond/pkg/component/grpc" "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/k8s" + "github.com/goodrain/rainbond/pkg/component/mq" + "github.com/goodrain/rainbond/pkg/component/prom" "github.com/sirupsen/logrus" ) @@ -45,22 +45,9 @@ func InitHandle(conf option.Config) error { kubevirtCli := k8s.Default().KubevirtCli mapper := k8s.Default().Mapper registryCli := hubregistry.Default().RegistryCli + mqClient := mq.Default().MqClient + prometheusCli := prom.Default().PrometheusCli - mq := api_db.MQManager{ - DefaultServer: conf.MQAPI, - } - mqClient, errMQ := mq.NewMQManager() - if errMQ != nil { - logrus.Errorf("new MQ manager failed, %v", errMQ) - return errMQ - } - prometheusCli, err := prometheus.NewPrometheus(&prometheus.Options{ - Endpoint: conf.PrometheusEndpoint, - }) - if err != nil { - logrus.Errorf("new prometheus client failure, %v", err) - return err - } dbmanager := db.GetManager() defaultServieHandler = CreateManager(conf, mqClient, etcdcli, statusCli, prometheusCli, rainbondClient, clientset, kubevirtCli, dbmanager, registryCli) defaultPluginHandler = CreatePluginManager(mqClient) diff --git a/cmd/api/main.go b/cmd/api/main.go index 65d5105fb3..2ddbf1d35d 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -41,6 +41,8 @@ func main() { s.AddFlags(pflag.CommandLine) pflag.Parse() s.SetLog() + + // 启动 rbd-api err := rainbond.New(context.Background(), &configs.Config{ AppName: "rbd-api", APIConfig: s.Config, @@ -51,6 +53,8 @@ func main() { Registry(component.HubRegistry()). Registry(component.Proxy()). Registry(component.Etcd()). + Registry(component.MQ()). + Registry(component.Prometheus()). Registry(component.Handler()). Registry(component.Router()). Start() diff --git a/pkg/component/core.go b/pkg/component/core.go index 36014314e3..28d3198ce9 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -12,6 +12,8 @@ import ( "github.com/goodrain/rainbond/pkg/component/grpc" "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/k8s" + "github.com/goodrain/rainbond/pkg/component/mq" + "github.com/goodrain/rainbond/pkg/component/prom" "github.com/goodrain/rainbond/pkg/rainbond" "github.com/sirupsen/logrus" "time" @@ -37,6 +39,16 @@ func Etcd() rainbond.Component { return etcd.Etcd() } +// MQ - +func MQ() rainbond.Component { + return mq.MQ() +} + +// Prometheus - +func Prometheus() rainbond.Component { + return prom.Prometheus() +} + // Grpc - func Grpc() rainbond.Component { return grpc.Grpc() diff --git a/pkg/component/mq/mqComponent.go b/pkg/component/mq/mqComponent.go new file mode 100644 index 0000000000..7e47c00e7c --- /dev/null +++ b/pkg/component/mq/mqComponent.go @@ -0,0 +1,31 @@ +package mq + +import ( + "context" + "github.com/goodrain/rainbond/config/configs" + "github.com/goodrain/rainbond/mq/client" +) + +var defaultMqComponent *Component + +type Component struct { + MqClient client.MQClient +} + +func (c *Component) Start(ctx context.Context, cfg *configs.Config) error { + mqClient, err := client.NewMqClient(cfg.APIConfig.MQAPI) + c.MqClient = mqClient + return err +} + +func (c *Component) CloseHandle() { +} + +func MQ() *Component { + defaultMqComponent = &Component{} + return defaultMqComponent +} + +func Default() *Component { + return defaultMqComponent +} diff --git a/pkg/component/prom/promComponent.go b/pkg/component/prom/promComponent.go new file mode 100644 index 0000000000..8b526d5cca --- /dev/null +++ b/pkg/component/prom/promComponent.go @@ -0,0 +1,37 @@ +package prom + +import ( + "context" + "github.com/goodrain/rainbond/api/client/prometheus" + "github.com/goodrain/rainbond/config/configs" +) + +var defaultPromComponent *Component + +type Component struct { + PrometheusCli prometheus.Interface +} + +// Prometheus - +func Prometheus() *Component { + defaultPromComponent = &Component{} + return defaultPromComponent +} + +// Start - +func (c *Component) Start(ctx context.Context, cfg *configs.Config) error { + prometheusCli, err := prometheus.NewPrometheus(&prometheus.Options{ + Endpoint: cfg.APIConfig.PrometheusEndpoint, + }) + c.PrometheusCli = prometheusCli + return err +} + +// CloseHandle - +func (c *Component) CloseHandle() { +} + +// Default - +func Default() *Component { + return defaultPromComponent +} diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index 353e432b01..d4bf566a30 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -5,6 +5,10 @@ import ( "fmt" "github.com/go-chi/chi/middleware" "github.com/goodrain/rainbond/pkg/component/etcd" + "github.com/goodrain/rainbond/pkg/component/grpc" + "github.com/goodrain/rainbond/pkg/component/hubregistry" + "github.com/goodrain/rainbond/pkg/component/mq" + "github.com/goodrain/rainbond/pkg/component/prom" "net/http" "runtime/debug" "strings" @@ -15,12 +19,6 @@ func Recoverer(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { defer func() { if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { - // Check if the panic is a nil pointer exception - if isNilPointerException(rvr) { - handleServiceUnavailable(w, r) - return - } - // Handle other types of panics or re-panic logEntry := middleware.GetLogEntry(r) if logEntry != nil { @@ -28,8 +26,12 @@ func Recoverer(next http.Handler) http.Handler { } else { middleware.PrintPrettyStack(rvr) } - - w.WriteHeader(http.StatusInternalServerError) + // Check if the panic is a nil pointer exception + if isNilPointerException(rvr) { + handleServiceUnavailable(w, r) + } else { + w.WriteHeader(http.StatusInternalServerError) + } } }() @@ -56,6 +58,14 @@ func handleServiceUnavailable(w http.ResponseWriter, r *http.Request) { if etcd.Default().EtcdClient == nil { errorMessage = "Etcd 服务不可用" + } else if grpc.Default().StatusClient == nil { + errorMessage = "worker 服务不可用" + } else if hubregistry.Default().RegistryCli == nil { + errorMessage = "私有镜像仓库 服务不可用" + } else if mq.Default().MqClient == nil { + errorMessage = "mq 服务不可用" + } else if prom.Default().PrometheusCli == nil { + errorMessage = "prometheus 服务不可用" } // Create a response JSON From 26e1b07d6e4cdaea2f4eff57bcda6b573b0f7894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 10:54:36 +0800 Subject: [PATCH 23/43] perf: optimize communication exceptions --- pkg/component/etcd/etcdComponent.go | 14 +++++++------- pkg/component/grpc/grpcComponent.go | 5 +++++ pkg/component/hubregistry/registryComponent.go | 7 ++++++- pkg/component/mq/mqComponent.go | 5 +++++ pkg/component/prom/promComponent.go | 1 + pkg/interceptors/http.go | 2 +- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index abf16bcd89..6cef0f8f00 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -14,24 +14,23 @@ import ( var defaultEtcdComponent *Component +// Component - type Component struct { EtcdClient *clientv3.Client } +// Etcd - func Etcd() *Component { defaultEtcdComponent = &Component{} return defaultEtcdComponent } +// Default - func Default() *Component { return defaultEtcdComponent } -var ( - defaultDialTimeout = 5 * time.Second - defaultAotuSyncInterval = 10 * time.Second -) - +// Start - func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { logrus.Info("start etcd client...") clientArgs := &etcdutil.ClientArgs{ @@ -41,10 +40,10 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { KeyFile: cfg.APIConfig.EtcdKeyFile, } if clientArgs.DialTimeout <= 5 { - clientArgs.DialTimeout = defaultDialTimeout + clientArgs.DialTimeout = 5 * time.Second } if clientArgs.AutoSyncInterval <= 30 { - clientArgs.AutoSyncInterval = defaultAotuSyncInterval + clientArgs.AutoSyncInterval = 10 * time.Second } config := clientv3.Config{ @@ -87,5 +86,6 @@ func (e *Component) Start(ctx context.Context, cfg *configs.Config) error { return nil } +// CloseHandle - func (e *Component) CloseHandle() { } diff --git a/pkg/component/grpc/grpcComponent.go b/pkg/component/grpc/grpcComponent.go index 439f32badc..19b771945f 100644 --- a/pkg/component/grpc/grpcComponent.go +++ b/pkg/component/grpc/grpcComponent.go @@ -8,23 +8,28 @@ import ( var defaultGrpcComponent *Component +// Component - type Component struct { StatusClient *client.AppRuntimeSyncClient } +// Start - func (c *Component) Start(ctx context.Context, cfg *configs.Config) (err error) { c.StatusClient, err = client.NewClient(ctx, cfg.APIConfig.RbdWorker) return err } +// CloseHandle - func (c *Component) CloseHandle() { } +// Grpc - func Grpc() *Component { defaultGrpcComponent = &Component{} return defaultGrpcComponent } +// Default - func Default() *Component { return defaultGrpcComponent } diff --git a/pkg/component/hubregistry/registryComponent.go b/pkg/component/hubregistry/registryComponent.go index 2bfc354ef8..5d524b30fd 100644 --- a/pkg/component/hubregistry/registryComponent.go +++ b/pkg/component/hubregistry/registryComponent.go @@ -14,15 +14,18 @@ import ( var defaultRegistryComponent *RegistryComponent +// RegistryComponent - type RegistryComponent struct { RegistryCli *registry.Registry } +// HubRegistry - func HubRegistry() *RegistryComponent { defaultRegistryComponent = &RegistryComponent{} return defaultRegistryComponent } +// Start - func (r *RegistryComponent) Start(ctx context.Context, cfg *configs.Config) error { logrus.Infof("init hub registry...") var cluster rainbondv1alpha1.RainbondCluster @@ -46,10 +49,12 @@ func (r *RegistryComponent) Start(ctx context.Context, cfg *configs.Config) erro return err } -func (r RegistryComponent) CloseHandle() { +// CloseHandle - +func (r *RegistryComponent) CloseHandle() { } +// Default - func Default() *RegistryComponent { return defaultRegistryComponent } diff --git a/pkg/component/mq/mqComponent.go b/pkg/component/mq/mqComponent.go index 7e47c00e7c..1684d02f8e 100644 --- a/pkg/component/mq/mqComponent.go +++ b/pkg/component/mq/mqComponent.go @@ -8,24 +8,29 @@ import ( var defaultMqComponent *Component +// Component - type Component struct { MqClient client.MQClient } +// Start - func (c *Component) Start(ctx context.Context, cfg *configs.Config) error { mqClient, err := client.NewMqClient(cfg.APIConfig.MQAPI) c.MqClient = mqClient return err } +// CloseHandle - func (c *Component) CloseHandle() { } +// MQ - func MQ() *Component { defaultMqComponent = &Component{} return defaultMqComponent } +// Default - func Default() *Component { return defaultMqComponent } diff --git a/pkg/component/prom/promComponent.go b/pkg/component/prom/promComponent.go index 8b526d5cca..f9b5baf681 100644 --- a/pkg/component/prom/promComponent.go +++ b/pkg/component/prom/promComponent.go @@ -8,6 +8,7 @@ import ( var defaultPromComponent *Component +// Component - type Component struct { PrometheusCli prometheus.Interface } diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index d4bf566a30..c56f0af33f 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -48,7 +48,7 @@ func isNilPointerException(p interface{}) bool { } errMsg := fmt.Sprintf("%v", p) - return strings.Contains(errMsg, "runtime error: invalid memory address or nil pointer dereference") + return strings.Contains(errMsg, "runtime error: invalid memory address or nil pointer dereference") || strings.Contains(errMsg, "runtime error: slice bounds out of range") } // handleServiceUnavailable - From cc0d6085a37827ec3278cd958b2d854c78a26bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 10:59:34 +0800 Subject: [PATCH 24/43] perf: optimize communication exceptions --- api/handler/handler.go | 5 +++++ pkg/interceptors/http.go | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/api/handler/handler.go b/api/handler/handler.go index 588f592336..ac24ee2a20 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -34,6 +34,11 @@ import ( // InitHandle 初始化handle func InitHandle(conf option.Config) error { + + // 注意:以下 client 将不要再次通过参数形式传递 !!!直接在你想调用的地方调用即可 + // 注意:以下 client 将不要再次通过参数形式传递 !!!直接在你想调用的地方调用即可 + // 注意:以下 client 将不要再次通过参数形式传递 !!!直接在你想调用的地方调用即可 + etcdcli := etcd.Default().EtcdClient statusCli := grpc.Default().StatusClient clientset := k8s.Default().Clientset diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index c56f0af33f..84750bed5a 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -19,6 +19,12 @@ func Recoverer(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { defer func() { if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { + // Check if the panic is a nil pointer exception + if isNilPointerException(rvr) { + handleServiceUnavailable(w, r) + return + } + // Handle other types of panics or re-panic logEntry := middleware.GetLogEntry(r) if logEntry != nil { @@ -26,12 +32,8 @@ func Recoverer(next http.Handler) http.Handler { } else { middleware.PrintPrettyStack(rvr) } - // Check if the panic is a nil pointer exception - if isNilPointerException(rvr) { - handleServiceUnavailable(w, r) - } else { - w.WriteHeader(http.StatusInternalServerError) - } + w.WriteHeader(http.StatusInternalServerError) + } }() From 2717944f3d813387037e1e87b2146d4bc3610d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 11:11:57 +0800 Subject: [PATCH 25/43] perf: optimize communication exceptions --- cmd/mqcli/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/mqcli/main.go b/cmd/mqcli/main.go index d9d865ef7f..e2f7099e78 100644 --- a/cmd/mqcli/main.go +++ b/cmd/mqcli/main.go @@ -83,6 +83,7 @@ func main() { } +// AddFlags - func AddFlags(fs *pflag.FlagSet) { fs.StringVar(&server, "server", "127.0.0.1:6300", "mq server") fs.StringVar(&topic, "topic", "builder", "mq topic") From dbc11e4faf917fba58720dedf2e419ae763e5088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 11:13:02 +0800 Subject: [PATCH 26/43] perf: optimize communication exceptions --- config/configs/config.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/configs/config.go b/config/configs/config.go index 97783dd296..8964578205 100644 --- a/config/configs/config.go +++ b/config/configs/config.go @@ -2,8 +2,10 @@ package configs import "github.com/goodrain/rainbond/cmd/api/option" +// Env - type Env string +// Config - type Config struct { AppName string Version string From 99420e22f02675e997fbf02cc48d0ea9a8e23f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 11:30:02 +0800 Subject: [PATCH 27/43] perf: optimize communication exceptions --- pkg/interceptors/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index 84750bed5a..5d949a63e1 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -67,7 +67,7 @@ func handleServiceUnavailable(w http.ResponseWriter, r *http.Request) { } else if mq.Default().MqClient == nil { errorMessage = "mq 服务不可用" } else if prom.Default().PrometheusCli == nil { - errorMessage = "prometheus 服务不可用" + errorMessage = "monitor 服务不可用" } // Create a response JSON From bc90fe76d162d145b528d9568fc945ea498b3c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 11:39:37 +0800 Subject: [PATCH 28/43] perf: optimize communication exceptions --- pkg/interceptors/http.go | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index 5d949a63e1..565a16b5c8 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -3,14 +3,12 @@ package interceptors import ( "encoding/json" "fmt" - "github.com/go-chi/chi/middleware" "github.com/goodrain/rainbond/pkg/component/etcd" "github.com/goodrain/rainbond/pkg/component/grpc" "github.com/goodrain/rainbond/pkg/component/hubregistry" "github.com/goodrain/rainbond/pkg/component/mq" "github.com/goodrain/rainbond/pkg/component/prom" "net/http" - "runtime/debug" "strings" ) @@ -19,21 +17,7 @@ func Recoverer(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { defer func() { if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { - // Check if the panic is a nil pointer exception - if isNilPointerException(rvr) { - handleServiceUnavailable(w, r) - return - } - - // Handle other types of panics or re-panic - logEntry := middleware.GetLogEntry(r) - if logEntry != nil { - logEntry.Panic(rvr, debug.Stack()) - } else { - middleware.PrintPrettyStack(rvr) - } - w.WriteHeader(http.StatusInternalServerError) - + handleServiceUnavailable(w, r) } }() From 82aa86ed826515ead841dc1529743ddc6791ec17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 13:57:29 +0800 Subject: [PATCH 29/43] perf: optimize communication exceptions --- api/handler/service_check.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/handler/service_check.go b/api/handler/service_check.go index f4e3c65a4a..f3dbaf47fc 100644 --- a/api/handler/service_check.go +++ b/api/handler/service_check.go @@ -34,7 +34,7 @@ import ( "github.com/twinj/uuid" ) -//ServiceCheck check service build source +// ServiceCheck check service build source func (s *ServiceAction) ServiceCheck(scs *api_model.ServiceCheckStruct) (string, string, *util.APIHandleError) { checkUUID := uuid.NewV4().String() scs.Body.CheckUUID = checkUUID @@ -76,11 +76,11 @@ func maybeIsWindowsContainerImage(source string) bool { } -//GetServiceCheckInfo get application source detection information +// GetServiceCheckInfo get application source detection information func (s *ServiceAction) GetServiceCheckInfo(uuid string) (*exector.ServiceCheckResult, *util.APIHandleError) { k := fmt.Sprintf("/servicecheck/%s", uuid) var si exector.ServiceCheckResult - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() resp, err := s.EtcdCli.Get(ctx, k) if err != nil { From ba3a68202bf4b2d862a1883ecc7c3e776320c794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 13:58:47 +0800 Subject: [PATCH 30/43] perf: optimize communication exceptions --- api/handler/service_check.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/handler/service_check.go b/api/handler/service_check.go index f3dbaf47fc..95c7c9df24 100644 --- a/api/handler/service_check.go +++ b/api/handler/service_check.go @@ -85,7 +85,7 @@ func (s *ServiceAction) GetServiceCheckInfo(uuid string) (*exector.ServiceCheckR resp, err := s.EtcdCli.Get(ctx, k) if err != nil { logrus.Errorf("get etcd k %s error, %v", k, err) - return nil, util.CreateAPIHandleError(500, err) + return nil, util.CreateAPIHandleError(503, err) } if resp.Count == 0 { return &si, nil From b5eab523c0f98d8d08276a4020fcfbc35da50cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 15:08:26 +0800 Subject: [PATCH 31/43] perf: optimize communication exceptions --- api/handler/handler.go | 2 +- api/handler/registry_auth_secret_action.go | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/api/handler/handler.go b/api/handler/handler.go index ac24ee2a20..966bbcfdfd 100644 --- a/api/handler/handler.go +++ b/api/handler/handler.go @@ -81,7 +81,7 @@ func InitHandle(conf option.Config) error { defaultmonitorHandler = NewMonitorHandler(prometheusCli) defServiceEventHandler = NewServiceEventHandler() defApplicationHandler = NewApplicationHandler(statusCli, prometheusCli, rainbondClient, clientset, dynamicClient) - defRegistryAuthSecretHandler = CreateRegistryAuthSecretManager(dbmanager, mqClient, etcdcli) + defRegistryAuthSecretHandler = CreateRegistryAuthSecretManager(dbmanager, mqClient) defNodesHandler = NewNodesHandler(clientset, conf.RbdNamespace, restconfig, mapper, prometheusCli) return nil } diff --git a/api/handler/registry_auth_secret_action.go b/api/handler/registry_auth_secret_action.go index 74a43cb591..cd08902ba8 100644 --- a/api/handler/registry_auth_secret_action.go +++ b/api/handler/registry_auth_secret_action.go @@ -21,7 +21,6 @@ package handler import ( "fmt" - "github.com/coreos/etcd/clientv3" apimodel "github.com/goodrain/rainbond/api/model" "github.com/goodrain/rainbond/db" "github.com/goodrain/rainbond/mq/client" @@ -31,15 +30,13 @@ import ( type RegistryAuthSecretAction struct { dbmanager db.Manager mqclient client.MQClient - etcdCli *clientv3.Client } // CreateRegistryAuthSecretManager creates registry auth secret manager -func CreateRegistryAuthSecretManager(dbmanager db.Manager, mqclient client.MQClient, etcdCli *clientv3.Client) *RegistryAuthSecretAction { +func CreateRegistryAuthSecretManager(dbmanager db.Manager, mqclient client.MQClient) *RegistryAuthSecretAction { return &RegistryAuthSecretAction{ dbmanager: dbmanager, mqclient: mqclient, - etcdCli: etcdCli, } } From e07767fb1caaac6044944d40a0bacb39d1b1e21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 15:30:28 +0800 Subject: [PATCH 32/43] perf: optimize communication exceptions --- api/db/db.go | 49 ------------------------------- cmd/builder/server/server.go | 1 - cmd/node/server/server.go | 3 +- cmd/worker/server/server.go | 8 ----- event/manager.go | 9 ------ event/manager_test.go | 45 ---------------------------- node/core/service/node_service.go | 47 ++++++++++++----------------- 7 files changed, 20 insertions(+), 142 deletions(-) delete mode 100644 event/manager_test.go diff --git a/api/db/db.go b/api/db/db.go index ff164b117a..74cbf5d266 100644 --- a/api/db/db.go +++ b/api/db/db.go @@ -28,10 +28,7 @@ import ( "github.com/goodrain/rainbond/db" "github.com/goodrain/rainbond/db/config" dbModel "github.com/goodrain/rainbond/db/model" - "github.com/goodrain/rainbond/event" "github.com/goodrain/rainbond/mq/api/grpc/pb" - "github.com/goodrain/rainbond/mq/client" - etcdutil "github.com/goodrain/rainbond/util/etcd" "github.com/goodrain/rainbond/worker/discover/model" "github.com/jinzhu/gorm" "github.com/sirupsen/logrus" @@ -61,52 +58,6 @@ func CreateDBManager(conf option.Config) error { return nil } -// CreateEventManager create event manager -func CreateEventManager(conf option.Config) error { - var tryTime time.Duration - var err error - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: conf.EtcdEndpoint, - CaFile: conf.EtcdCaFile, - CertFile: conf.EtcdCertFile, - KeyFile: conf.EtcdKeyFile, - } - for tryTime < 4 { - tryTime++ - if err = event.NewManager(event.EventConfig{ - EventLogServers: conf.EventLogServers, - DiscoverArgs: etcdClientArgs, - }); err != nil { - logrus.Errorf("get event manager failed, try time is %v,%s", tryTime, err.Error()) - time.Sleep((5 + tryTime*10) * time.Second) - } else { - break - } - } - - if err != nil { - logrus.Errorf("get event manager failed. %v", err.Error()) - return err - } - logrus.Debugf("init event manager success") - return nil -} - -// MQManager mq manager -type MQManager struct { - DefaultServer string -} - -// NewMQManager new mq manager -func (m *MQManager) NewMQManager() (client.MQClient, error) { - client, err := client.NewMqClient(m.DefaultServer) - if err != nil { - logrus.Errorf("new mq manager error, %v", err) - return client, err - } - return client, nil -} - // TaskStruct task struct type TaskStruct struct { TaskType string diff --git a/cmd/builder/server/server.go b/cmd/builder/server/server.go index 917cb158d8..cd87f7a397 100644 --- a/cmd/builder/server/server.go +++ b/cmd/builder/server/server.go @@ -67,7 +67,6 @@ func Run(s *option.Builder) error { } if err := event.NewManager(event.EventConfig{ EventLogServers: s.Config.EventLogServers, - DiscoverArgs: etcdClientArgs, }); err != nil { return err } diff --git a/cmd/node/server/server.go b/cmd/node/server/server.go index dfc8921f67..ea9dd3e53c 100644 --- a/cmd/node/server/server.go +++ b/cmd/node/server/server.go @@ -44,7 +44,7 @@ import ( "k8s.io/client-go/kubernetes" ) -//Run start run +// Run start run func Run(cfg *option.Conf) error { var stoped = make(chan struct{}) stopfunc := func() error { @@ -88,7 +88,6 @@ func Run(cfg *option.Conf) error { err = eventLog.NewManager(eventLog.EventConfig{ EventLogServers: cfg.EventLogServer, - DiscoverArgs: etcdClientArgs, }) if err != nil { logrus.Errorf("error creating eventlog manager") diff --git a/cmd/worker/server/server.go b/cmd/worker/server/server.go index a4c500d6d3..aba1405310 100644 --- a/cmd/worker/server/server.go +++ b/cmd/worker/server/server.go @@ -32,7 +32,6 @@ import ( "github.com/goodrain/rainbond/event" "github.com/goodrain/rainbond/pkg/common" "github.com/goodrain/rainbond/pkg/generated/clientset/versioned" - etcdutil "github.com/goodrain/rainbond/util/etcd" k8sutil "github.com/goodrain/rainbond/util/k8s" "github.com/goodrain/rainbond/worker/appm/componentdefinition" "github.com/goodrain/rainbond/worker/appm/controller" @@ -62,15 +61,8 @@ func Run(s *option.Worker) error { return err } defer db.CloseManager() - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: s.Config.EtcdEndPoints, - CaFile: s.Config.EtcdCaFile, - CertFile: s.Config.EtcdCertFile, - KeyFile: s.Config.EtcdKeyFile, - } if err := event.NewManager(event.EventConfig{ EventLogServers: s.Config.EventLogServers, - DiscoverArgs: etcdClientArgs, }); err != nil { return err } diff --git a/event/manager.go b/event/manager.go index 7664397407..7f64b51d7c 100644 --- a/event/manager.go +++ b/event/manager.go @@ -20,7 +20,6 @@ package event import ( "fmt" - etcdutil "github.com/goodrain/rainbond/util/etcd" "io" "os" "strings" @@ -49,7 +48,6 @@ type Manager interface { // EventConfig event config struct type EventConfig struct { EventLogServers []string - DiscoverArgs *etcdutil.ClientArgs } type manager struct { ctx context.Context @@ -76,13 +74,6 @@ const ( // NewManager 创建manager func NewManager(conf EventConfig) error { - //dis, err := discover.GetDiscover(config.DiscoverConfig{EtcdClientArgs: conf.DiscoverArgs}) - //if err != nil { - // logrus.Error("create discover manager error.", err.Error()) - // if len(conf.EventLogServers) < 1 { - // return err - // } - //} ctx, cancel := context.WithCancel(context.Background()) defaultManager = &manager{ ctx: ctx, diff --git a/event/manager_test.go b/event/manager_test.go deleted file mode 100644 index 69857ebe03..0000000000 --- a/event/manager_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package event - -import ( - "testing" - "time" - - etcdutil "github.com/goodrain/rainbond/util/etcd" -) - -func TestLogger(t *testing.T) { - err := NewManager(EventConfig{ - EventLogServers: []string{"192.168.195.1:6366"}, - DiscoverArgs: &etcdutil.ClientArgs{Endpoints: []string{"192.168.195.1:2379"}}, - }) - if err != nil { - t.Fatal(err) - } - defer GetManager().Close() - time.Sleep(time.Second * 3) - for i := 0; i < 500; i++ { - GetManager().GetLogger("qwdawdasdasasfafa").Info("hello word", nil) - GetManager().GetLogger("asdasdasdasdads").Debug("hello word", nil) - GetManager().GetLogger("1234124124124").Error("hello word", nil) - time.Sleep(time.Millisecond * 1) - } - select {} -} diff --git a/node/core/service/node_service.go b/node/core/service/node_service.go index 5acb341582..87d9bff2c8 100644 --- a/node/core/service/node_service.go +++ b/node/core/service/node_service.go @@ -35,31 +35,22 @@ import ( "github.com/goodrain/rainbond/node/utils" "github.com/goodrain/rainbond/util" ansibleUtil "github.com/goodrain/rainbond/util/ansible" - etcdutil "github.com/goodrain/rainbond/util/etcd" licutil "github.com/goodrain/rainbond/util/license" "github.com/sirupsen/logrus" "github.com/twinj/uuid" ) -//NodeService node service +// NodeService node service type NodeService struct { c *option.Conf nodecluster *node.Cluster kubecli kubecache.KubeClient } -//CreateNodeService create +// CreateNodeService create func CreateNodeService(c *option.Conf, nodecluster *node.Cluster, kubecli kubecache.KubeClient) *NodeService { - etcdClientArgs := &etcdutil.ClientArgs{ - Endpoints: c.EtcdEndpoints, - CaFile: c.EtcdCaFile, - CertFile: c.EtcdCertFile, - KeyFile: c.EtcdKeyFile, - DialTimeout: c.EtcdDialTimeout, - } if err := event.NewManager(event.EventConfig{ EventLogServers: c.EventLogServer, - DiscoverArgs: etcdClientArgs, }); err != nil { logrus.Errorf("create event manager faliure") } @@ -70,7 +61,7 @@ func CreateNodeService(c *option.Conf, nodecluster *node.Cluster, kubecli kubeca } } -//AddNode add node +// AddNode add node func (n *NodeService) AddNode(node *client.APIHostNode) (*client.HostNode, *utils.APIHandleError) { if n.nodecluster == nil { return nil, utils.CreateAPIHandleError(400, fmt.Errorf("this node can not support this api")) @@ -108,7 +99,7 @@ func (n *NodeService) AddNode(node *client.APIHostNode) (*client.HostNode, *util return rbnode, nil } -//InstallNode install node +// InstallNode install node func (n *NodeService) InstallNode(node *client.HostNode) *utils.APIHandleError { node.Status = client.Installing node.NodeStatus.Status = client.Installing @@ -153,7 +144,7 @@ func (n *NodeService) writeHostsFile() error { return nil } -//UpdateNodeStatus update node status +// UpdateNodeStatus update node status func (n *NodeService) UpdateNodeStatus(nodeID, status string) *utils.APIHandleError { node := n.nodecluster.GetNode(nodeID) if node == nil { @@ -168,7 +159,7 @@ func (n *NodeService) UpdateNodeStatus(nodeID, status string) *utils.APIHandleEr return nil } -//AsynchronousInstall AsynchronousInstall +// AsynchronousInstall AsynchronousInstall func (n *NodeService) AsynchronousInstall(node *client.HostNode, eventID string) { // write ansible hosts file err := n.writeHostsFile() @@ -206,8 +197,8 @@ func (n *NodeService) AsynchronousInstall(node *client.HostNode, eventID string) logrus.Infof("Install node %s successful", node.ID) } -//DeleteNode delete node -//only node status is offline and node can be deleted +// DeleteNode delete node +// only node status is offline and node can be deleted func (n *NodeService) DeleteNode(nodeID string) *utils.APIHandleError { node := n.nodecluster.GetNode(nodeID) if node == nil { @@ -224,7 +215,7 @@ func (n *NodeService) DeleteNode(nodeID string) *utils.APIHandleError { return nil } -//GetNode get node info +// GetNode get node info func (n *NodeService) GetNode(nodeID string) (*client.HostNode, *utils.APIHandleError) { node := n.nodecluster.GetNode(nodeID) if node == nil { @@ -233,7 +224,7 @@ func (n *NodeService) GetNode(nodeID string) (*client.HostNode, *utils.APIHandle return node, nil } -//GetAllNode get all node +// GetAllNode get all node func (n *NodeService) GetAllNode() ([]*client.HostNode, *utils.APIHandleError) { if n.nodecluster == nil { return nil, utils.CreateAPIHandleError(400, fmt.Errorf("this node can not support this api")) @@ -243,7 +234,7 @@ func (n *NodeService) GetAllNode() ([]*client.HostNode, *utils.APIHandleError) { return nodes, nil } -//GetServicesHealthy get service health +// GetServicesHealthy get service health func (n *NodeService) GetServicesHealthy() (map[string][]map[string]string, *utils.APIHandleError) { if n.nodecluster == nil { return nil, utils.CreateAPIHandleError(400, fmt.Errorf("this node can not support this api")) @@ -266,7 +257,7 @@ func (n *NodeService) GetServicesHealthy() (map[string][]map[string]string, *uti return StatusMap, nil } -//CordonNode set node is unscheduler +// CordonNode set node is unscheduler func (n *NodeService) CordonNode(nodeID string, unschedulable bool) *utils.APIHandleError { hostNode, apierr := n.GetNode(nodeID) if apierr != nil { @@ -302,7 +293,7 @@ func (n *NodeService) GetNodeLabels(nodeID string) (*model.LabelsResp, *utils.AP return labels, nil } -//PutNodeLabel update node label +// PutNodeLabel update node label func (n *NodeService) PutNodeLabel(nodeID string, labels map[string]string) (map[string]string, *utils.APIHandleError) { hostNode, apierr := n.GetNode(nodeID) if apierr != nil { @@ -327,7 +318,7 @@ func (n *NodeService) PutNodeLabel(nodeID string, labels map[string]string) (map return hostNode.CustomLabels, nil } -//DeleteNodeLabel delete node label +// DeleteNodeLabel delete node label func (n *NodeService) DeleteNodeLabel(nodeID string, labels map[string]string) (map[string]string, *utils.APIHandleError) { hostNode, apierr := n.GetNode(nodeID) if apierr != nil { @@ -353,7 +344,7 @@ func (n *NodeService) DeleteNodeLabel(nodeID string, labels map[string]string) ( return hostNode.CustomLabels, nil } -//DownNode down node +// DownNode down node func (n *NodeService) DownNode(nodeID string) (*client.HostNode, *utils.APIHandleError) { hostNode, apierr := n.GetNode(nodeID) if apierr != nil { @@ -373,7 +364,7 @@ func (n *NodeService) DownNode(nodeID string) (*client.HostNode, *utils.APIHandl return hostNode, nil } -//UpNode up node +// UpNode up node func (n *NodeService) UpNode(nodeID string) (*client.HostNode, *utils.APIHandleError) { hostNode, apierr := n.GetNode(nodeID) if apierr != nil { @@ -396,7 +387,7 @@ func (n *NodeService) UpNode(nodeID string) (*client.HostNode, *utils.APIHandleE return hostNode, nil } -//GetNodeResource get node resource +// GetNodeResource get node resource func (n *NodeService) GetNodeResource(nodeUID string) (*model.NodePodResource, *utils.APIHandleError) { node, err := n.GetNode(nodeUID) if err != nil { @@ -448,13 +439,13 @@ func (n *NodeService) GetNodeResource(nodeUID string) (*model.NodePodResource, * return &res, nil } -//CheckNode check node install status +// CheckNode check node install status func (n *NodeService) CheckNode(nodeUID string) (*model.InstallStatus, *utils.APIHandleError) { return nil, nil } -//DeleteNodeCondition delete node condition +// DeleteNodeCondition delete node condition func (n *NodeService) DeleteNodeCondition(nodeUID string, condition client.NodeConditionType) (*client.HostNode, *utils.APIHandleError) { node, err := n.GetNode(nodeUID) if err != nil { From 0144a36305eb04ad0040af6e5106431c14e79868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 15:43:17 +0800 Subject: [PATCH 33/43] perf: optimize communication exceptions --- node/core/store/client.go | 1 - 1 file changed, 1 deletion(-) diff --git a/node/core/store/client.go b/node/core/store/client.go index d15159a2b9..5591e04ec8 100644 --- a/node/core/store/client.go +++ b/node/core/store/client.go @@ -35,7 +35,6 @@ import ( ) var ( - //DefalutClient etcd client DefalutClient *Client ) From 4a74ebd5b6d138ea5cd961f52ff71a16e8a82a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 15:45:47 +0800 Subject: [PATCH 34/43] perf: optimize communication exceptions --- node/core/store/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/node/core/store/client.go b/node/core/store/client.go index 5591e04ec8..7d11721146 100644 --- a/node/core/store/client.go +++ b/node/core/store/client.go @@ -65,8 +65,7 @@ func NewClient(ctx context.Context, cfg *conf.Conf, etcdClientArgs *etcdutil.Cli // ErrKeyExists key exist error var ErrKeyExists = errors.New("key already exists") -// Post attempts to create the given key, only succeeding if the key did -// not yet exist. +// Post attempts to create the given key, only succeeding if the key did not yet exist. func (c *Client) Post(key, val string, opts ...client.OpOption) (*client.PutResponse, error) { ctx, cancel := context.WithTimeout(context.Background(), c.reqTimeout) defer cancel() From de5edea6a24343f1a34e5a7bf728980e6ee77bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 16:31:54 +0800 Subject: [PATCH 35/43] perf: optimize communication exceptions --- api/controller/websocket.go | 2 +- cmd/builder/option/option.go | 8 +++++--- cmd/gateway/option/option.go | 8 +++++--- event/manager.go | 36 +++++++++++++++++++++++------------- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/api/controller/websocket.go b/api/controller/websocket.go index aaeaf59fe8..5cb27a11f6 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -37,7 +37,7 @@ type DockerConsole struct { socketproxy proxy.Proxy } -var defaultDockerConsoleEndpoints = []string{"127.0.0.1:7171"} +var defaultDockerConsoleEndpoints = []string{"rbd-webcli:7171"} var defaultEventLogEndpoints = []string{"local=>rbd-eventlog:6363"} var dockerConsole *DockerConsole diff --git a/cmd/builder/option/option.go b/cmd/builder/option/option.go index 2c57dbca85..0502cc181b 100644 --- a/cmd/builder/option/option.go +++ b/cmd/builder/option/option.go @@ -80,7 +80,6 @@ func NewBuilder() *Builder { // AddFlags config func (a *Builder) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogLevel, "log-level", "info", "the builder log level") - fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://127.0.0.1:2379"}, "etcd v3 cluster endpoints.") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "") fs.StringVar(&a.EtcdKeyFile, "etcd-key", "", "") @@ -90,11 +89,9 @@ func (a *Builder) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.BuildKitImage, "buildkit-image", "registry.cn-hangzhou.aliyuncs.com/goodrain/buildkit:v0.12.0", "buildkit image version") fs.StringVar(&a.DBType, "db-type", "mysql", "db type mysql or etcd") fs.StringVar(&a.MysqlConnectionInfo, "mysql", "root:admin@tcp(127.0.0.1:3306)/region", "mysql db connection info") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"127.0.0.1:6366"}, "event log server address. simple lb") fs.StringVar(&a.KubeConfig, "kube-config", "", "kubernetes api server config file") fs.IntVar(&a.MaxTasks, "max-tasks", 50, "Maximum number of simultaneous build tasks") fs.IntVar(&a.APIPort, "api-port", 3228, "the port for api server") - fs.StringVar(&a.MQAPI, "mq-api", "127.0.0.1:6300", "acp_mq api") fs.StringVar(&a.RunMode, "run", "sync", "sync data when worker start") fs.StringVar(&a.DockerEndpoint, "dockerd", "127.0.0.1:2376", "dockerd endpoint") fs.StringVar(&a.HostIP, "hostIP", "", "Current node Intranet IP") @@ -114,6 +111,11 @@ func (a *Builder) AddFlags(fs *pflag.FlagSet) { fs.IntVar(&a.KeepCount, "keep-count", 5, "default number of reserved copies for images") fs.IntVar(&a.CleanInterval, "clean-interval", 60, "clean image interval,default 60 minute") fs.StringVar(&a.BRVersion, "br-version", "v5.16.0-release", "builder and runner version") + + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6363"}, "event log server address. simple lb") + fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "acp_mq api") + fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd v3 cluster endpoints.") + } // SetLog 设置log diff --git a/cmd/gateway/option/option.go b/cmd/gateway/option/option.go index 27a9d699c2..ad4cedf7ad 100644 --- a/cmd/gateway/option/option.go +++ b/cmd/gateway/option/option.go @@ -41,7 +41,7 @@ func NewGWServer() *GWServer { return &GWServer{} } -//Config contains all configuration +// Config contains all configuration type Config struct { K8SConfPath string EtcdEndpoint []string @@ -110,7 +110,6 @@ func (g *GWServer) AddFlags(fs *pflag.FlagSet) { fs.IntVar(&g.KeepaliveTimeout, "keepalive-timeout", 30, "Timeout for keep-alive connections. Server will close connections after this time.") fs.DurationVar(&g.ResyncPeriod, "resync-period", 10*time.Minute, "the default resync period for any handlers added via AddEventHandler and how frequently the listener wants a full resync from the shared informer") // etcd - fs.StringSliceVar(&g.EtcdEndpoint, "etcd-endpoints", []string{"http://127.0.0.1:2379"}, "etcd cluster endpoints.") fs.IntVar(&g.EtcdTimeout, "etcd-timeout", 10, "etcd http timeout seconds") fs.StringVar(&g.EtcdCaFile, "etcd-ca", "", "etcd tls ca file ") fs.StringVar(&g.EtcdCertFile, "etcd-cert", "", "etcd tls cert file") @@ -126,6 +125,9 @@ func (g *GWServer) AddFlags(fs *pflag.FlagSet) { fs.Uint64Var(&g.ShareMemory, "max-config-share-memory", 128, "Nginx maximum Shared memory size, which should be increased for larger clusters.") fs.Float32Var(&g.SyncRateLimit, "sync-rate-limit", 0.3, "Define the sync frequency upper limit") fs.StringArrayVar(&g.IgnoreInterface, "ignore-interface", []string{"docker0", "tunl0", "cni0", "kube-ipvs0", "flannel"}, "The network interface name that ignore by gateway") + + fs.StringSliceVar(&g.EtcdEndpoint, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd cluster endpoints.") + } // SetLog sets log @@ -138,7 +140,7 @@ func (g *GWServer) SetLog() { logrus.SetLevel(level) } -//CheckConfig check config +// CheckConfig check config func (g *GWServer) CheckConfig() error { if g.NodeName == "" { g.NodeName, _ = os.Hostname() diff --git a/event/manager.go b/event/manager.go index 7f64b51d7c..179b392ab1 100644 --- a/event/manager.go +++ b/event/manager.go @@ -59,7 +59,6 @@ type manager struct { lock sync.Mutex eventServer []string abnormalServer map[string]string - //dis discover.Discover } var defaultManager Manager @@ -76,13 +75,12 @@ const ( func NewManager(conf EventConfig) error { ctx, cancel := context.WithCancel(context.Background()) defaultManager = &manager{ - ctx: ctx, - cancel: cancel, - config: conf, - loggers: make(map[string]Logger, 1024), - handles: make(map[string]handle), - eventServer: conf.EventLogServers, - //dis: dis, + ctx: ctx, + cancel: cancel, + config: conf, + loggers: make(map[string]Logger, 1024), + handles: make(map[string]handle), + eventServer: conf.EventLogServers, abnormalServer: make(map[string]string), } return defaultManager.Start() @@ -105,6 +103,7 @@ func CloseManager() { } } +// Start - func (m *manager) Start() error { m.lock.Lock() defer m.lock.Unlock() @@ -126,6 +125,7 @@ func (m *manager) Start() error { return nil } +// UpdateEndpoints - func (m *manager) UpdateEndpoints(endpoints ...*config.Endpoint) { m.lock.Lock() defer m.lock.Unlock() @@ -167,17 +167,18 @@ func (m *manager) UpdateEndpoints(endpoints ...*config.Endpoint) { logrus.Debugf("update event handle core success,handle core count:%d, event server count:%d", len(m.handles), len(m.eventServer)) } +// Error - func (m *manager) Error(err error) { } + +// Close - func (m *manager) Close() error { m.cancel() - //if m.dis != nil { - // m.dis.Stop() - //} return nil } +// GC - func (m *manager) GC() { util.IntermittentExec(m.ctx, func() { m.lock.Lock() @@ -198,8 +199,7 @@ func (m *manager) GC() { }, time.Second*20) } -// GetLogger -// 使用完成后必须调用ReleaseLogger方法 +// GetLogger 使用完成后必须调用ReleaseLogger方法 func (m *manager) GetLogger(eventID string) Logger { m.lock.Lock() defer m.lock.Unlock() @@ -214,6 +214,7 @@ func (m *manager) GetLogger(eventID string) Logger { return l } +// ReleaseLogger 释放logger func (m *manager) ReleaseLogger(l Logger) { m.lock.Lock() defer m.lock.Unlock() @@ -230,6 +231,7 @@ type handle struct { manager *manager } +// DiscardedLoggerChan - func (m *manager) DiscardedLoggerChan(cacheChan chan []byte) { m.lock.Lock() defer m.lock.Unlock() @@ -275,6 +277,8 @@ func (m *manager) getLBChan() chan []byte { } return nil } + +// RemoveHandle - func (m *manager) RemoveHandle(server string) { m.lock.Lock() defer m.lock.Unlock() @@ -282,6 +286,8 @@ func (m *manager) RemoveHandle(server string) { delete(m.handles, server) } } + +// HandleLog - func (m *handle) HandleLog() error { defer m.manager.RemoveHandle(m.server) return util.Exec(m.ctx, func() error { @@ -322,6 +328,7 @@ func (m *handle) HandleLog() error { }, time.Second*3) } +// Stop - func (m *handle) Stop() { close(m.stop) } @@ -353,9 +360,12 @@ type logger struct { createTime time.Time } +// GetChan - func (l *logger) GetChan() chan []byte { return l.sendChan } + +// SetChan - func (l *logger) SetChan(ch chan []byte) { l.sendChan = ch } From a5ab8815211691eb61fff25e08ec992b33f545c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 16:32:16 +0800 Subject: [PATCH 36/43] perf: optimize communication exceptions --- release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.sh b/release.sh index bac4b58bea..4623b27fcb 100755 --- a/release.sh +++ b/release.sh @@ -93,7 +93,7 @@ build::binary() { if [ ! $(which upx) ]; then sudo apt-get install -y upx fi - sudo upx --best --lzma "${OUTPATH}" +# sudo upx --best --lzma "${OUTPATH}" # elif [ "$GOARCH" = "arm64" ]; then # wget https://rainbond-pkg.oss-cn-shanghai.aliyuncs.com/upx/upx-4.0.2-arm64_linux/upx # chmod +x upx From 39d22ce559382efe5ebe6e7fc6821be2ae99ec10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 16:59:39 +0800 Subject: [PATCH 37/43] perf: optimize communication exceptions --- cmd/api/option/option.go | 2 +- cmd/builder/option/option.go | 2 +- cmd/eventlog/server/server.go | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 29f8d75df5..67d3f3b3e0 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -123,7 +123,7 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-worker server api") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6363"}, "event log server address. simple lb") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") } diff --git a/cmd/builder/option/option.go b/cmd/builder/option/option.go index 0502cc181b..e6f349c7bb 100644 --- a/cmd/builder/option/option.go +++ b/cmd/builder/option/option.go @@ -112,7 +112,7 @@ func (a *Builder) AddFlags(fs *pflag.FlagSet) { fs.IntVar(&a.CleanInterval, "clean-interval", 60, "clean image interval,default 60 minute") fs.StringVar(&a.BRVersion, "br-version", "v5.16.0-release", "builder and runner version") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6363"}, "event log server address. simple lb") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "acp_mq api") fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd v3 cluster endpoints.") diff --git a/cmd/eventlog/server/server.go b/cmd/eventlog/server/server.go index d71d09951b..7c07a49fd7 100644 --- a/cmd/eventlog/server/server.go +++ b/cmd/eventlog/server/server.go @@ -56,7 +56,7 @@ func NewLogServer() *LogServer { } } -//AddFlags 添加参数 +// AddFlags 添加参数 func (s *LogServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&s.Conf.Entry.EventLogServer.BindIP, "eventlog.bind.ip", "0.0.0.0", "Collect the log service to listen the IP") fs.IntVar(&s.Conf.Entry.EventLogServer.BindPort, "eventlog.bind.port", 6366, "Collect the log service to listen the Port") @@ -71,7 +71,7 @@ func (s *LogServer) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&s.Conf.ClusterMode, "cluster", true, "Whether open cluster mode") fs.StringVar(&s.Conf.Cluster.Discover.InstanceIP, "cluster.instance.ip", "", "The current instance IP in the cluster can be communications.") fs.StringVar(&s.Conf.Cluster.Discover.Type, "discover.type", "etcd", "the instance in cluster auto discover way.") - fs.StringSliceVar(&s.Conf.Cluster.Discover.EtcdAddr, "discover.etcd.addr", []string{"http://127.0.0.1:2379"}, "set all etcd server addr in cluster for message instence auto discover.") + fs.StringSliceVar(&s.Conf.Cluster.Discover.EtcdAddr, "discover.etcd.addr", []string{"http://rbd-etcd:2379"}, "set all etcd server addr in cluster for message instence auto discover.") fs.StringVar(&s.Conf.Cluster.Discover.EtcdCaFile, "discover.etcd.ca", "", "verify etcd certificates of TLS-enabled secure servers using this CA bundle") fs.StringVar(&s.Conf.Cluster.Discover.EtcdCertFile, "discover.etcd.cert", "", "identify secure etcd client using this TLS certificate file") fs.StringVar(&s.Conf.Cluster.Discover.EtcdKeyFile, "discover.etcd.key", "", "identify secure etcd client using this TLS key file") @@ -115,7 +115,7 @@ func (s *LogServer) AddFlags(fs *pflag.FlagSet) { fs.DurationVar(&s.Conf.Cluster.PubSub.PollingTimeout, "zmq4-polling-timeout", 200*time.Millisecond, "The timeout determines the time-out on the polling of sockets") } -//InitLog 初始化log +// InitLog 初始化log func (s *LogServer) InitLog() { log := logrus.New() if l, err := logrus.ParseLevel(s.Conf.Log.LogLevel); err == nil { @@ -155,7 +155,7 @@ func (s *LogServer) InitLog() { s.Logger = log } -//InitConf 初始化配置 +// InitConf 初始化配置 func (s *LogServer) InitConf() { s.Conf.Cluster.Discover.ClusterMode = s.Conf.ClusterMode s.Conf.Cluster.PubSub.ClusterMode = s.Conf.ClusterMode @@ -171,7 +171,7 @@ func (s *LogServer) InitConf() { } } -//Run 执行 +// Run 执行 func (s *LogServer) Run() error { s.Logger.Debug("Start run server.") log := s.Logger From 709ec7782ec9907d2fde31652c07fb0d5df93d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 17:06:44 +0800 Subject: [PATCH 38/43] perf: optimize communication exceptions --- cmd/monitor/option/option.go | 6 +++--- cmd/mq/option/option.go | 14 ++++++++------ cmd/mqcli/main.go | 2 +- cmd/node/option/conf.go | 8 +++++--- cmd/webcli/option/option.go | 12 ++++++------ cmd/worker/option/option.go | 20 +++++++++++--------- 6 files changed, 34 insertions(+), 28 deletions(-) diff --git a/cmd/monitor/option/option.go b/cmd/monitor/option/option.go index 38b8af74d8..9a41301124 100644 --- a/cmd/monitor/option/option.go +++ b/cmd/monitor/option/option.go @@ -99,7 +99,7 @@ func NewConfig() *Config { host, _ := os.Hostname() config := &Config{ - EtcdEndpointsLine: "http://127.0.0.1:2379", + EtcdEndpointsLine: "http://rbd-etcd:2379", EtcdEndpoints: []string{}, AdvertiseAddr: host + ":9999", BindIP: host, @@ -134,7 +134,7 @@ func NewConfig() *Config { return config } -//AddFlag monitor flag +// AddFlag monitor flag func (c *Config) AddFlag(cmd *pflag.FlagSet) { cmd.StringVar(&c.EtcdEndpointsLine, "etcd-endpoints", c.EtcdEndpointsLine, "etcd endpoints list.") cmd.StringVar(&c.EtcdCaFile, "etcd-ca", "", "etcd tls ca file ") @@ -148,7 +148,7 @@ func (c *Config) AddFlag(cmd *pflag.FlagSet) { cmd.StringVar(&c.KubeConfig, "kube-config", "", "kubernetes api server config file") } -//AddPrometheusFlag prometheus flag +// AddPrometheusFlag prometheus flag func (c *Config) AddPrometheusFlag(cmd *pflag.FlagSet) { cmd.StringVar(&c.ConfigFile, "config.file", c.ConfigFile, "Prometheus configuration file path.") diff --git a/cmd/mq/option/option.go b/cmd/mq/option/option.go index 0bfe9270d1..98f05921a7 100644 --- a/cmd/mq/option/option.go +++ b/cmd/mq/option/option.go @@ -22,7 +22,7 @@ import "github.com/spf13/pflag" import "github.com/sirupsen/logrus" import "fmt" -//Config config server +// Config config server type Config struct { EtcdEndPoints []string EtcdCaFile string @@ -38,21 +38,20 @@ type Config struct { HostName string } -//MQServer lb worker server +// MQServer lb worker server type MQServer struct { Config LogLevel string } -//NewMQServer new server +// NewMQServer new server func NewMQServer() *MQServer { return &MQServer{} } -//AddFlags config +// AddFlags config func (a *MQServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogLevel, "log-level", "info", "the mq log level") - fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://127.0.0.1:2379"}, "etcd v3 cluster endpoints.") fs.IntVar(&a.EtcdTimeout, "etcd-timeout", 10, "etcd http timeout seconds") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "etcd tls ca file ") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "etcd tls cert file") @@ -63,9 +62,12 @@ func (a *MQServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.PrometheusMetricPath, "metric", "/metrics", "prometheus metrics path") fs.StringVar(&a.HostIP, "hostIP", "", "Current node Intranet IP") fs.StringVar(&a.HostName, "hostName", "", "Current node host name") + + fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd v3 cluster endpoints.") + } -//SetLog 设置log +// SetLog 设置log func (a *MQServer) SetLog() { level, err := logrus.ParseLevel(a.LogLevel) if err != nil { diff --git a/cmd/mqcli/main.go b/cmd/mqcli/main.go index e2f7099e78..c05c426af6 100644 --- a/cmd/mqcli/main.go +++ b/cmd/mqcli/main.go @@ -85,7 +85,7 @@ func main() { // AddFlags - func AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&server, "server", "127.0.0.1:6300", "mq server") + fs.StringVar(&server, "server", "rbd-mq:6300", "mq server") fs.StringVar(&topic, "topic", "builder", "mq topic") fs.StringVar(&taskbody, "task-body", "", "mq task body") fs.StringVar(&taskfile, "task-file", "", "mq task body file") diff --git a/cmd/node/option/conf.go b/cmd/node/option/conf.go index 6caa54428b..87e1d3650a 100644 --- a/cmd/node/option/conf.go +++ b/cmd/node/option/conf.go @@ -154,15 +154,12 @@ type UDPMonitorConfig struct { func (a *Conf) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogLevel, "log-level", "info", "the log level") fs.StringVar(&a.LogFile, "log-file", "", "the log file path that log output") - fs.StringVar(&a.PrometheusAPI, "prometheus", "http://rbd-monitor:9999", "the prometheus server address") fs.StringVar(&a.NodePath, "nodePath", "/rainbond/nodes", "the path of node in etcd") fs.StringVar(&a.HostID, "nodeid", "", "the unique ID for this node. Just specify, don't modify") fs.StringVar(&a.HostIP, "hostIP", "", "the host ip you can define. default get ip from eth0") fs.StringVar(&a.PodIP, "podIP", "", "The pod ip of node.") - fs.StringSliceVar(&a.EventLogServer, "event-log-server", []string{"127.0.0.1:6366"}, "host:port slice of event log server") fs.StringVar(&a.ConfigStoragePath, "config-path", "/rainbond/acp_configs", "the path of config to store(new)") fs.StringVar(&a.Service, "servicePath", "/traefik/backends", "the path of service info to store") - fs.StringSliceVar(&a.EtcdEndpoints, "etcd", []string{"http://127.0.0.1:2379"}, "the path of node in etcd") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "verify etcd certificates of TLS-enabled secure servers using this CA bundle") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "identify secure etcd client using this TLS certificate file") fs.StringVar(&a.EtcdKeyFile, "etcd-key", "", "identify secure etcd client using this TLS key file") @@ -199,6 +196,11 @@ func (a *Conf) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.HostsFile, "hostsfile", "/newetc/hosts", "/etc/hosts mapped path in the container. eg. /etc/hosts:/tmp/hosts. Do not set hostsfile to /etc/hosts") fs.StringVar(&a.ContainerRuntime, "container-runtime", sources.ContainerRuntimeContainerd, "container runtime, support docker and containerd") fs.StringVar(&a.RuntimeEndpoint, "runtime-endpoint", sources.RuntimeEndpointContainerd, "container runtime endpoint") + + fs.StringSliceVar(&a.EventLogServer, "event-log-server", []string{"rbd-eventlog:6366"}, "host:port slice of event log server") + fs.StringSliceVar(&a.EtcdEndpoints, "etcd", []string{"http://rbd-etcd:2379"}, "the path of node in etcd") + fs.StringVar(&a.PrometheusAPI, "prometheus", "http://rbd-monitor:9999", "the prometheus server address") + } // SetLog 设置log diff --git a/cmd/webcli/option/option.go b/cmd/webcli/option/option.go index 1929a1dca6..43696b0fea 100644 --- a/cmd/webcli/option/option.go +++ b/cmd/webcli/option/option.go @@ -25,7 +25,7 @@ import ( "github.com/spf13/pflag" ) -//Config config server +// Config config server type Config struct { EtcdEndPoints []string EtcdCaFile string @@ -40,21 +40,21 @@ type Config struct { K8SConfPath string } -//WebCliServer container webcli server +// WebCliServer container webcli server type WebCliServer struct { Config LogLevel string } -//NewWebCliServer new server +// NewWebCliServer new server func NewWebCliServer() *WebCliServer { return &WebCliServer{} } -//AddFlags config +// AddFlags config func (a *WebCliServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogLevel, "log-level", "info", "the webcli log level") - fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://127.0.0.1:2379"}, "etcd v3 cluster endpoints.") + fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd v3 cluster endpoints.") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "etcd tls ca file ") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "etcd tls cert file") fs.StringVar(&a.EtcdKeyFile, "etcd-key", "", "etcd http tls cert key file") @@ -66,7 +66,7 @@ func (a *WebCliServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.PrometheusMetricPath, "metric", "/metrics", "prometheus metrics path") } -//SetLog 设置log +// SetLog 设置log func (a *WebCliServer) SetLog() { level, err := logrus.ParseLevel(a.LogLevel) if err != nil { diff --git a/cmd/worker/option/option.go b/cmd/worker/option/option.go index 850c146ad0..d3c686196f 100644 --- a/cmd/worker/option/option.go +++ b/cmd/worker/option/option.go @@ -28,7 +28,7 @@ import ( "k8s.io/client-go/kubernetes" ) -//Config config server +// Config config server type Config struct { EtcdEndPoints []string EtcdCaFile string @@ -67,22 +67,21 @@ type Helm struct { ChartCache string } -//Worker worker server +// Worker worker server type Worker struct { Config LogLevel string RunMode string //default,sync } -//NewWorker new server +// NewWorker new server func NewWorker() *Worker { return &Worker{} } -//AddFlags config +// AddFlags config func (a *Worker) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.LogLevel, "log-level", "info", "the worker log level") - fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://127.0.0.1:2379"}, "etcd v3 cluster endpoints.") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "") fs.StringVar(&a.EtcdKeyFile, "etcd-key", "", "") @@ -92,12 +91,10 @@ func (a *Worker) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.Listen, "listen", ":6369", "prometheus listen host and port") fs.StringVar(&a.DBType, "db-type", "mysql", "db type mysql or etcd") fs.StringVar(&a.MysqlConnectionInfo, "mysql", "root:admin@tcp(127.0.0.1:3306)/region", "mysql db connection info") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"127.0.0.1:6366"}, "event log server address. simple lb") fs.StringVar(&a.KubeConfig, "kube-config", "", "kubernetes api server config file") fs.IntVar(&a.KubeAPIQPS, "kube-api-qps", 50, "kube client qps") fs.IntVar(&a.KubeAPIBurst, "kube-api-burst", 10, "kube clint burst") fs.IntVar(&a.MaxTasks, "max-tasks", 50, "the max tasks for per node") - fs.StringVar(&a.MQAPI, "mq-api", "127.0.0.1:6300", "acp_mq api") fs.StringVar(&a.RunMode, "run", "sync", "sync data when worker start") fs.StringVar(&a.NodeName, "node-name", "", "the name of this worker,it must be global unique name") fs.StringVar(&a.HostIP, "host-ip", "", "the ip of this worker,it must be global connected ip") @@ -108,12 +105,17 @@ func (a *Worker) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.GrdataPVCName, "grdata-pvc-name", "rbd-cpt-grdata", "The name of grdata persistent volume claim") fs.StringVar(&a.Helm.DataDir, "/grdata/helm", "/grdata/helm", "The data directory of Helm.") fs.StringVar(&a.SharedStorageClass, "shared-storageclass", "", "custom shared storage class.use the specified storageclass to create shared storage, if this parameter is not specified, it will use rainbondsssc by default") + + fs.StringSliceVar(&a.EtcdEndPoints, "etcd-endpoints", []string{"http://rbd-etcd:2379"}, "etcd v3 cluster endpoints.") + fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "acp_mq api") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") + a.Helm.RepoFile = path.Join(a.Helm.DataDir, "repo/repositories.yaml") a.Helm.RepoCache = path.Join(a.Helm.DataDir, "cache") a.Helm.ChartCache = path.Join(a.Helm.DataDir, "chart") } -//SetLog 设置log +// SetLog 设置log func (a *Worker) SetLog() { level, err := logrus.ParseLevel(a.LogLevel) if err != nil { @@ -123,7 +125,7 @@ func (a *Worker) SetLog() { logrus.SetLevel(level) } -//CheckEnv 检测环境变量 +// CheckEnv 检测环境变量 func (a *Worker) CheckEnv() error { if err := os.Setenv("GRDATA_PVC_NAME", a.Config.GrdataPVCName); err != nil { return fmt.Errorf("set env 'GRDATA_PVC_NAME': %v", err) From f9554f5fae6ec2d438a7924d5c9d2b0087f55f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Tue, 9 Jan 2024 18:16:05 +0800 Subject: [PATCH 39/43] perf: optimize communication exceptions --- release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release.sh b/release.sh index 4623b27fcb..bac4b58bea 100755 --- a/release.sh +++ b/release.sh @@ -93,7 +93,7 @@ build::binary() { if [ ! $(which upx) ]; then sudo apt-get install -y upx fi -# sudo upx --best --lzma "${OUTPATH}" + sudo upx --best --lzma "${OUTPATH}" # elif [ "$GOARCH" = "arm64" ]; then # wget https://rainbond-pkg.oss-cn-shanghai.aliyuncs.com/upx/upx-4.0.2-arm64_linux/upx # chmod +x upx From 15f126cbaf46840b6a257e1bbadbeafdb06e34b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Wed, 10 Jan 2024 09:54:16 +0800 Subject: [PATCH 40/43] perf: optimize communication exceptions --- eventlog/entry/server_test.go | 163 ------------------ eventlog/store/barrel_test.go | 19 -- eventlog/store/manager_test.go | 73 -------- .../store/new_monitor_message_store_test.go | 39 ----- eventlog/test/dockerserver/main.go | 120 ------------- eventlog/test/eventserver/main.go | 101 ----------- .../test/monitorserver/monitorserver_test.go | 83 --------- 7 files changed, 598 deletions(-) delete mode 100644 eventlog/entry/server_test.go delete mode 100644 eventlog/store/barrel_test.go delete mode 100644 eventlog/store/manager_test.go delete mode 100644 eventlog/store/new_monitor_message_store_test.go delete mode 100644 eventlog/test/dockerserver/main.go delete mode 100644 eventlog/test/eventserver/main.go delete mode 100644 eventlog/test/monitorserver/monitorserver_test.go diff --git a/eventlog/entry/server_test.go b/eventlog/entry/server_test.go deleted file mode 100644 index f78d7178cb..0000000000 --- a/eventlog/entry/server_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package entry - -import ( - "errors" - "os" - "os/signal" - "syscall" - "testing" - "time" - - "fmt" - - "sync" - - "github.com/pebbe/zmq4" - "github.com/sirupsen/logrus" - "github.com/twinj/uuid" -) - -const ( - REQUEST_TIMEOUT = 1000 * time.Millisecond - MAX_RETRIES = 3 // Before we abandon -) - -func TestServer(t *testing.T) { - t.SkipNow() - request := []string{`{"event_id":"qwertyuiuiosadfkbjasdv","message":"hello word2"}`} - reply := []string{} - var err error - // For one endpoint, we retry N times - for retries := 0; retries < MAX_RETRIES; retries++ { - endpoint := "tcp://127.0.0.1:4320" - reply, err = try_request(endpoint, request) - if err == nil { - break // Successful - } - t.Errorf("W: no response from %s, %s\n", endpoint, err.Error()) - } - - if len(reply) > 0 { - t.Logf("Service is running OK: %q\n", reply) - } - -} - -func TestContinuousServer(t *testing.T) { - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - coreNum := 30 - var wait sync.WaitGroup - endpoint := "tcp://127.0.0.1:4321" - for i := 0; i < coreNum; i++ { - if i < 15 { - endpoint = "tcp://127.0.0.1:4320" - } else { - endpoint = "tcp://127.0.0.1:4321" - } - wait.Add(1) - go func(en string) { - client, _ := zmq4.NewSocket(zmq4.REQ) - client.Connect(en) - defer client.Close() - id := uuid.NewV4() - Continuous: - for { - request := []string{fmt.Sprintf(`{"event_id":"%s","message":"hello word2","time":"%s"}`, id, time.Now().Format(time.RFC3339))} - _, err := client.SendMessage(request) - if err != nil { - logrus.Error("Send:", err) - } - poller := zmq4.NewPoller() - poller.Add(client, zmq4.POLLIN) - polled, err := poller.Poll(REQUEST_TIMEOUT) - if err != nil { - logrus.Error("Red:", err) - } - reply := []string{} - if len(polled) > 0 { - reply, err = client.RecvMessage(0) - } else { - err = errors.New("Time out") - } - if len(reply) > 0 { - logrus.Info(en, ":", reply[0]) - } - if err != nil { - logrus.Error(err) - break Continuous - } - select { - case <-interrupt: - break Continuous - case <-time.Tick(time.Second): - } - } - wait.Done() - }(endpoint) - } - wait.Wait() -} - -//go test -v -bench=“.” -func BenchmarkServer(b *testing.B) { - for i := 0; i < b.N; i++ { - request := []string{fmt.Sprintf(`{"event_id":"qwertyuiuiosadfkbjasdv","message":"hello word","step":"%d"}`, i)} - reply := []string{} - var err error - // For one endpoint, we retry N times - for retries := 0; retries < MAX_RETRIES; retries++ { - endpoint := "tcp://127.0.0.1:6366" - reply, err = try_request(endpoint, request) - if err == nil { - break // Successful - } - b.Errorf("W: no response from %s, %s\n", endpoint, err.Error()) - } - if len(reply) > 0 { - b.Logf("Service is running OK: %q\n", reply) - } - } -} - -func try_request(endpoint string, request []string) (reply []string, err error) { - logrus.Infof("I: trying echo service at %s...\n", endpoint) - client, _ := zmq4.NewSocket(zmq4.REQ) - client.Connect(endpoint) - defer client.Close() - for i := 0; i < 5; i++ { - // Send request, wait safely for reply - client.SendMessage(request) - poller := zmq4.NewPoller() - poller.Add(client, zmq4.POLLIN) - polled, err := poller.Poll(REQUEST_TIMEOUT) - reply = []string{} - if len(polled) == 1 { - reply, err = client.RecvMessage(0) - } else { - err = errors.New("Time out") - } - if err != nil { - return nil, err - } - } - return nil, nil -} diff --git a/eventlog/store/barrel_test.go b/eventlog/store/barrel_test.go deleted file mode 100644 index a5b9d7de4f..0000000000 --- a/eventlog/store/barrel_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package store diff --git a/eventlog/store/manager_test.go b/eventlog/store/manager_test.go deleted file mode 100644 index 2361e778d6..0000000000 --- a/eventlog/store/manager_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package store - -import ( - "github.com/goodrain/rainbond/eventlog/conf" - "testing" - - "github.com/sirupsen/logrus" -) - -var urlData = ` -2017-05-19 11:33:34 APPS SumTimeByUrl [{"tenant":"o2o","service":"zzcplus","url":"/active/js/wx_share.js","avgtime":"1.453","sumtime":"1.453","counts":"1"}] -` - -func BenchmarkHandleMonitorMessage(b *testing.B) { - manager, err := NewManager(conf.EventStoreConf{ - HandleDockerLogCoreNumber: 10, - DB: conf.DBConf{ - Type: "mysql", - URL: "root:admin@tcp(127.0.0.1:3306)/event", - }, - }, logrus.WithField("MODO", "test")) - if err != nil { - b.Fatal(err) - } - - err = manager.Run() - if err != nil { - b.Fatal(err) - } - //defer manager.Stop() - for i := 0; i < b.N; i++ { - manager.MonitorMessageChan() <- [][]byte{[]byte("xxx"), []byte(`2017-05-19 11:33:32 APPS SumTimeBySql [{"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"update weixin_user set subscribe=? where openid = ?","avgtime":"0.10058000000000006","sumtime":"0.20116000000000012","counts":"2"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"insert into lottery_prize (lottery_type,lottery_no,prize_balls,create_time,prize_time) values (?,?,?,?,?)","avgtime":"0.298413","sumtime":"0.298413","counts":"1"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"select miss_type,miss_data from lottery_miss where lottery_type=? and lottery_no=?","avgtime":"0.326492","sumtime":"0.326492","counts":"1"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"insert into weixin_msg (openid,msg_type,content,msg_id,msg_time,create_time) values (?,?,?,?,?,?)","avgtime":"0.8989751","sumtime":"8.989751","counts":"10"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"select * from lottery_prize where lottery_type = ? and lottery_no = ? limit ?","avgtime":"0.20503315909090927","sumtime":"9.021459000000007","counts":"44"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"select id from news where sourceid = ? and del=? limit ?","avgtime":"0.26174076219512193","sumtime":"42.925484999999995","counts":"164"}, {"tenant_id":"d9621ccfc0b742829a517a2642ba04b7","service_id":"b6e19107cadb14b53a95442cb9120b8d","sql":"select a.id,a.title,a.public_time from news a inner join news_class b on a.id=b.news_id where b.class_id=? and a.del=? and a.public_time. - -package store - -import "testing" - -func TestMerge(t *testing.T) { - s1 := MonitorMessageList{ - MonitorMessage{ - Key: "/asdadasd", - }, - } - s2 := MonitorMessageList{ - MonitorMessage{ - Key: "/asdadasd", - }, - MonitorMessage{ - Key: "/asda12dasd", - }, - } - re := merge(s1, s2) - t.Log(re) -} diff --git a/eventlog/test/dockerserver/main.go b/eventlog/test/dockerserver/main.go deleted file mode 100644 index d344c01ab1..0000000000 --- a/eventlog/test/dockerserver/main.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package main - -import ( - "fmt" - "io/ioutil" - "net/http" - "os" - "os/signal" - "sync" - "syscall" - "time" - - "github.com/pebbe/zmq4" - "github.com/sirupsen/logrus" - "github.com/spf13/pflag" - "github.com/tidwall/gjson" - "github.com/twinj/uuid" -) - -const ( - REQUEST_TIMEOUT = 1000 * time.Millisecond - MAX_RETRIES = 3 // Before we abandon -) - -var endpoint string -var coreNum int -var t string - -func AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&endpoint, "endpoint", "tcp://127.0.0.1:6363", "docker log server url") - fs.IntVar(&coreNum, "core", 1, "core number") - fs.StringVar(&t, "t", "1s", "时间间隔") -} - -func main() { - AddFlags(pflag.CommandLine) - pflag.Parse() - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - re, _ := http.NewRequest("GET", "http://127.0.0.1:6363/docker-instance?service_id=asdasdadsasdasdassd", nil) - res, err := http.DefaultClient.Do(re) - if err != nil { - logrus.Error(err) - return - } - body, err := ioutil.ReadAll(res.Body) - if err != nil { - logrus.Error(err) - return - } - status := gjson.Get(string(body), "status") - host := gjson.Get(string(body), "host") - if status.String() == "success" { - endpoint = host.String() - } else { - logrus.Error("获取日志接收节点失败." + gjson.Get(string(body), "host").String()) - return - } - var wait sync.WaitGroup - d, _ := time.ParseDuration(t) - for i := 0; i < coreNum; i++ { - wait.Add(1) - go func(en string) { - client, _ := zmq4.NewSocket(zmq4.PUB) - client.Monitor("inproc://monitor.rep", zmq4.EVENT_ALL) - go monitor() - client.Connect(en) - defer client.Close() - id := uuid.NewV4() - Continuous: - for { - request := fmt.Sprintf(`{"event_id":"%s","message":"hello word2","time":"%s"}`, id, time.Now().Format(time.RFC3339)) - client.Send("servasd223123123123", zmq4.SNDMORE) - _, err := client.Send(request, zmq4.DONTWAIT) - if err != nil { - logrus.Error("Send Error:", err) - } - select { - case <-interrupt: - break Continuous - case <-time.Tick(d): - } - } - wait.Done() - }(endpoint) - } - wait.Wait() -} - -func monitor() { - mo, _ := zmq4.NewSocket(zmq4.PAIR) - mo.Connect("inproc://monitor.rep") - for { - a, b, c, err := mo.RecvEvent(0) - if err != nil { - logrus.Error(err) - return - } - logrus.Infof("A:%s B:%s C:%d", a, b, c) - } - -} diff --git a/eventlog/test/eventserver/main.go b/eventlog/test/eventserver/main.go deleted file mode 100644 index 9e7253d959..0000000000 --- a/eventlog/test/eventserver/main.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package main - -import ( - "errors" - "fmt" - "os" - "os/signal" - "sync" - "syscall" - "time" - - "github.com/pebbe/zmq4" - "github.com/sirupsen/logrus" - "github.com/spf13/pflag" - "github.com/twinj/uuid" -) - -const ( - REQUEST_TIMEOUT = 1000 * time.Millisecond - MAX_RETRIES = 3 // Before we abandon -) - -var endpoint string -var coreNum int -var t string - -func AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&endpoint, "endpoint", "tcp://127.0.0.1:6366", "event server url") - fs.IntVar(&coreNum, "core", 10, "core number") - fs.StringVar(&t, "t", "1s", "时间间隔") -} - -func main() { - AddFlags(pflag.CommandLine) - pflag.Parse() - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - var wait sync.WaitGroup - d, _ := time.ParseDuration(t) - for i := 0; i < coreNum; i++ { - wait.Add(1) - go func(en string) { - client, _ := zmq4.NewSocket(zmq4.REQ) - client.Connect(en) - defer client.Close() - id := uuid.NewV4() - Continuous: - for { - request := []string{fmt.Sprintf(`{"event_id":"%s","message":"hello word2","time":"%s"}`, id, time.Now().Format(time.RFC3339))} - _, err := client.SendMessage(request) - if err != nil { - logrus.Error("Send:", err) - } - poller := zmq4.NewPoller() - poller.Add(client, zmq4.POLLIN) - polled, err := poller.Poll(REQUEST_TIMEOUT) - if err != nil { - logrus.Error("Red:", err) - } - reply := []string{} - if len(polled) > 0 { - reply, err = client.RecvMessage(0) - } else { - err = errors.New("Time out") - } - if len(reply) > 0 { - logrus.Info(en, ":", reply[0]) - } - if err != nil { - logrus.Error(err) - break Continuous - } - select { - case <-interrupt: - break Continuous - case <-time.Tick(d): - } - } - wait.Done() - }(endpoint) - } - wait.Wait() -} diff --git a/eventlog/test/monitorserver/monitorserver_test.go b/eventlog/test/monitorserver/monitorserver_test.go deleted file mode 100644 index 94432ad30e..0000000000 --- a/eventlog/test/monitorserver/monitorserver_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package monitorserver - -import ( - "testing" - - "github.com/pebbe/zmq4" - "github.com/sirupsen/logrus" -) - -var urlData = ` -2017-05-19 11:33:34 APPS SumTimeByUrl [{"tenant":"o2o","service":"zzcplus","url":"/active/js/wx_share.js","avgtime":"1.453","sumtime":"1.453","counts":"1"}] -` -var newMonitorMessage = ` -[{"ServiceID":"test", - "Port":"5000", - "MessageType":"http", - "Key":"/test", - "CumulativeTime":0.1, - "AverageTime":0.1, - "MaxTime":0.1, - "Count":1, - "AbnormalCount":0} -,{"ServiceID":"test", - "Port":"5000", - "MessageType":"http", - "Key":"/test2", - "CumulativeTime":0.36, - "AverageTime":0.18, - "MaxTime":0.2, - "Count":2, - "AbnormalCount":2} -] -` - -func BenchmarkMonitorServer(t *testing.B) { - client, _ := zmq4.NewSocket(zmq4.PUB) - // client.Monitor("inproc://monitor.rep", zmq4.EVENT_ALL) - // go monitor() - client.Bind("tcp://0.0.0.0:9442") - defer client.Close() - var size int64 - for i := 0; i < t.N; i++ { - client.Send("ceptop", zmq4.SNDMORE) - _, err := client.Send(urlData, zmq4.DONTWAIT) - if err != nil { - logrus.Error("Send Error:", err) - } - size++ - } - logrus.Info(size) -} - -func monitor() { - mo, _ := zmq4.NewSocket(zmq4.PAIR) - mo.Connect("inproc://monitor.rep") - for { - a, b, c, err := mo.RecvEvent(0) - if err != nil { - logrus.Error(err) - return - } - logrus.Infof("A:%s B:%s C:%d", a, b, c) - } - -} From e28a038291c57aaa49be32347cefd4a4fcbf614c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Wed, 10 Jan 2024 10:13:26 +0800 Subject: [PATCH 41/43] perf: optimize communication exceptions --- api/db/database.go | 22 --- api/db/db.go | 48 ++--- api/handler/LicenseHandler_test.go | 49 ----- api/handler/eventLog_test.go | 183 ------------------ api/handler/netRules_test.go | 74 ------- api/handler/rootFunc_test.go | 19 -- db/db.go | 12 +- pkg/component/core.go | 20 +- pkg/component/etcd/etcdComponent.go | 18 ++ pkg/component/grpc/grpcComponent.go | 18 ++ .../hubregistry/registryComponent.go | 18 ++ pkg/component/k8s/k8sComponent.go | 38 +++- pkg/component/mq/mqComponent.go | 18 ++ pkg/component/prom/promComponent.go | 18 ++ pkg/gogo/go.go | 18 ++ pkg/gogo/option.go | 18 ++ pkg/interceptors/http.go | 18 ++ pkg/rainbond/component.go | 18 ++ pkg/rainbond/registry.go | 18 ++ test/shell/echo1.sh | 1 - test/shell/echo2.sh | 1 - .../componentdefinition_test.go | 42 ---- 22 files changed, 256 insertions(+), 433 deletions(-) delete mode 100644 api/db/database.go delete mode 100644 api/handler/LicenseHandler_test.go delete mode 100644 api/handler/eventLog_test.go delete mode 100644 api/handler/netRules_test.go delete mode 100644 api/handler/rootFunc_test.go delete mode 100644 test/shell/echo1.sh delete mode 100644 test/shell/echo2.sh delete mode 100644 worker/appm/componentdefinition/componentdefinition_test.go diff --git a/api/db/database.go b/api/db/database.go deleted file mode 100644 index b103fee91b..0000000000 --- a/api/db/database.go +++ /dev/null @@ -1,22 +0,0 @@ -package db - -import ( - "context" - "github.com/goodrain/rainbond/config/configs" - "github.com/sirupsen/logrus" -) - -// Database - -func Database() *ConDB { - return &ConDB{} -} - -// Start - -func (d *ConDB) Start(ctx context.Context, config *configs.Config) error { - logrus.Info("start db client...") - return CreateDBManager(config.APIConfig) -} - -// CloseHandle - -func (d *ConDB) CloseHandle() { -} diff --git a/api/db/db.go b/api/db/db.go index 74cbf5d266..1f453e9872 100644 --- a/api/db/db.go +++ b/api/db/db.go @@ -19,16 +19,15 @@ package db import ( - "encoding/json" + "context" + "github.com/goodrain/rainbond/config/configs" "time" tsdbClient "github.com/bluebreezecf/opentsdb-goclient/client" tsdbConfig "github.com/bluebreezecf/opentsdb-goclient/config" - "github.com/goodrain/rainbond/cmd/api/option" "github.com/goodrain/rainbond/db" "github.com/goodrain/rainbond/db/config" dbModel "github.com/goodrain/rainbond/db/model" - "github.com/goodrain/rainbond/mq/api/grpc/pb" "github.com/goodrain/rainbond/worker/discover/model" "github.com/jinzhu/gorm" "github.com/sirupsen/logrus" @@ -40,13 +39,18 @@ type ConDB struct { DBType string } -// CreateDBManager get db manager -// TODO: need to try when happened error, try 4 times -func CreateDBManager(conf option.Config) error { +// Database - +func Database() *ConDB { + return &ConDB{} +} + +// Start - +func (d *ConDB) Start(ctx context.Context, cfg *configs.Config) error { + logrus.Info("start db client...") dbCfg := config.Config{ - MysqlConnectionInfo: conf.DBConnectionInfo, - DBType: conf.DBType, - ShowSQL: conf.ShowSQL, + MysqlConnectionInfo: cfg.APIConfig.DBConnectionInfo, + DBType: cfg.APIConfig.DBType, + ShowSQL: cfg.APIConfig.ShowSQL, } if err := db.CreateManager(dbCfg); err != nil { logrus.Errorf("get db manager failed,%s", err.Error()) @@ -58,6 +62,14 @@ func CreateDBManager(conf option.Config) error { return nil } +// CloseHandle - +func (d *ConDB) CloseHandle() { + err := db.CloseManager() + if err != nil { + logrus.Errorf("close db manager failed,%s", err.Error()) + } +} + // TaskStruct task struct type TaskStruct struct { TaskType string @@ -82,24 +94,6 @@ func (o *OpentsdbManager) NewOpentsdbManager() (tsdbClient.Client, error) { return tc, nil } -// BuildTask build task -func BuildTask(t *TaskStruct) (*pb.EnqueueRequest, error) { - var er pb.EnqueueRequest - taskJSON, err := json.Marshal(t.TaskBody) - if err != nil { - logrus.Errorf("tran task json error") - return &er, err - } - er.Topic = "worker" - er.Message = &pb.TaskMessage{ - TaskType: t.TaskType, - CreateTime: time.Now().Format(time.RFC3339), - TaskBody: taskJSON, - User: t.User, - } - return &er, nil -} - // GetBegin get db transaction func GetBegin() *gorm.DB { return db.GetManager().Begin() diff --git a/api/handler/LicenseHandler_test.go b/api/handler/LicenseHandler_test.go deleted file mode 100644 index b303ac6b83..0000000000 --- a/api/handler/LicenseHandler_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package handler - -import ( - "fmt" - "github.com/goodrain/rainbond/api/db" - "github.com/goodrain/rainbond/cmd/api/option" - "testing" -) - -func TestLicenseInfo(t *testing.T) { - conf := option.Config{ - DBType: "mysql", - DBConnectionInfo: "admin:admin@tcp(127.0.0.1:3306)/region", - } - //创建db manager - if err := db.CreateDBManager(conf); err != nil { - fmt.Printf("create db manager error, %v", err) - - } - //创建license验证 manager - if err := CreateLicensesInfoManager(); err != nil { - fmt.Printf("create license check manager error, %v", err) - } - lists, err := GetLicensesInfosHandler().ShowInfos() - if err != nil { - fmt.Printf("get list error, %v", err) - } - for _, v := range lists { - fmt.Printf("license value is %v", v) - } -} diff --git a/api/handler/eventLog_test.go b/api/handler/eventLog_test.go deleted file mode 100644 index 93ead3557a..0000000000 --- a/api/handler/eventLog_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package handler - -import ( - "fmt" - "os/exec" - "testing" - "time" - - api_db "github.com/goodrain/rainbond/api/db" - api_model "github.com/goodrain/rainbond/api/model" - "github.com/goodrain/rainbond/cmd/api/option" - - "github.com/sirupsen/logrus" -) - -func TestEmessage(t *testing.T) { - fmt.Printf("begin.\n") - conf := option.Config{ - DBType: "mysql", - DBConnectionInfo: "admin:admin@tcp(127.0.0.1:3306)/region", - } - //创建db manager - if err := api_db.CreateDBManager(conf); err != nil { - fmt.Printf("create db manager error, %v", err) - } - getLevelLog("dd09a25eb9744afa9b3ad5f5541013e7", "info") - fmt.Printf("end.\n") -} - -func getLevelLog(eventID string, level string) (*api_model.DataLog, error) { - //messages, err := db.GetManager().EventLogDao().GetEventLogMessages(eventID) - //if err != nil { - // return nil, err - //} - ////var d []api_model.MessageData - //for _, v := range messages { - // log, err := uncompress(v.Message) - // if err != nil { - // return nil, err - // } - // logrus.Debugf("log is %v", log) - // fmt.Printf("log is %v", string(log)) - // - // var mLogs []msgStruct - // if err := ffjson.Unmarshal(log, &mLogs); err != nil { - // return nil, err - // } - // fmt.Printf("jlog %v", mLogs) - // break - //} - return nil, nil -} - -type msgStruct struct { - EventID string `json:"event_id"` - Step string `json:"step"` - Message string `json:"message"` - Level string `json:"level"` - Time string `json:"time"` -} - -func TestLines(t *testing.T) { - filePath := "/Users/pujielan/Downloads/log" - logrus.Debugf("file path is %s", filePath) - n := 1000 - f, err := exec.Command("tail", "-n", fmt.Sprintf("%d", n), filePath).Output() - if err != nil { - fmt.Printf("err if %v", err) - } - fmt.Printf("f is %v", string(f)) -} - -func TestTimes(t *testing.T) { - //toBeCharge := "2015-01-01 00:00:00" //待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板走的 修改模板的话也可以不写 - toBeCharge := "2017-09-29T10:02:44+08:00" //待转化为时间戳的字符串 注意 这里的小时和分钟还要秒必须写 因为是跟着模板走的 修改模板的话也可以不写 - timeLayout := "2006-01-02T15:04:05" //转化所需模板 - loc, _ := time.LoadLocation("Local") //重要:获取时区 - //toBeCharge = strings.Split(toBeCharge, ".")[0] - fmt.Println(toBeCharge) - theTime, err := time.ParseInLocation(timeLayout, toBeCharge, loc) //使用模板在对应时区转化为time.time类型 - fmt.Println(err) - sr := theTime.Unix() //转化为时间戳 类型是int64 - fmt.Println(theTime) //打印输出theTime 2015-01-01 15:15:00 +0800 CST - fmt.Println(sr) -} - -func TestSort(t *testing.T) { - arr := [...]int{3, 41, 24, 76, 11, 45, 3, 3, 64, 21, 69, 19, 36} - fmt.Println(arr) - num := len(arr) - - //循环排序 - for i := 0; i < num; i++ { - for j := i + 1; j < num; j++ { - if arr[i] > arr[j] { - temp := arr[i] - arr[i] = arr[j] - arr[j] = temp - } - } - } - fmt.Println(arr) -} - -func quickSort(array []int, left int, right int) { - if left < right { - key := array[left] - low := left - high := right - for low < high { - for low < high && array[high] > key { - high-- - } - array[low] = array[high] - for low < high && array[low] < key { - low++ - } - array[high] = array[low] - } - array[low] = key - quickSort(array, left, low-1) - quickSort(array, low+1, right) - } -} - -func qsort(array []int, low, high int) { - if low < high { - m := partition(array, low, high) - // fmt.Println(m) - qsort(array, low, m-1) - qsort(array, m+1, high) - } -} - -func partition(array []int, low, high int) int { - key := array[low] - tmpLow := low - tmpHigh := high - for { - //查找小于等于key的元素,该元素的位置一定是tmpLow到high之间,因为array[tmpLow]及左边元素小于等于key,不会越界 - for array[tmpHigh] > key { - tmpHigh-- - } - //找到大于key的元素,该元素的位置一定是low到tmpHigh+1之间。因为array[tmpHigh+1]必定大于key - for array[tmpLow] <= key && tmpLow < tmpHigh { - tmpLow++ - } - - if tmpLow >= tmpHigh { - break - } - // swap(array[tmpLow], array[tmpHigh]) - array[tmpLow], array[tmpHigh] = array[tmpHigh], array[tmpLow] - fmt.Println(array) - } - array[tmpLow], array[low] = array[low], array[tmpLow] - return tmpLow -} - -func TestFastSort(t *testing.T) { - var sortArray = []int{3, 41, 24, 76, 11, 45, 3, 3, 64, 21, 69, 19, 36} - fmt.Println(sortArray) - qsort(sortArray, 0, len(sortArray)-1) - fmt.Println(sortArray) -} diff --git a/api/handler/netRules_test.go b/api/handler/netRules_test.go deleted file mode 100644 index 35aa41a8c7..0000000000 --- a/api/handler/netRules_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package handler - -import ( - "context" - "fmt" - "time" - - api_model "github.com/goodrain/rainbond/api/model" - - "testing" -) - -func TestStoreETCD(t *testing.T) { - cli, err := clientv3.New(clientv3.Config{ - Endpoints: []string{"127.0.0.1:2379"}, - DialTimeout: 10 * time.Second, - }) - if err != nil { - t.Error(err) - } - nra := &NetRulesAction{ - etcdCli: cli, - } - rules := &api_model.NetDownStreamRules{ - Limit: 1024, - //Header: "E1:V1,E2:V2", - //Domain: "test.redis.com", - //Prefix: "/redis", - } - - srs := &api_model.SetNetDownStreamRuleStruct{ - TenantName: "123", - ServiceAlias: "grtest12", - } - srs.Body.DestService = "redis" - srs.Body.DestServiceAlias = "grtest34" - srs.Body.Port = 6379 - srs.Body.Protocol = "tcp" - srs.Body.Rules = rules - - tenantID := "tenantid1b50sfadfadfafadfadfadf" - - if err := nra.CreateDownStreamNetRules(tenantID, srs); err != nil { - t.Error(err) - } - - k := fmt.Sprintf("/netRules/%s/%s/downstream/%s/%v", - tenantID, srs.ServiceAlias, srs.Body.DestServiceAlias, srs.Body.Port) - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - v, err := cli.Get(ctx, k) - cancel() - if err != nil { - t.Error(err) - } - fmt.Printf("v is %v\n", string(v.Kvs[0].Value)) -} diff --git a/api/handler/rootFunc_test.go b/api/handler/rootFunc_test.go deleted file mode 100644 index 6a7dc9e2c1..0000000000 --- a/api/handler/rootFunc_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. -// RAINBOND, Application Management Platform - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package handler diff --git a/db/db.go b/db/db.go index a104eb761f..5719f03f51 100644 --- a/db/db.go +++ b/db/db.go @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2018 Goodrain Co., Ltd. +// Copyright (C) 2014-2024 Goodrain Co., Ltd. // RAINBOND, Application Management Platform // This program is free software: you can redistribute it and/or modify @@ -30,7 +30,7 @@ import ( "github.com/sirupsen/logrus" ) -//Manager db manager +// Manager db manager type Manager interface { CloseManager() error Begin() *gorm.DB @@ -152,11 +152,11 @@ func init() { supportDrivers = map[string]struct{}{ "mysql": {}, "cockroachdb": {}, - "sqlite": {}, + "sqlite": {}, } } -//CreateManager 创建manager +// CreateManager 创建manager func CreateManager(config config.Config) (err error) { if _, ok := supportDrivers[config.DBType]; !ok { return fmt.Errorf("DB drivers: %s not supported", config.DBType) @@ -176,7 +176,7 @@ func CreateManager(config config.Config) (err error) { return } -//CloseManager close db manager +// CloseManager close db manager func CloseManager() error { if defaultManager == nil { return errors.New("default db manager not init") @@ -184,7 +184,7 @@ func CloseManager() error { return defaultManager.CloseManager() } -//GetManager get db manager +// GetManager get db manager func GetManager() Manager { return defaultManager } diff --git a/pkg/component/core.go b/pkg/component/core.go index 28d3198ce9..e30dece6ad 100644 --- a/pkg/component/core.go +++ b/pkg/component/core.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package component import ( @@ -26,7 +44,7 @@ func Database() rainbond.Component { // K8sClient - func K8sClient() rainbond.Component { - return k8s.K8sClient() + return k8s.Client() } // HubRegistry - diff --git a/pkg/component/etcd/etcdComponent.go b/pkg/component/etcd/etcdComponent.go index 6cef0f8f00..c1cb155e84 100644 --- a/pkg/component/etcd/etcdComponent.go +++ b/pkg/component/etcd/etcdComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package etcd import ( diff --git a/pkg/component/grpc/grpcComponent.go b/pkg/component/grpc/grpcComponent.go index 19b771945f..e39758dff1 100644 --- a/pkg/component/grpc/grpcComponent.go +++ b/pkg/component/grpc/grpcComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package grpc import ( diff --git a/pkg/component/hubregistry/registryComponent.go b/pkg/component/hubregistry/registryComponent.go index 5d524b30fd..45c4ec7f10 100644 --- a/pkg/component/hubregistry/registryComponent.go +++ b/pkg/component/hubregistry/registryComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package hubregistry import ( diff --git a/pkg/component/k8s/k8sComponent.go b/pkg/component/k8s/k8sComponent.go index 1c8465d966..08bc196587 100644 --- a/pkg/component/k8s/k8sComponent.go +++ b/pkg/component/k8s/k8sComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package k8s import ( @@ -20,8 +38,8 @@ import ( gateway "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/typed/apis/v1beta1" ) -// k8sComponent - -type K8sComponent struct { +// Component - +type Component struct { RestConfig *rest.Config Clientset *kubernetes.Clientset GatewayClient *v1beta1.GatewayV1beta1Client @@ -34,14 +52,16 @@ type K8sComponent struct { Mapper meta.RESTMapper } -var defaultK8sComponent *K8sComponent +var defaultK8sComponent *Component -func K8sClient() *K8sComponent { - defaultK8sComponent = &K8sComponent{} +// Client - +func Client() *Component { + defaultK8sComponent = &Component{} return defaultK8sComponent } -func (k *K8sComponent) Start(ctx context.Context, cfg *configs.Config) error { +// Start - +func (k *Component) Start(ctx context.Context, cfg *configs.Config) error { logrus.Infof("init k8s client...") config, err := k8sutil.NewRestConfig(cfg.APIConfig.KubeConfigPath) k.RestConfig = config @@ -93,9 +113,11 @@ func (k *K8sComponent) Start(ctx context.Context, cfg *configs.Config) error { return nil } -func (k *K8sComponent) CloseHandle() { +// CloseHandle - +func (k *Component) CloseHandle() { } -func Default() *K8sComponent { +// Default - +func Default() *Component { return defaultK8sComponent } diff --git a/pkg/component/mq/mqComponent.go b/pkg/component/mq/mqComponent.go index 1684d02f8e..e7093624f5 100644 --- a/pkg/component/mq/mqComponent.go +++ b/pkg/component/mq/mqComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package mq import ( diff --git a/pkg/component/prom/promComponent.go b/pkg/component/prom/promComponent.go index f9b5baf681..e63d629adc 100644 --- a/pkg/component/prom/promComponent.go +++ b/pkg/component/prom/promComponent.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package prom import ( diff --git a/pkg/gogo/go.go b/pkg/gogo/go.go index 9871586d31..f7acbecf14 100644 --- a/pkg/gogo/go.go +++ b/pkg/gogo/go.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package gogo import ( diff --git a/pkg/gogo/option.go b/pkg/gogo/option.go index f5640c9b93..d0dc90aa21 100644 --- a/pkg/gogo/option.go +++ b/pkg/gogo/option.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package gogo import "context" diff --git a/pkg/interceptors/http.go b/pkg/interceptors/http.go index 565a16b5c8..ff994c2ddd 100644 --- a/pkg/interceptors/http.go +++ b/pkg/interceptors/http.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package interceptors import ( diff --git a/pkg/rainbond/component.go b/pkg/rainbond/component.go index 98b2d8f845..b1f1c85f20 100644 --- a/pkg/rainbond/component.go +++ b/pkg/rainbond/component.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package rainbond import ( diff --git a/pkg/rainbond/registry.go b/pkg/rainbond/registry.go index 6cc1e90efa..c6f53e338c 100644 --- a/pkg/rainbond/registry.go +++ b/pkg/rainbond/registry.go @@ -1,3 +1,21 @@ +// RAINBOND, Application Management Platform +// Copyright (C) 2021-2024 Goodrain Co., Ltd. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. For any non-GPL usage of Rainbond, +// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. +// must be obtained first. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + package rainbond import ( diff --git a/test/shell/echo1.sh b/test/shell/echo1.sh deleted file mode 100644 index ad8c41b82f..0000000000 --- a/test/shell/echo1.sh +++ /dev/null @@ -1 +0,0 @@ -echo "{\"inner\":{\"HOME_PATH\":\"/home\"},\"type\":\"check\",\"exec_status\":\"Success\",\"status\":[{\"next_tasks\":[\"echo2\"]}]}" >&2 \ No newline at end of file diff --git a/test/shell/echo2.sh b/test/shell/echo2.sh deleted file mode 100644 index c439628fa3..0000000000 --- a/test/shell/echo2.sh +++ /dev/null @@ -1 +0,0 @@ - echo "{\"inner\":{\"HOME_PATH\":\"/home\"},\"type\":\"install\",\"exec_status\":\"Success\",\"status\":[{\"condition_type\":\"INIT_ECHO\",\"condition_status\":\"True\"}]}" >&2 diff --git a/worker/appm/componentdefinition/componentdefinition_test.go b/worker/appm/componentdefinition/componentdefinition_test.go deleted file mode 100644 index beb4fe95c0..0000000000 --- a/worker/appm/componentdefinition/componentdefinition_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// RAINBOND, Application Management Platform -// Copyright (C) 2021-2021 Goodrain Co., Ltd. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. For any non-GPL usage of Rainbond, -// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd. -// must be obtained first. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -package componentdefinition - -import ( - "encoding/json" - "testing" - - v1 "github.com/goodrain/rainbond/worker/appm/types/v1" -) - -func TestTemplateContext(t *testing.T) { - ctx := NewTemplateContext(&v1.AppService{AppServiceBase: v1.AppServiceBase{ServiceID: "1234567890", ServiceAlias: "niasdjaj", TenantID: "098765432345678"}}, cueTemplate, map[string]interface{}{ - "kubernetes": map[string]interface{}{ - "name": "service-name", - "namespace": "t-namesapce", - }, - "port": []map[string]interface{}{}, - }) - manifests, err := ctx.GenerateComponentManifests() - if err != nil { - t.Fatal(err) - } - show, _ := json.Marshal(manifests) - t.Log(string(show)) -} From 645c9cfa8ead4cde84e96f6215d93a573724f736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Wed, 10 Jan 2024 11:31:26 +0800 Subject: [PATCH 42/43] perf: optimize communication exceptions --- api/controller/websocket.go | 5 +++-- cmd/api/main.go | 7 ++++--- cmd/api/option/option.go | 8 ++++++-- config/configs/config.go | 10 ++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/api/controller/websocket.go b/api/controller/websocket.go index 5cb27a11f6..24ba005670 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -20,6 +20,7 @@ package controller import ( "context" + "github.com/goodrain/rainbond/config/configs" "net/http" "os" "path" @@ -37,8 +38,8 @@ type DockerConsole struct { socketproxy proxy.Proxy } -var defaultDockerConsoleEndpoints = []string{"rbd-webcli:7171"} -var defaultEventLogEndpoints = []string{"local=>rbd-eventlog:6363"} +var defaultDockerConsoleEndpoints = configs.Default().APIConfig.DockerConsoleServers +var defaultEventLogEndpoints = configs.Default().APIConfig.EventLogEndpoints var dockerConsole *DockerConsole diff --git a/cmd/api/main.go b/cmd/api/main.go index 2ddbf1d35d..ec976a9713 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -42,11 +42,12 @@ func main() { pflag.Parse() s.SetLog() - // 启动 rbd-api - err := rainbond.New(context.Background(), &configs.Config{ + configs.SetDefault(&configs.Config{ AppName: "rbd-api", APIConfig: s.Config, - }).Registry(component.Database()). + }) + // 启动 rbd-api + err := rainbond.New(context.Background(), configs.Default()).Registry(component.Database()). Registry(component.Grpc()). Registry(component.Event()). Registry(component.K8sClient()). diff --git a/cmd/api/option/option.go b/cmd/api/option/option.go index 67d3f3b3e0..45a25c45bf 100644 --- a/cmd/api/option/option.go +++ b/cmd/api/option/option.go @@ -33,6 +33,8 @@ type Config struct { APIAddrSSL string DBConnectionInfo string EventLogServers []string + DockerConsoleServers []string + EventLogEndpoints []string NodeAPI []string BuilderAPI []string V1API string @@ -99,7 +101,6 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&a.V1API, "v1-api", "127.0.0.1:8887", "the region v1 api") fs.StringSliceVar(&a.BuilderAPI, "builder-api", []string{"rbd-chaos:3228"}, "the builder api") fs.BoolVar(&a.StartRegionAPI, "start", false, "Whether to start region old api") - fs.StringSliceVar(&a.EtcdEndpoint, "etcd", []string{"http://127.0.0.1:2379"}, "etcd server or proxy address") fs.StringVar(&a.EtcdCaFile, "etcd-ca", "", "verify etcd certificates of TLS-enabled secure servers using this CA bundle") fs.StringVar(&a.EtcdCertFile, "etcd-cert", "", "identify secure etcd client using this TLS certificate file") fs.StringVar(&a.EtcdKeyFile, "etcd-key", "", "identify secure etcd client using this TLS key file") @@ -118,12 +119,15 @@ func (a *APIServer) AddFlags(fs *pflag.FlagSet) { fs.BoolVar(&a.ShowSQL, "show-sql", false, "The trigger for showing sql.") fs.StringVar(&a.GrctlImage, "shell-image", "registry.cn-hangzhou.aliyuncs.com/goodrain/rbd-shell:v5.13.0-release", "use shell image") + fs.StringSliceVar(&a.EtcdEndpoint, "etcd", []string{"http://rbd-etcd:2379"}, "etcd server or proxy address") + fs.StringSliceVar(&a.DockerConsoleServers, "docker-console", []string{"rbd-webcli:7171"}, "docker console address") fs.StringVar(&a.PrometheusEndpoint, "prom-api", "rbd-monitor:9999", "The service DNS name of Prometheus api. Default to rbd-monitor:9999") fs.StringVar(&a.RbdHub, "hub-api", "http://rbd-hub:5000", "the rbd-hub server api") fs.StringSliceVar(&a.NodeAPI, "node-api", []string{"rbd-node:6100"}, "the rbd-node server api") fs.StringVar(&a.MQAPI, "mq-api", "rbd-mq:6300", "the rbd-mq server api") fs.StringVar(&a.RbdWorker, "worker-api", "rbd-worker:6535", "the rbd-worker server api") - fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address. simple lb") + fs.StringSliceVar(&a.EventLogServers, "event-servers", []string{"rbd-eventlog:6366"}, "event log server address") + fs.StringSliceVar(&a.EventLogEndpoints, "event-log", []string{"local=>rbd-eventlog:6363"}, "event log websocket address") } diff --git a/config/configs/config.go b/config/configs/config.go index 8964578205..14d2febc84 100644 --- a/config/configs/config.go +++ b/config/configs/config.go @@ -13,3 +13,13 @@ type Config struct { Debug bool APIConfig option.Config } + +var defaultConfig *Config + +func Default() *Config { + return defaultConfig +} + +func SetDefault(cfg *Config) { + defaultConfig = cfg +} From f36ce1cfd5ba25e021641b110e6fafbb9f03f272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=86=E6=B5=81=E8=80=8C=E4=B8=8A?= <1666888816@qq.com> Date: Wed, 10 Jan 2024 11:37:56 +0800 Subject: [PATCH 43/43] perf: optimize communication exceptions --- api/controller/websocket.go | 13 +++++-------- config/configs/config.go | 2 ++ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/api/controller/websocket.go b/api/controller/websocket.go index 24ba005670..c7c923e430 100644 --- a/api/controller/websocket.go +++ b/api/controller/websocket.go @@ -38,9 +38,6 @@ type DockerConsole struct { socketproxy proxy.Proxy } -var defaultDockerConsoleEndpoints = configs.Default().APIConfig.DockerConsoleServers -var defaultEventLogEndpoints = configs.Default().APIConfig.EventLogEndpoints - var dockerConsole *DockerConsole // GetDockerConsole get Docker console @@ -49,7 +46,7 @@ func GetDockerConsole() *DockerConsole { return dockerConsole } dockerConsole = &DockerConsole{ - socketproxy: proxy.CreateProxy("dockerconsole", "websocket", defaultDockerConsoleEndpoints), + socketproxy: proxy.CreateProxy("dockerconsole", "websocket", configs.Default().APIConfig.DockerConsoleServers), } //discover.GetEndpointDiscover().AddProject("acp_webcli", dockerConsole.socketproxy) return dockerConsole @@ -71,7 +68,7 @@ type DockerLog struct { func GetDockerLog() *DockerLog { if dockerLog == nil { dockerLog = &DockerLog{ - socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), + socketproxy: proxy.CreateProxy("dockerlog", "websocket", configs.Default().APIConfig.EventLogEndpoints), } //discover.GetEndpointDiscover().AddProject("event_log_event_http", dockerLog.socketproxy) } @@ -94,7 +91,7 @@ var monitorMessage *MonitorMessage func GetMonitorMessage() *MonitorMessage { if monitorMessage == nil { monitorMessage = &MonitorMessage{ - socketproxy: proxy.CreateProxy("monitormessage", "websocket", defaultEventLogEndpoints), + socketproxy: proxy.CreateProxy("monitormessage", "websocket", configs.Default().APIConfig.EventLogEndpoints), } //discover.GetEndpointDiscover().AddProject("event_log_event_http", monitorMessage.socketproxy) } @@ -117,7 +114,7 @@ var eventLog *EventLog func GetEventLog() *EventLog { if eventLog == nil { eventLog = &EventLog{ - socketproxy: proxy.CreateProxy("eventlog", "websocket", defaultEventLogEndpoints), + socketproxy: proxy.CreateProxy("eventlog", "websocket", configs.Default().APIConfig.EventLogEndpoints), } //discover.GetEndpointDiscover().AddProject("event_log_event_http", eventLog.socketproxy) } @@ -189,7 +186,7 @@ type PubSubControll struct { func GetPubSubControll() *PubSubControll { if pubSubControll == nil { pubSubControll = &PubSubControll{ - socketproxy: proxy.CreateProxy("dockerlog", "websocket", defaultEventLogEndpoints), + socketproxy: proxy.CreateProxy("dockerlog", "websocket", configs.Default().APIConfig.EventLogEndpoints), } //discover.GetEndpointDiscover().AddProject("event_log_event_http", pubSubControll.socketproxy) } diff --git a/config/configs/config.go b/config/configs/config.go index 14d2febc84..03272fd7e8 100644 --- a/config/configs/config.go +++ b/config/configs/config.go @@ -16,10 +16,12 @@ type Config struct { var defaultConfig *Config +// Default - func Default() *Config { return defaultConfig } +// SetDefault - func SetDefault(cfg *Config) { defaultConfig = cfg }