From 0e1f31c0b9e8711c94ebee4c5766196c64766b15 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 1 Jun 2022 13:41:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E7=B3=BB=E7=BB=9F=E6=8E=A5=E5=8F=A3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/web/module.go | 13 ++++ services/servicebase.go | 6 ++ sys/configure/configure.go | 141 +++++++++++++++++++++++++++++++++++-- sys/configure/core.go | 15 ++++ sys/configure/options.go | 2 +- 5 files changed, 172 insertions(+), 5 deletions(-) diff --git a/modules/web/module.go b/modules/web/module.go index 50d88ec37..51a1efe62 100644 --- a/modules/web/module.go +++ b/modules/web/module.go @@ -3,6 +3,8 @@ package web import ( "go_dreamfactory/comm" "go_dreamfactory/modules" + "go_dreamfactory/sys/configure" + cfg "go_dreamfactory/sys/configure/structs" "github.com/liwei1dao/lego/core" ) @@ -15,6 +17,7 @@ func NewModule() core.IModule { type Web struct { modules.ModuleBase options *Options + table *cfg.TbItem user_comp *User_Comp } @@ -34,6 +37,16 @@ func (this *Web) Init(service core.IService, module core.IModule, options core.I func (this *Web) Start() (err error) { err = this.ModuleBase.Start() + var ( + data interface{} + ) + if err = configure.RegisterConfigure("tbitem.json", cfg.NewTbItem); err != nil { + return + } + if data, err = configure.GetConfigure("tbitem.json"); err != nil { + return + } + this.table = data.(*cfg.TbItem) return } diff --git a/services/servicebase.go b/services/servicebase.go index c5ec26f62..9fe4ae523 100644 --- a/services/servicebase.go +++ b/services/servicebase.go @@ -3,6 +3,7 @@ package services import ( "fmt" "go_dreamfactory/sys/cache" + "go_dreamfactory/sys/configure" "go_dreamfactory/sys/db" "github.com/liwei1dao/lego/base/rpcx" @@ -25,4 +26,9 @@ func (this *ServiceBase) InitSys() { } else { log.Infof("init sys.db success!") } + if err := configure.OnInit(this.GetSettings().Sys["configure"]); err != nil { + panic(fmt.Sprintf("init sys.configure err: %s", err.Error())) + } else { + log.Infof("init sys.configure success!") + } } diff --git a/sys/configure/configure.go b/sys/configure/configure.go index 4239b209a..c2bb3ccbb 100644 --- a/sys/configure/configure.go +++ b/sys/configure/configure.go @@ -1,19 +1,152 @@ package configure -import "github.com/liwei1dao/lego/sys/redis" +import ( + "fmt" + "io/ioutil" + "os" + "path" + "reflect" + "sync" + + jsoniter "github.com/json-iterator/go" +) + +var typeOfIn = reflect.TypeOf(([]map[string]interface{})(nil)).Elem() +var typeOfError = reflect.TypeOf((*error)(nil)).Elem() + +type configurehandle struct { + configureType reflect.Type + fn reflect.Value +} func newSys(options Options) (sys *Configure, err error) { - sys = &Configure{options: options} + sys = &Configure{ + options: options, + configurehandles: map[string]*configurehandle{}, + configure: map[string]interface{}{}, + } err = sys.init() return } type Configure struct { - options Options - redis redis.ISys + options Options + hlock sync.RWMutex + configurehandles map[string]*configurehandle + clock sync.RWMutex + configure map[string]interface{} } func (this *Configure) init() (err error) { return } + +//加载配置文件 +func (this *Configure) RegisterConfigure(name string, fn interface{}) (err error) { + this.hlock.RLock() + _, ok := this.configurehandles[name] + this.hlock.RUnlock() + if ok { + err = fmt.Errorf("重复 注册配置【%s】", name) + return + } + fnvalue := reflect.ValueOf(fn) + if fnvalue.Type().NumIn() != 1 { + err = fmt.Errorf("LoadConfigure fn 类型错误! 只接受fn( _buf []map[string]interface{})(v,error) 函数参数") + return + } + inType := fnvalue.Type().In(0) + if inType.Elem() != typeOfIn { + err = fmt.Errorf("LoadConfigure fn 类型错误! 只接受fn( _buf []map[string]interface{})(v,error) 函数参数") + return + } + if fnvalue.Type().NumOut() != 2 { + err = fmt.Errorf("LoadConfigure fn 类型错误! 只接受fn( _buf []map[string]interface{})(v,error) 函数参数") + return + } + dataType := fnvalue.Type().Out(0) + if dataType.Kind() != reflect.Ptr { + err = fmt.Errorf("LoadConfigure fn 类型错误! 只接受fn( _buf []map[string]interface{})(v,error) 函数参数") + return + } + if returnType := fnvalue.Type().Out(1); returnType != typeOfError { + err = fmt.Errorf("LoadConfigure fn 类型错误! 只接受fn( _buf []map[string]interface{})(v,error) 函数参数") + return + } + handle := &configurehandle{ + configureType: dataType, + fn: fnvalue, + } + if err = this.loaderConfigure(name, handle); err != nil { + return + } + this.hlock.Lock() + this.configurehandles[name] = handle + this.hlock.Unlock() + return +} + +//更新配置信息 +func (this *Configure) UpdateConfigure(names ...string) (err error) { + for _, v := range names { + this.hlock.RLock() + handle, ok := this.configurehandles[v] + this.hlock.RUnlock() + if !ok { + err = fmt.Errorf("no RegisterConfigure:%s", v) + return + } + if err = this.loaderConfigure(v, handle); err != nil { + err = fmt.Errorf("loaderConfigure:%s err:%v", v, err) + return + } + } + return +} + +//读取配置文件 +func (this *Configure) GetConfigure(name string) (v interface{}, err error) { + this.clock.RLock() + v, ok := this.configure[name] + this.clock.RUnlock() + if !ok { + err = fmt.Errorf("no LoadConfigure:%s", name) + } + return +} + +//加载配置文件 +func (this *Configure) loaderConfigure(name string, handle *configurehandle) (err error) { + var ( + fliepath string + file *os.File + bytes []byte + data []map[string]interface{} + returnValues []reflect.Value + ) + fliepath = path.Join(this.options.ConfigurePath, name) + if file, err = os.Open(fliepath); err != nil { + err = fmt.Errorf("no fond file:%s", fliepath) + return + } + defer file.Close() + if bytes, err = ioutil.ReadAll(file); err != nil { + err = fmt.Errorf("read file:%s err:%v", fliepath, err) + return + } + if err = jsoniter.Unmarshal(bytes, &data); err != nil { + err = fmt.Errorf("read file:%s json.Unmarshal err:%v", fliepath, err) + return + } + returnValues = handle.fn.Call([]reflect.Value{reflect.ValueOf(data)}) + errInter := returnValues[1].Interface() + if errInter != nil { + err = fmt.Errorf("read file:%s load.fn err:%v", fliepath, errInter) + return + } + this.clock.Lock() + this.configure[name] = returnValues[0].Interface() + this.clock.Lock() + return +} diff --git a/sys/configure/core.go b/sys/configure/core.go index bcde8cb13..77de5b75b 100644 --- a/sys/configure/core.go +++ b/sys/configure/core.go @@ -7,6 +7,9 @@ package configure type ( ISys interface { + RegisterConfigure(name string, fn interface{}) (err error) //注册配置 + UpdateConfigure(names ...string) (err error) //更新配置 + GetConfigure(name string) (v interface{}, err error) //获取配置 } ) @@ -29,3 +32,15 @@ func NewSys(option ...Option) (sys ISys, err error) { defsys, err = newSys(options) return } + +func RegisterConfigure(name string, fn interface{}) (err error) { + return defsys.RegisterConfigure(name, fn) +} + +func UpdateConfigure(names ...string) (err error) { + return defsys.UpdateConfigure(names...) +} + +func GetConfigure(name string) (v interface{}, err error) { + return defsys.GetConfigure(name) +} diff --git a/sys/configure/options.go b/sys/configure/options.go index 2cdad3844..f0990c4a9 100644 --- a/sys/configure/options.go +++ b/sys/configure/options.go @@ -6,6 +6,7 @@ import ( type Option func(*Options) type Options struct { + ConfigurePath string } func newOptions(config map[string]interface{}, opts ...Option) (Options, error) { @@ -16,7 +17,6 @@ func newOptions(config map[string]interface{}, opts ...Option) (Options, error) for _, o := range opts { o(&options) } - return options, nil } From 126ff41523b89b109ba1026c44f5cc7037bac6ec Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 1 Jun 2022 14:52:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ linux-build.bat | 6 ++++++ modules/web/user_comp.go | 1 + services/servicebase.go | 12 ------------ services/worker/main.go | 14 ++++++++++++++ sys/configure/configure.go | 2 +- 6 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 linux-build.bat diff --git a/.gitignore b/.gitignore index 9894f773a..4ae7dda1f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,7 @@ bin/conf .vscode ./bin/conf ./bin/log +./bin/gateway +./bin/worker ~$*.xlsx cmd/luban/ \ No newline at end of file diff --git a/linux-build.bat b/linux-build.bat new file mode 100644 index 000000000..3500766cc --- /dev/null +++ b/linux-build.bat @@ -0,0 +1,6 @@ +set GOOS=linux +set CGO_ENABLED=0 +del bin/gateway,bin/worker +go build -o bin/gateway services/gateway/main.go +go build -o bin/worker services/worker/main.go +REM pause \ No newline at end of file diff --git a/modules/web/user_comp.go b/modules/web/user_comp.go index 2aa55307d..62761271a 100644 --- a/modules/web/user_comp.go +++ b/modules/web/user_comp.go @@ -24,5 +24,6 @@ func (this *User_Comp) Login(ctx context.Context, session comm.IUserSession, rsp session.SendMsg("LogigResp", &pb.UserLoginResp{ Code: 200, }) + return nil } diff --git a/services/servicebase.go b/services/servicebase.go index 9fe4ae523..1da8b2afa 100644 --- a/services/servicebase.go +++ b/services/servicebase.go @@ -2,9 +2,7 @@ package services import ( "fmt" - "go_dreamfactory/sys/cache" "go_dreamfactory/sys/configure" - "go_dreamfactory/sys/db" "github.com/liwei1dao/lego/base/rpcx" "github.com/liwei1dao/lego/sys/log" @@ -16,16 +14,6 @@ type ServiceBase struct { func (this *ServiceBase) InitSys() { this.RPCXService.InitSys() - if err := cache.OnInit(this.GetSettings().Sys["cache"]); err != nil { - panic(fmt.Sprintf("init sys.cache err: %s", err.Error())) - } else { - log.Infof("init sys.cache success!") - } - if err := db.OnInit(this.GetSettings().Sys["db"]); err != nil { - panic(fmt.Sprintf("init sys.db err: %s", err.Error())) - } else { - log.Infof("init sys.db success!") - } if err := configure.OnInit(this.GetSettings().Sys["configure"]); err != nil { panic(fmt.Sprintf("init sys.configure err: %s", err.Error())) } else { diff --git a/services/worker/main.go b/services/worker/main.go index 99a9f51f2..71fe209aa 100644 --- a/services/worker/main.go +++ b/services/worker/main.go @@ -2,12 +2,16 @@ package main import ( "flag" + "fmt" "go_dreamfactory/modules/web" "go_dreamfactory/services" + "go_dreamfactory/sys/cache" + "go_dreamfactory/sys/db" "github.com/liwei1dao/lego" "github.com/liwei1dao/lego/base/rpcx" "github.com/liwei1dao/lego/core" + "github.com/liwei1dao/lego/sys/log" ) var ( @@ -41,4 +45,14 @@ type Service struct { func (this *Service) InitSys() { this.ServiceBase.InitSys() + if err := cache.OnInit(this.GetSettings().Sys["cache"]); err != nil { + panic(fmt.Sprintf("init sys.cache err: %s", err.Error())) + } else { + log.Infof("init sys.cache success!") + } + if err := db.OnInit(this.GetSettings().Sys["db"]); err != nil { + panic(fmt.Sprintf("init sys.db err: %s", err.Error())) + } else { + log.Infof("init sys.db success!") + } } diff --git a/sys/configure/configure.go b/sys/configure/configure.go index c2bb3ccbb..6a7342c02 100644 --- a/sys/configure/configure.go +++ b/sys/configure/configure.go @@ -147,6 +147,6 @@ func (this *Configure) loaderConfigure(name string, handle *configurehandle) (er } this.clock.Lock() this.configure[name] = returnValues[0].Interface() - this.clock.Lock() + this.clock.Unlock() return } From ff092dcf1039410f04c1f74a2d04bb2b72d667e8 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 1 Jun 2022 15:27:22 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E7=94=A8=E6=88=B7Id?= =?UTF-8?q?=E8=A1=A8=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sys/db/db.go | 7 +++++-- sys/db/user.go | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/sys/db/db.go b/sys/db/db.go index 0162aad8a..ff084ef3f 100644 --- a/sys/db/db.go +++ b/sys/db/db.go @@ -16,9 +16,12 @@ type DB struct { } func (this *DB) init() (err error) { - this.mgo, err = mgo.NewSys( + if this.mgo, err = mgo.NewSys( mgo.SetMongodbUrl(this.options.MongodbUrl), mgo.SetMongodbDatabase(this.options.MongodbDatabase), - ) + ); err != nil { + return + } + err = this.checkUserIdInit() return } diff --git a/sys/db/user.go b/sys/db/user.go index 72ded4736..e1cf9c692 100644 --- a/sys/db/user.go +++ b/sys/db/user.go @@ -1,15 +1,52 @@ package db import ( + "context" + "fmt" "go_dreamfactory/pb" + "math/rand" + "time" "github.com/liwei1dao/lego/core" + "github.com/liwei1dao/lego/sys/log" + "go.mongodb.org/mongo-driver/bson" ) const ( //Redis - DB_UserTable core.SqlTable = "user" //会话列表 + DB_UserTable core.SqlTable = "user" //用户表 + DB_UserIdTable core.SqlTable = "userid" //用户id表 ) +//校验数据库初始化工作是否完成 +func (this DB) checkUserIdInit() (err error) { + ctx, _ := context.WithTimeout(context.Background(), time.Second*60) + count, err := this.mgo.CountDocuments(DB_UserIdTable, bson.M{}) + if err != nil || count == 0 { + //批量插入数据 + leng := 1000000 + cIds := make([]interface{}, leng) + for i, _ := range cIds { + cIds[i] = 1000000 + i + } + data := make([]interface{}, leng) + r := rand.New(rand.NewSource(time.Now().Unix())) + n := 0 + for _, i := range r.Perm(leng) { + data[n] = bson.M{"_id": i} + n++ + } + var ( + err error + ) + begin := time.Now() + if _, err = this.mgo.InsertManyByCtx(DB_UserIdTable, ctx, data); err != nil { + return fmt.Errorf("checkUserIdInit err=%s", err.Error()) + } + log.Debugf("checkUserIdInit succ time consuming:%v", time.Now().Sub(begin)) + } + return +} + //更新用户数据到DB func (this *DB) UpdateUser(data *pb.DB_UserData) (err error) {