Skip to content

Commit 9c50cf8

Browse files
committed
fix: add the logic mysql
1 parent d682eff commit 9c50cf8

File tree

11 files changed

+162
-9
lines changed

11 files changed

+162
-9
lines changed

app/pkg/code/code_generated.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/pkg/code/db.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package code
33
//go:generate codeg -type=int
44
const (
55
// ErrConnectDB - 500: Init db error.
6-
ErrConnectDB int = iota + 100601
6+
ErrConnectDB int = iota + 100101
77

88
// ErrConnectGRPC - 500: Connect to grpc error.
99
ErrConnectGRPC

app/pkg/code/error_code_generated.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,5 @@
3838
| ErrSmsSend | 100404 | 400 | Send sms error |
3939
| ErrCodeNotExist | 100405 | 400 | Sms code incorrect or expired |
4040
| ErrCodeInCorrect | 100406 | 400 | Sms code incorrect |
41+
| ErrCodeInvalidParam | 100407 | 400 | Invalid param |
4142

app/pkg/code/user.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ const (
2020

2121
// ErrCodeInCorrect - 400: Sms code incorrect.
2222
ErrCodeInCorrect
23+
24+
// ErrCodeInvalidParam - 400: Invalid param.
25+
ErrCodeInvalidParam
2326
)

app/pkg/options/mysql.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package options
2+
3+
import (
4+
"time"
5+
6+
"github.com/spf13/pflag"
7+
)
8+
9+
type MySQLOptions struct {
10+
Host string `json:"host,omitempty" mapstructure:"host,omitempty"`
11+
Port string `json:"port,omitempty" mapstructure:"port,omitempty"`
12+
Username string `json:"username,omitempty" mapstructure:"username,omitempty"`
13+
Password string `json:"password,omitempty" mapstructure:"password,omitempty"`
14+
Database string `json:"database" mapstructure:"database"`
15+
LogLevel int `json:"log-level,omitempty" mapstructure:"log-level,omitempty"`
16+
//连接池会用到
17+
MaxIdleConnections int `json:"max-idle-connections,omitempty" mapstructure:"max-idle-connections,omitempty"`
18+
MaxConnectionLifetime time.Duration `json:"max-connection-lifetime,omitempty" mapstructure:"max-connection-lifetime,omitempty"`
19+
MaxOpenConnections int `json:"max-open-connections,omitempty" mapstructure:"max-open-connections,omitempty"`
20+
}
21+
22+
func NewMySQLOptions() *MySQLOptions {
23+
return &MySQLOptions{
24+
Host: "127.0.0.1",
25+
Port: "3306",
26+
Username: "",
27+
Password: "",
28+
Database: "",
29+
MaxIdleConnections: 100,
30+
MaxOpenConnections: 100,
31+
MaxConnectionLifetime: time.Duration(10) * time.Second,
32+
LogLevel: 1,
33+
}
34+
}
35+
36+
// Validate verifies flags passed to ServerOptions.
37+
func (so *MySQLOptions) Validate() []error {
38+
errs := []error{}
39+
return errs
40+
}
41+
42+
// AddFlags adds flags related to server storage for a specific APIServer to the specified FlagSet.
43+
func (mo *MySQLOptions) AddFlags(fs *pflag.FlagSet) {
44+
fs.StringVar(&mo.Host, "mysql.host", mo.Host, ""+
45+
"MySQL service host address. If left blank, the following related mysql options will be ignored.")
46+
47+
fs.StringVar(&mo.Port, "mysql.port", mo.Port, ""+
48+
"MySQL service port")
49+
50+
fs.StringVar(&mo.Username, "mysql.username", mo.Username, ""+
51+
"Username for access to mysql service.")
52+
53+
fs.StringVar(&mo.Password, "mysql.password", mo.Password, ""+
54+
"Password for access to mysql, should be used pair with password.")
55+
56+
fs.StringVar(&mo.Database, "mysql.database", mo.Database, ""+
57+
"Database name for the server to use.")
58+
59+
fs.IntVar(&mo.MaxIdleConnections, "mysql.max-idle-connections", mo.MaxOpenConnections, ""+
60+
"Maximum idle connections allowed to connect to mysql.")
61+
62+
fs.IntVar(&mo.MaxOpenConnections, "mysql.max-open-connections", mo.MaxOpenConnections, ""+
63+
"Maximum open connections allowed to connect to mysql.")
64+
65+
fs.DurationVar(&mo.MaxConnectionLifetime, "mysql.max-connection-life-time", mo.MaxConnectionLifetime, ""+
66+
"Maximum connection life time allowed to connecto to mysql.")
67+
68+
fs.IntVar(&mo.LogLevel, "mysql.log-mode", mo.LogLevel, ""+
69+
"Specify gorm log level.")
70+
}

app/user/srv/config/config.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ var _ app.CliOptions = &Config{}
1111

1212
func New() *Config {
1313
return &Config{
14-
Log: log.NewOptions(),
15-
Server: options.NewServerOptions(),
16-
Registry: options.NewRegistryOptions(),
17-
Telemetry: options.NewTelemetryOptions(),
14+
Log: log.NewOptions(),
15+
Server: options.NewServerOptions(),
16+
Registry: options.NewRegistryOptions(),
17+
Telemetry: options.NewTelemetryOptions(),
18+
MySQLOptions: options.NewMySQLOptions(),
1819
}
1920
}
2021

@@ -25,7 +26,8 @@ type Config struct {
2526
// 注册中心
2627
Registry *options.RegistryOptions `json:"registry" mapstructure:"registry"`
2728
// 链路追踪
28-
Telemetry *options.TelemetryOptions `json:"telemetry" mapstructure:"telemetry"`
29+
Telemetry *options.TelemetryOptions `json:"telemetry" mapstructure:"telemetry"`
30+
MySQLOptions *options.MySQLOptions `json:"mysql" mapstructure:"mysql"`
2931
}
3032

3133
// Flags implements app.CliOptions interface.Add flags to the specified FlagSet object.
@@ -35,6 +37,7 @@ func (c *Config) Flags() (fss cliflag.NamedFlagSets) {
3537
c.Server.AddFlags(fss.FlagSet("server"))
3638
c.Registry.AddFlags(fss.FlagSet("registry"))
3739
c.Telemetry.AddFlags(fss.FlagSet("telemetry"))
40+
c.MySQLOptions.AddFlags(fss.FlagSet("mysql"))
3841
return fss
3942
}
4043

@@ -45,5 +48,6 @@ func (c *Config) Validate() (errors []error) {
4548
errors = append(errors, c.Server.Validate()...)
4649
errors = append(errors, c.Registry.Validate()...)
4750
errors = append(errors, c.Telemetry.Validate()...)
51+
errors = append(errors, c.MySQLOptions.Validate()...)
4852
return
4953
}

app/user/srv/data/v1/db/mysql.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package db
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
7+
"github.com/CoderI421/gframework/app/pkg/code"
8+
"github.com/CoderI421/gframework/app/pkg/options"
9+
"github.com/CoderI421/gframework/pkg/errors"
10+
"gorm.io/driver/mysql"
11+
"gorm.io/gorm"
12+
)
13+
14+
var (
15+
dbFactory *gorm.DB
16+
once sync.Once
17+
)
18+
19+
func GetDBFactoryOr(mysqlOpts *options.MySQLOptions) (*gorm.DB, error) {
20+
if mysqlOpts == nil && dbFactory == nil {
21+
return nil, errors.WithCode(code.ErrConnectDB, "failed to get mysql store factory")
22+
23+
}
24+
var err error
25+
once.Do(func() {
26+
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
27+
mysqlOpts.Username,
28+
mysqlOpts.Password,
29+
mysqlOpts.Host,
30+
mysqlOpts.Port,
31+
mysqlOpts.Database)
32+
dbFactory, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
33+
if err != nil {
34+
return
35+
}
36+
sqlDB, _ := dbFactory.DB()
37+
//允许连接多少个mysql
38+
sqlDB.SetMaxOpenConns(mysqlOpts.MaxOpenConnections)
39+
//允许最大的空闲的连接数
40+
sqlDB.SetMaxIdleConns(mysqlOpts.MaxIdleConnections)
41+
//重用连接的最大时长
42+
sqlDB.SetConnMaxLifetime(mysqlOpts.MaxConnectionLifetime)
43+
44+
})
45+
if dbFactory == nil || err != nil {
46+
return nil, errors.WithCode(code.ErrConnectDB, "failed to get mysql store factory")
47+
}
48+
return dbFactory, nil
49+
}

app/user/srv/rpc.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ package srv
33
import (
44
"fmt"
55

6+
"github.com/CoderI421/gframework/app/user/srv/data/v1/db"
7+
"github.com/CoderI421/gframework/pkg/log"
8+
69
"github.com/CoderI421/gframework/gmicro/core/trace"
710

811
upbv1 "github.com/CoderI421/gframework/api/user/v1"
912
srv1 "github.com/CoderI421/gframework/app/user/srv/service/v1"
1013

1114
"github.com/CoderI421/gframework/app/user/srv/config"
1215
"github.com/CoderI421/gframework/app/user/srv/controller/user"
13-
"github.com/CoderI421/gframework/app/user/srv/data/v1/mock"
1416
"github.com/CoderI421/gframework/gmicro/server/rpcserver"
1517
)
1618

@@ -24,7 +26,13 @@ func NewUserRPCServer(cfg *config.Config) (*rpcserver.Server, error) {
2426
Batcher: cfg.Telemetry.Batcher,
2527
})
2628

27-
data := mock.NewUsers()
29+
//data := mock.NewUsers()
30+
31+
gormDB, err := db.GetDBFactoryOr(cfg.MySQLOptions)
32+
if err != nil {
33+
log.Fatal(err.Error())
34+
}
35+
data := db.NewUser(gormDB)
2836
srv := srv1.NewUserService(data)
2937
userver := user.NewUserServer(srv)
3038

configs/user/srv.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,15 @@ telemetry:
2727
Name: user-srv
2828
Endpoint: http://127.0.0.1:14268/api/traces
2929
Sampler: 1.0
30-
Bathcer: jaeger
30+
Bathcer: jaeger
31+
32+
mysql:
33+
host: "127.0.0.1" # MySQL 机器 ip,默认 127.0.0.1
34+
port: "3306"
35+
password: "123456" # MySQL 用户密码
36+
username: "root" # MySQL 用户名(建议授权最小权限集)
37+
database: "shopping_go" # iam 系统所用的数据库名
38+
max-idle-connections: 100 # MySQL 最大空闲连接数,默认 100
39+
max-open-connections: 100 # MySQL 最大打开的连接数,默认 100
40+
max-connection-life-time: 10s # 空闲连接最大存活时间,默认 10s
41+
log-level: 4 # GORM log level, 1: silent, 2:error, 3:warn, 4:info

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ require (
5858
github.com/go-logr/logr v1.2.4 // indirect
5959
github.com/go-logr/stdr v1.2.2 // indirect
6060
github.com/go-playground/form/v4 v4.2.0 // indirect
61+
github.com/go-sql-driver/mysql v1.7.0 // indirect
6162
github.com/goccy/go-json v0.10.0 // indirect
6263
github.com/golang/protobuf v1.5.3 // indirect
6364
github.com/gorilla/mux v1.8.0 // indirect
@@ -110,4 +111,5 @@ require (
110111
golang.org/x/text v0.9.0 // indirect
111112
gopkg.in/ini.v1 v1.67.0 // indirect
112113
gopkg.in/yaml.v3 v3.0.1 // indirect
114+
gorm.io/driver/mysql v1.5.1 // indirect
113115
)

0 commit comments

Comments
 (0)