From 5a45bc4885f714f69f128128685c021f2579871a Mon Sep 17 00:00:00 2001 From: Michael Li Date: Fri, 22 Jul 2022 15:00:37 +0800 Subject: [PATCH] single intilialize DataService/TweetSearchService/ObjectStorageService --- internal/dao/dao.go | 114 ++++++++++++++++++++---------------- internal/routers/api/api.go | 2 +- internal/service/service.go | 6 +- 3 files changed, 68 insertions(+), 54 deletions(-) diff --git a/internal/dao/dao.go b/internal/dao/dao.go index 821af6f5..10e7cc61 100644 --- a/internal/dao/dao.go +++ b/internal/dao/dao.go @@ -1,6 +1,8 @@ package dao import ( + "sync" + "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/internal/dao/jinzhu" @@ -11,61 +13,73 @@ import ( "github.com/sirupsen/logrus" ) -func NewDataService() (s core.DataService) { - var v core.VersionInfo - if conf.CfgIf("Gorm") { - s, v = jinzhu.NewDataService() - } else if conf.CfgIf("Sqlx") && conf.CfgIf("MySQL") { - s, v = sakila.NewDataService() - } else if conf.CfgIf("Sqlx") && (conf.CfgIf("Postgres") || conf.CfgIf("PostgreSQL")) { - s, v = slonik.NewDataService() - } else { - // default use gorm as orm for sql database - s, v = jinzhu.NewDataService() - } - logrus.Infof("use %s as data service with version %s", v.Name(), v.Version()) - return +var ( + ts core.TweetSearchService + ds core.DataService + oss core.ObjectStorageService + + onceTs, onceDs, onceOss sync.Once +) + +func DataService() core.DataService { + onceDs.Do(func() { + var v core.VersionInfo + if conf.CfgIf("Gorm") { + ds, v = jinzhu.NewDataService() + } else if conf.CfgIf("Sqlx") && conf.CfgIf("MySQL") { + ds, v = sakila.NewDataService() + } else if conf.CfgIf("Sqlx") && (conf.CfgIf("Postgres") || conf.CfgIf("PostgreSQL")) { + ds, v = slonik.NewDataService() + } else { + // default use gorm as orm for sql database + ds, v = jinzhu.NewDataService() + } + logrus.Infof("use %s as data service with version %s", v.Name(), v.Version()) + }) + return ds } -func NewObjectStorageService() (oss core.ObjectStorageService) { - var v core.VersionInfo - if conf.CfgIf("AliOSS") { - oss, v = storage.NewAliossService() - } else if conf.CfgIf("MinIO") { - oss, v = storage.NewMinioService() - } else if conf.CfgIf("S3") { - oss, v = storage.NewS3Service() - logrus.Infof("use S3 as object storage by version %s", v.Version()) - return - } else if conf.CfgIf("LocalOSS") { - oss, v = storage.NewLocalossService() - } else { - // default use AliOSS as object storage service - oss, v = storage.NewAliossService() - logrus.Infof("use default AliOSS as object storage by version %s", v.Version()) - return - } - logrus.Infof("use %s as object storage by version %s", v.Name(), v.Version()) - return +func ObjectStorageService() core.ObjectStorageService { + onceOss.Do(func() { + var v core.VersionInfo + if conf.CfgIf("AliOSS") { + oss, v = storage.NewAliossService() + } else if conf.CfgIf("MinIO") { + oss, v = storage.NewMinioService() + } else if conf.CfgIf("S3") { + oss, v = storage.NewS3Service() + logrus.Infof("use S3 as object storage by version %s", v.Version()) + return + } else if conf.CfgIf("LocalOSS") { + oss, v = storage.NewLocalossService() + } else { + // default use AliOSS as object storage service + oss, v = storage.NewAliossService() + logrus.Infof("use default AliOSS as object storage by version %s", v.Version()) + return + } + logrus.Infof("use %s as object storage by version %s", v.Name(), v.Version()) + }) + return oss } -func NewTweetSearchService() core.TweetSearchService { - var ( - ts core.TweetSearchService - v core.VersionInfo - ) - ams := newAuthorizationManageService() - if conf.CfgIf("Zinc") { - ts, v = search.NewZincTweetSearchService(ams) - } else if conf.CfgIf("Meili") { - ts, v = search.NewMeiliTweetSearchService(ams) - } else { - // default use Zinc as tweet search service - ts, v = search.NewZincTweetSearchService(ams) - } - logrus.Infof("use %s as tweet search serice by version %s", v.Name(), v.Version()) +func TweetSearchService() core.TweetSearchService { + onceTs.Do(func() { + var v core.VersionInfo + ams := newAuthorizationManageService() + if conf.CfgIf("Zinc") { + ts, v = search.NewZincTweetSearchService(ams) + } else if conf.CfgIf("Meili") { + ts, v = search.NewMeiliTweetSearchService(ams) + } else { + // default use Zinc as tweet search service + ts, v = search.NewZincTweetSearchService(ams) + } + logrus.Infof("use %s as tweet search serice by version %s", v.Name(), v.Version()) - return search.NewBridgeTweetSearchService(ts) + ts = search.NewBridgeTweetSearchService(ts) + }) + return ts } func newAuthorizationManageService() (s core.AuthorizationManageService) { diff --git a/internal/routers/api/api.go b/internal/routers/api/api.go index f71491a1..3ee6c52d 100644 --- a/internal/routers/api/api.go +++ b/internal/routers/api/api.go @@ -10,5 +10,5 @@ var ( ) func Initialize() { - objectStorage = dao.NewObjectStorageService() + objectStorage = dao.ObjectStorageService() } diff --git a/internal/service/service.go b/internal/service/service.go index 7a1ad7ce..c14c3153 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -14,8 +14,8 @@ var ( ) func Initialize() { - ds = dao.NewDataService() - ts = dao.NewTweetSearchService() - oss = dao.NewObjectStorageService() + ds = dao.DataService() + ts = dao.TweetSearchService() + oss = dao.ObjectStorageService() DisablePhoneVerify = !conf.CfgIf("Sms") }