From d432a9630b18cf277f06d7e196605bd7b4554c6b Mon Sep 17 00:00:00 2001 From: John Deng Date: Tue, 20 Aug 2024 13:36:57 +0800 Subject: [PATCH 1/2] refactored decryption code --- examples/gorm/config/application.yml | 2 +- starter/bolt/autoconfigure.go | 14 +++++++------- starter/etcd/autoconfigure.go | 4 ++-- starter/gorm/autoconfigure.go | 8 ++------ starter/redis/autoconfigure.go | 8 ++------ starter/sqlx/autoconfigure.go | 8 ++------ utils/decrypt.go | 13 +++++++++++++ 7 files changed, 29 insertions(+), 28 deletions(-) create mode 100644 utils/decrypt.go diff --git a/examples/gorm/config/application.yml b/examples/gorm/config/application.yml index 402ac24..49aae51 100644 --- a/examples/gorm/config/application.yml +++ b/examples/gorm/config/application.yml @@ -9,8 +9,8 @@ app: - actuator - locale - logging - - gorm - redis + - gorm logging: level: info diff --git a/starter/bolt/autoconfigure.go b/starter/bolt/autoconfigure.go index 55df36c..8cc7735 100644 --- a/starter/bolt/autoconfigure.go +++ b/starter/bolt/autoconfigure.go @@ -37,18 +37,18 @@ func init() { } func (c *boltConfiguration) dataSource() DataSource { - dataSource := GetDataSource() - if !dataSource.IsOpened() { - err := dataSource.Open(c.Properties) + source := GetDataSource() + if !source.IsOpened() { + err := source.Open(c.Properties) if err != nil { log.Error(err.Error()) } } - return dataSource + return source } func (c *boltConfiguration) Repository() Repository { - repository := GetRepository() - repository.SetDataSource(c.dataSource()) - return repository + r := GetRepository() + r.SetDataSource(c.dataSource()) + return r } diff --git a/starter/etcd/autoconfigure.go b/starter/etcd/autoconfigure.go index 9bfc664..7e41024 100644 --- a/starter/etcd/autoconfigure.go +++ b/starter/etcd/autoconfigure.go @@ -47,7 +47,7 @@ func init() { app.Register(newEtcdConfiguration, new(Properties)) } -// EtcdClient create instance named etcdClient +// Client create instance named etcdClient func (c *etcdConfiguration) Client() (cli *Client) { cli = new(Client) var err error @@ -73,7 +73,7 @@ func (c *etcdConfiguration) Client() (cli *Client) { return } -// EtcdRepository create instance named etcdRepository +// Repository create instance named etcdRepository func (c *etcdConfiguration) Repository(cli *Client) Repository { if cli == nil { return nil diff --git a/starter/gorm/autoconfigure.go b/starter/gorm/autoconfigure.go index 30a9452..219a9dc 100644 --- a/starter/gorm/autoconfigure.go +++ b/starter/gorm/autoconfigure.go @@ -17,10 +17,10 @@ package gorm import ( "database/sql" "fmt" + "github.com/hidevopsio/hiboot-data/utils" "github.com/hidevopsio/hiboot/pkg/app" "github.com/hidevopsio/hiboot/pkg/at" "github.com/hidevopsio/hiboot/pkg/log" - "github.com/hidevopsio/hiboot/pkg/utils/crypto/rsa" "gorm.io/driver/mysql" "gorm.io/gorm" "strings" @@ -67,11 +67,7 @@ func (c *configuration) DB() (db *DB, err error) { db = new(DB) password := c.prop.Password if c.prop.Config.Decrypt { - var pwd []byte - pwd, err = rsa.DecryptBase64([]byte(password), []byte(c.prop.Config.DecryptKey)) - if err == nil { - password = string(pwd) - } + password = utils.Decrypt(password, c.prop.Config.DecryptKey) } loc := strings.Replace(c.prop.Loc, "/", "%2F", -1) databaseName := strings.Replace(c.prop.Database, "-", "_", -1) diff --git a/starter/redis/autoconfigure.go b/starter/redis/autoconfigure.go index 505d5e0..83ce009 100644 --- a/starter/redis/autoconfigure.go +++ b/starter/redis/autoconfigure.go @@ -17,10 +17,10 @@ package redis import ( "context" "fmt" + "github.com/hidevopsio/hiboot-data/utils" "github.com/hidevopsio/hiboot/pkg/app" "github.com/hidevopsio/hiboot/pkg/at" "github.com/hidevopsio/hiboot/pkg/log" - "github.com/hidevopsio/hiboot/pkg/utils/crypto/rsa" "github.com/redis/go-redis/v9" "time" ) @@ -69,11 +69,7 @@ func (c *configuration) Client() (cli *Client, err error) { cli = new(Client) password := c.prop.Password if c.prop.Config.Decrypt { - var pwd []byte - pwd, err = rsa.DecryptBase64([]byte(password), []byte(c.prop.Config.DecryptKey)) - if err == nil { - password = string(pwd) - } + password = utils.Decrypt(password, c.prop.Config.DecryptKey) } redisCli = redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%v:%v", c.prop.Host, c.prop.Port), diff --git a/starter/sqlx/autoconfigure.go b/starter/sqlx/autoconfigure.go index 603b488..4ef5939 100644 --- a/starter/sqlx/autoconfigure.go +++ b/starter/sqlx/autoconfigure.go @@ -17,10 +17,10 @@ package sqlx import ( "fmt" _ "github.com/go-sql-driver/mysql" // MySQL 驱动 + "github.com/hidevopsio/hiboot-data/utils" "github.com/hidevopsio/hiboot/pkg/app" "github.com/hidevopsio/hiboot/pkg/at" "github.com/hidevopsio/hiboot/pkg/log" - "github.com/hidevopsio/hiboot/pkg/utils/crypto/rsa" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" // SQLite 驱动 ) @@ -71,11 +71,7 @@ func (c *configuration) DB() (db *DB, err error) { } else { password := c.prop.Password if c.prop.Config.Decrypt { - var pwd []byte - pwd, err = rsa.DecryptBase64([]byte(password), []byte(c.prop.Config.DecryptKey)) - if err == nil { - password = string(pwd) - } + password = utils.Decrypt(password, c.prop.Config.DecryptKey) } dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true", diff --git a/utils/decrypt.go b/utils/decrypt.go new file mode 100644 index 0000000..afe1c59 --- /dev/null +++ b/utils/decrypt.go @@ -0,0 +1,13 @@ +package utils + +import "github.com/hidevopsio/hiboot/pkg/utils/crypto/rsa" + +func Decrypt(param string, pk string) (retVal string) { + if len(param) != 0 { + b, err := rsa.DecryptBase64([]byte(param), []byte(pk)) + if err == nil { + retVal = string(b) + } + } + return +} From e6b6a01420e3f7eb631aababf4e82814dc0d8f0b Mon Sep 17 00:00:00 2001 From: John Deng Date: Tue, 20 Aug 2024 14:13:22 +0800 Subject: [PATCH 2/2] refactored health check for connections --- starter/gorm/autoconfigure.go | 13 +++++++++---- starter/redis/autoconfigure.go | 9 ++++++--- starter/sqlx/autoconfigure.go | 8 ++++++-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/starter/gorm/autoconfigure.go b/starter/gorm/autoconfigure.go index 219a9dc..e16214b 100644 --- a/starter/gorm/autoconfigure.go +++ b/starter/gorm/autoconfigure.go @@ -63,7 +63,9 @@ func (c *configuration) DB() (db *DB, err error) { } // create new connection if it is unhealthy - log.Infof("create a new database connection to %v@%v:%v", c.prop.Username, c.prop.Host, c.prop.Port) + var report string + report = fmt.Sprintf("database %v@%v:%v", c.prop.Username, c.prop.Host, c.prop.Port) + log.Infof("create new connection to %v", report) db = new(DB) password := c.prop.Password if c.prop.Config.Decrypt { @@ -85,11 +87,14 @@ func (c *configuration) DB() (db *DB, err error) { ) db.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { - log.Errorf("failed to connect db: %v", err) + log.Errorf("failed to connect %v, err: %v", report, err) return } - log.Infof("database %v@%v:%v is connected", c.prop.Username, c.prop.Host, c.prop.Port) - c.db = db + if sqlDB.Ping() == nil { + // If the connection is alive, assign the new connection + c.db = db + log.Infof("%v is connected", report) + } return } diff --git a/starter/redis/autoconfigure.go b/starter/redis/autoconfigure.go index 83ce009..abc9223 100644 --- a/starter/redis/autoconfigure.go +++ b/starter/redis/autoconfigure.go @@ -80,9 +80,12 @@ func (c *configuration) Client() (cli *Client, err error) { log.Errorf("failed to connect to redis server: %v", err) return } - log.Infof("redis %v:%v is connected", c.prop.Host, c.prop.Port) - cli.Client = redisCli - c.client = cli + _, err = redisCli.Ping(ctx).Result() + if err == nil { + log.Infof("redis %v:%v is connected", c.prop.Host, c.prop.Port) + cli.Client = redisCli + c.client = cli + } return } diff --git a/starter/sqlx/autoconfigure.go b/starter/sqlx/autoconfigure.go index 4ef5939..1a969eb 100644 --- a/starter/sqlx/autoconfigure.go +++ b/starter/sqlx/autoconfigure.go @@ -87,8 +87,12 @@ func (c *configuration) DB() (db *DB, err error) { log.Errorf("failed to connect db: %v", err) return } - log.Infof("%v is connected", report) - c.db = db + if sqlDB.Ping() == nil { + // If the connection is alive, assign the new connection + c.db = db + log.Infof("%v is connected", report) + } + return }