Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ca00b34e24 | |||
| 922cfd6a02 | |||
| d131495f4f | |||
| 04451d4b2f | |||
| e184fff689 | |||
| 33d1b2e0ee | |||
| 433cd1f8bc | |||
| da87dee55c | |||
| 4fe311b722 |
2
cache/redis/redis.go
vendored
2
cache/redis/redis.go
vendored
@@ -59,6 +59,6 @@ func New(dsn string, hashRadix string) *RedisClient {
|
|||||||
|
|
||||||
func Hash(s string) int {
|
func Hash(s string) int {
|
||||||
h := fnv.New32a()
|
h := fnv.New32a()
|
||||||
h.Write([]byte(s))
|
h.Write([]byte(strings.ToLower(s)))
|
||||||
return int(h.Sum32()) % vars.RedisShardings
|
return int(h.Sum32()) % vars.RedisShardings
|
||||||
}
|
}
|
||||||
|
|||||||
19
conf/new.go
19
conf/new.go
@@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
"git.apinb.com/bsm-sdk/core/env"
|
"git.apinb.com/bsm-sdk/core/env"
|
||||||
"git.apinb.com/bsm-sdk/core/print"
|
"git.apinb.com/bsm-sdk/core/print"
|
||||||
|
"git.apinb.com/bsm-sdk/core/utils"
|
||||||
"git.apinb.com/bsm-sdk/core/vars"
|
"git.apinb.com/bsm-sdk/core/vars"
|
||||||
yaml "gopkg.in/yaml.v3"
|
yaml "gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
@@ -26,9 +27,11 @@ func New(srvKey string, cfg any) {
|
|||||||
vars.HostName, _ = os.Hostname()
|
vars.HostName, _ = os.Hostname()
|
||||||
|
|
||||||
// 构造配置文件路径,输出配置文件信息
|
// 构造配置文件路径,输出配置文件信息
|
||||||
cfp := fmt.Sprintf("%s_%s.yaml", srvKey, env.Runtime.Mode)
|
cfp := fmt.Sprintf("%s_%s.yaml", strings.ToLower(srvKey), env.Runtime.Mode)
|
||||||
cfp = filepath.Join(env.Runtime.Prefix, "etc", cfp)
|
cfp = filepath.Join(env.Runtime.Prefix, "etc", cfp)
|
||||||
|
|
||||||
print.Info("[BSM - %s] Config File: %s", srvKey, cfp)
|
print.Info("[BSM - %s] Config File: %s", srvKey, cfp)
|
||||||
|
print.Info("[BSM - %s] Check Configure ...", vars.ServiceKey)
|
||||||
|
|
||||||
// 读取配置文件内容
|
// 读取配置文件内容
|
||||||
yamlFile, err := os.ReadFile(cfp)
|
yamlFile, err := os.ReadFile(cfp)
|
||||||
@@ -56,6 +59,13 @@ func NotNil(values ...string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PrintInfo(ip string, port int) {
|
||||||
|
print.Success("[BSM - %s] Config Check Success.", vars.ServiceKey)
|
||||||
|
print.Info("[BSM - %s] Service Name: %s", vars.ServiceKey, vars.ServiceKey)
|
||||||
|
print.Info("[BSM - %s] Runtime Mode: %s", vars.ServiceKey, env.Runtime.Mode)
|
||||||
|
print.Info("[BSM - %s] Listen Addr: %s:%d", vars.ServiceKey, ip, port)
|
||||||
|
}
|
||||||
|
|
||||||
func CheckPort(port int) int {
|
func CheckPort(port int) int {
|
||||||
if port <= 0 || port >= 65535 {
|
if port <= 0 || port >= 65535 {
|
||||||
r := rand.New(rand.NewPCG(1000, uint64(time.Now().UnixNano())))
|
r := rand.New(rand.NewPCG(1000, uint64(time.Now().UnixNano())))
|
||||||
@@ -63,3 +73,10 @@ func CheckPort(port int) int {
|
|||||||
}
|
}
|
||||||
return port
|
return port
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CheckIP(ip string) string {
|
||||||
|
if ip == "" {
|
||||||
|
return utils.GetLocationIP()
|
||||||
|
}
|
||||||
|
return ip
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package conf
|
package conf
|
||||||
|
|
||||||
type Base struct {
|
type Base struct {
|
||||||
Service string `yaml:"Service"` // 服务名称
|
Service string `yaml:"Service"` // 服务名称
|
||||||
Port int `yaml:"Port"` // 服务监听端口,0为自动随机端口
|
Port int `yaml:"Port"` // 服务监听端口,0为自动随机端口
|
||||||
Cache string `yaml:"Cache"` // REDIS缓存
|
Cache string `yaml:"Cache"` // REDIS缓存
|
||||||
OnMicroService bool `yaml:"OnMicroService"` // 是否启用微服务
|
SecretKey string `yaml:"SecretKey"` // 服务秘钥
|
||||||
SecretKey string `yaml:"SecretKey"` // 服务秘钥
|
BindIP string `yaml:"BindIP"` // 绑定IP
|
||||||
}
|
}
|
||||||
|
|
||||||
type DBConf struct {
|
type DBConf struct {
|
||||||
@@ -13,6 +13,16 @@ type DBConf struct {
|
|||||||
Source []string `yaml:"Source"` // 数据库连接
|
Source []string `yaml:"Source"` // 数据库连接
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MicroServiceConf struct {
|
||||||
|
Enable bool `yaml:"Enable"` // 是否启用微服务
|
||||||
|
Anonymous []string `yaml:"Anonymous"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GatewayConf struct {
|
||||||
|
Enable bool `yaml:"Enable"` // 是否启用网关服务
|
||||||
|
Port int `yaml:"Port"` // 服务监听端口
|
||||||
|
}
|
||||||
|
|
||||||
type ApmConf struct {
|
type ApmConf struct {
|
||||||
Name string // APM服务名称
|
Name string // APM服务名称
|
||||||
Platform string `yaml:"Platform"` // APM平台:apm,skywalking
|
Platform string `yaml:"Platform"` // APM平台:apm,skywalking
|
||||||
|
|||||||
@@ -8,6 +8,20 @@ import (
|
|||||||
"gorm.io/gorm/schema"
|
"gorm.io/gorm/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func SetOptions(options *types.SqlOptions) *types.SqlOptions {
|
||||||
|
if options == nil {
|
||||||
|
options = &types.SqlOptions{
|
||||||
|
MaxIdleConns: vars.SqlOptionMaxIdleConns,
|
||||||
|
MaxOpenConns: vars.SqlOptionMaxIdleConns,
|
||||||
|
ConnMaxLifetime: vars.SqlOptionConnMaxLifetime,
|
||||||
|
LogStdout: false,
|
||||||
|
Debug: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
||||||
// new grom db.
|
// new grom db.
|
||||||
func NewPostgreSql(dsn string, options *types.SqlOptions) (*gorm.DB, error) {
|
func NewPostgreSql(dsn string, options *types.SqlOptions) (*gorm.DB, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
5
go.mod
5
go.mod
@@ -5,6 +5,7 @@ go 1.24
|
|||||||
require (
|
require (
|
||||||
github.com/FishGoddess/cachego v0.6.1
|
github.com/FishGoddess/cachego v0.6.1
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.17.1
|
github.com/elastic/go-elasticsearch/v8 v8.17.1
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
github.com/nats-io/nats.go v1.39.0
|
github.com/nats-io/nats.go v1.39.0
|
||||||
github.com/oklog/ulid/v2 v2.1.0
|
github.com/oklog/ulid/v2 v2.1.0
|
||||||
github.com/redis/go-redis/v9 v9.7.0
|
github.com/redis/go-redis/v9 v9.7.0
|
||||||
@@ -16,8 +17,8 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bytedance/sonic v1.12.8 // indirect
|
github.com/bytedance/sonic v1.13.2 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.3 // indirect
|
github.com/bytedance/sonic/loader v0.2.4 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||||
github.com/gin-contrib/sse v1.0.0 // indirect
|
github.com/gin-contrib/sse v1.0.0 // indirect
|
||||||
|
|||||||
20
go.sum
20
go.sum
@@ -6,9 +6,13 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
|||||||
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||||
github.com/bytedance/sonic v1.12.8 h1:4xYRVRlXIgvSZ4e8iVTlMF5szgpXd4AfvuWgA8I8lgs=
|
github.com/bytedance/sonic v1.12.8 h1:4xYRVRlXIgvSZ4e8iVTlMF5szgpXd4AfvuWgA8I8lgs=
|
||||||
github.com/bytedance/sonic v1.12.8/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
|
github.com/bytedance/sonic v1.12.8/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8=
|
||||||
|
github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=
|
||||||
|
github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
||||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0=
|
github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0=
|
||||||
github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||||
|
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
|
||||||
|
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
||||||
@@ -23,12 +27,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
|||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=
|
|
||||||
github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk=
|
|
||||||
github.com/elastic/elastic-transport-go/v8 v8.6.1 h1:h2jQRqH6eLGiBSN4eZbQnJLtL4bC5b4lfVFRjw2R4e4=
|
github.com/elastic/elastic-transport-go/v8 v8.6.1 h1:h2jQRqH6eLGiBSN4eZbQnJLtL4bC5b4lfVFRjw2R4e4=
|
||||||
github.com/elastic/elastic-transport-go/v8 v8.6.1/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk=
|
github.com/elastic/elastic-transport-go/v8 v8.6.1/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk=
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.17.0 h1:e9cWksE/Fr7urDRmGPGp47Nsp4/mvNOrU8As1l2HQQ0=
|
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.17.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64=
|
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.17.1 h1:bOXChDoCMB4TIwwGqKd031U8OXssmWLT3UrAr9EGs3Q=
|
github.com/elastic/go-elasticsearch/v8 v8.17.1 h1:bOXChDoCMB4TIwwGqKd031U8OXssmWLT3UrAr9EGs3Q=
|
||||||
github.com/elastic/go-elasticsearch/v8 v8.17.1/go.mod h1:MVJCtL+gJJ7x5jFeUmA20O7rvipX8GcQmo5iBcmaJn4=
|
github.com/elastic/go-elasticsearch/v8 v8.17.1/go.mod h1:MVJCtL+gJJ7x5jFeUmA20O7rvipX8GcQmo5iBcmaJn4=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
||||||
@@ -51,8 +51,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
|
|||||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg=
|
|
||||||
github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
|
|
||||||
github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8=
|
github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8=
|
||||||
github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
|
github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus=
|
||||||
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
||||||
@@ -104,8 +102,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
|
|||||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||||
github.com/nats-io/nats.go v1.39.0 h1:2/yg2JQjiYYKLwDuBzV0FbB2sIV+eFNkEevlRi4n9lI=
|
github.com/nats-io/nats.go v1.39.0 h1:2/yg2JQjiYYKLwDuBzV0FbB2sIV+eFNkEevlRi4n9lI=
|
||||||
github.com/nats-io/nats.go v1.39.0/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=
|
github.com/nats-io/nats.go v1.39.0/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=
|
||||||
github.com/nats-io/nkeys v0.4.9 h1:qe9Faq2Gxwi6RZnZMXfmGMZkg3afLLOtrU+gDZJ35b0=
|
|
||||||
github.com/nats-io/nkeys v0.4.9/go.mod h1:jcMqs+FLG+W5YO36OX6wFIFcmpdAns+w1Wm6D3I/evE=
|
|
||||||
github.com/nats-io/nkeys v0.4.10 h1:glmRrpCmYLHByYcePvnTBEAwawwapjCPMjy2huw20wc=
|
github.com/nats-io/nkeys v0.4.10 h1:glmRrpCmYLHByYcePvnTBEAwawwapjCPMjy2huw20wc=
|
||||||
github.com/nats-io/nkeys v0.4.10/go.mod h1:OjRrnIKnWBFl+s4YK5ChQfvHP2fxqZexrKJoVVyWB3U=
|
github.com/nats-io/nkeys v0.4.10/go.mod h1:OjRrnIKnWBFl+s4YK5ChQfvHP2fxqZexrKJoVVyWB3U=
|
||||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
||||||
@@ -176,8 +172,6 @@ golang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
|||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
|
|
||||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
|
|
||||||
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
|
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
|
||||||
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
@@ -186,8 +180,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
|
||||||
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
|
||||||
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||||
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -215,12 +207,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 h1:fCuMM4fowGzigT89NCIsW57Pk9k2D12MMi2ODn+Nk+o=
|
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
|
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b h1:i+d0RZa8Hs2L/MuaOQYI+krthcxdEbEM2N+Tf3kJ4zk=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b h1:i+d0RZa8Hs2L/MuaOQYI+krthcxdEbEM2N+Tf3kJ4zk=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 h1:5bKytslY8ViY0Cj/ewmRtrWHW64bNF03cAatUUFCdFI=
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
|
||||||
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
|
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
|
||||||
|
|||||||
@@ -15,24 +15,24 @@ func init() {
|
|||||||
|
|
||||||
// record INFO message. Color White
|
// record INFO message. Color White
|
||||||
func Info(format string, a ...interface{}) {
|
func Info(format string, a ...interface{}) {
|
||||||
message := fmt.Sprintf("\033[37m[Info] "+format+"\033[0m\n", a...)
|
message := fmt.Sprintf("\033[37m[Info] "+format+"\033[0m\n", a...)
|
||||||
logger.Print(message)
|
logger.Print(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// record Warn message. Color Orange
|
// record Warn message. Color Orange
|
||||||
func Warn(format string, a ...interface{}) {
|
func Warn(format string, a ...interface{}) {
|
||||||
message := fmt.Sprintf("\033[33m[Warn] "+format+"\033[0m\n", a...)
|
message := fmt.Sprintf("\033[33m[Warn] "+format+"\033[0m\n", a...)
|
||||||
logger.Print(message)
|
logger.Print(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// record Success message. Color Green
|
// record Success message. Color Green
|
||||||
func Success(format string, a ...interface{}) {
|
func Success(format string, a ...interface{}) {
|
||||||
message := fmt.Sprintf("\033[32m[Success] "+format+"\033[0m\n", a...)
|
message := fmt.Sprintf("\033[32m[Succ] "+format+"\033[0m\n", a...)
|
||||||
logger.Print(message)
|
logger.Print(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// record ERROR message. Color Red
|
// record ERROR message. Color Red
|
||||||
func Error(format string, a ...interface{}) {
|
func Error(format string, a ...interface{}) {
|
||||||
message := fmt.Sprintf("\033[31m[Error] "+format+"\033[0m\n", a...)
|
message := fmt.Sprintf("\033[31m[Error] "+format+"\033[0m\n", a...)
|
||||||
logger.Print(message)
|
logger.Print(message)
|
||||||
}
|
}
|
||||||
|
|||||||
73
service/meta.go
Normal file
73
service/meta.go
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"git.apinb.com/bsm-sdk/core/errcode"
|
||||||
|
"git.apinb.com/bsm-sdk/core/utils"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Meta struct {
|
||||||
|
ID uint `json:"id"`
|
||||||
|
IDENTITY string `json:"identity"`
|
||||||
|
EXTEND map[string]string `json:"extend"`
|
||||||
|
CLIENT string `json:"client"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析Context中MetaData的数据
|
||||||
|
type ParseOptions struct {
|
||||||
|
RoleValue string // 判断角色的值
|
||||||
|
MustPrivateAllow bool // 是否只允许私有IP访问
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseMetaCtx(ctx context.Context, opts *ParseOptions) (*Meta, error) {
|
||||||
|
// 解析metada中的信息并验证
|
||||||
|
md, ok := metadata.FromIncomingContext(ctx)
|
||||||
|
if !ok {
|
||||||
|
return nil, errcode.ErrJWTAuthNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
meta := &Meta{
|
||||||
|
IDENTITY: md["authorization_identity"][0],
|
||||||
|
CLIENT: md["client"][0],
|
||||||
|
}
|
||||||
|
|
||||||
|
if id, err := strconv.Atoi(md["authorization_id"][0]); err != nil {
|
||||||
|
return nil, errcode.ErrJWTAuthKeyId
|
||||||
|
} else {
|
||||||
|
meta.ID = uint(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
data := make(map[string]string)
|
||||||
|
if err := json.Unmarshal([]byte(md["authorization_extend"][0]), &data); err == nil {
|
||||||
|
meta.EXTEND = data
|
||||||
|
}
|
||||||
|
|
||||||
|
if opts != nil {
|
||||||
|
if !meta.CheckRole("role", opts.RoleValue) {
|
||||||
|
return nil, errcode.ErrPermissionDenied
|
||||||
|
}
|
||||||
|
if opts.MustPrivateAllow {
|
||||||
|
if utils.IsPublicIP(meta.CLIENT) {
|
||||||
|
return nil, errcode.ErrPermissionDenied
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return meta, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Meta) CheckRole(roleKey, roleValue string) bool {
|
||||||
|
if roleValue == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if role, exists := m.EXTEND[roleKey]; !exists || role != roleValue {
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
128
service/register.go
Normal file
128
service/register.go
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.apinb.com/bsm-sdk/core/print"
|
||||||
|
"git.apinb.com/bsm-sdk/core/vars"
|
||||||
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServiceRegister 创建租约注册服务
|
||||||
|
type ServiceRegister struct {
|
||||||
|
cli *clientv3.Client //etcd client
|
||||||
|
leaseID clientv3.LeaseID //租约ID
|
||||||
|
//租约keepalieve相应chan
|
||||||
|
keepAliveChan <-chan *clientv3.LeaseKeepAliveResponse
|
||||||
|
key string //key
|
||||||
|
val string //value
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRegister 注册服务至路由表.
|
||||||
|
//
|
||||||
|
// ec:EtcdConfig;
|
||||||
|
//
|
||||||
|
// routeKey: ServiceRouteRootPrefix + ServiceKey + "/" + utils.GetLocationIP() + addr;
|
||||||
|
//
|
||||||
|
// gs:grpc.Server;
|
||||||
|
func RegisterService(cli *clientv3.Client, routeKey string, methods []string, lease int64) (*ServiceRegister, error) {
|
||||||
|
|
||||||
|
ser := &ServiceRegister{
|
||||||
|
cli: cli,
|
||||||
|
key: routeKey,
|
||||||
|
val: strings.Join(methods, ","),
|
||||||
|
}
|
||||||
|
|
||||||
|
//申请租约设置时间keepalive
|
||||||
|
if err := ser.putKeyWithLease(lease); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return ser, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置租约
|
||||||
|
func (s *ServiceRegister) putKeyWithLease(lease int64) error {
|
||||||
|
//设置租约时间
|
||||||
|
resp, err := s.cli.Grant(context.Background(), lease)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//注册服务并绑定租约
|
||||||
|
_, err = s.cli.Put(context.Background(), s.key, s.val, clientv3.WithLease(resp.ID))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//设置续租 定期发送需求请求
|
||||||
|
leaseRespChan, err := s.cli.KeepAlive(context.Background(), resp.ID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.leaseID = resp.ID
|
||||||
|
s.keepAliveChan = leaseRespChan
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListenLeaseRespChan 监听 续租情况
|
||||||
|
func (s *ServiceRegister) ListenLeaseRespChan() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case leaseKeepResp := <-s.keepAliveChan:
|
||||||
|
if leaseKeepResp == nil {
|
||||||
|
//log.Println("close lease.")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
goto END
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END:
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close 注销服务
|
||||||
|
func (s *ServiceRegister) Close() error {
|
||||||
|
//撤销租约
|
||||||
|
if _, err := s.cli.Revoke(context.Background(), s.leaseID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return s.cli.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ServiceRegister) SetAnonymous(key string, urls []string) {
|
||||||
|
// remove reppeat, clear service all anonymous uri.
|
||||||
|
anonymous, _ := s.cli.Get(context.Background(), key)
|
||||||
|
|
||||||
|
var as []string
|
||||||
|
if len(anonymous.Kvs) > 0 {
|
||||||
|
val := string(anonymous.Kvs[0].Value)
|
||||||
|
as = strings.Split(val, ",")
|
||||||
|
}
|
||||||
|
|
||||||
|
as = append(clearService(as), urls...)
|
||||||
|
newAnonymous := strings.Join(as, ",")
|
||||||
|
|
||||||
|
// put anonymous to etcd
|
||||||
|
_, err := s.cli.Put(context.Background(), key, newAnonymous)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
print.Error("[BSM Register] Anonymous Fail.")
|
||||||
|
} else {
|
||||||
|
print.Info("[BSM Register] Anonymous: %s", newAnonymous)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func clearService(as []string) (out []string) {
|
||||||
|
for _, v := range as {
|
||||||
|
if len(v) >= len(vars.ServiceKey) {
|
||||||
|
if v[0:len(vars.ServiceKey)] != vars.ServiceKey {
|
||||||
|
out = append(out, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
98
service/service.go
Normal file
98
service/service.go
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.apinb.com/bsm-sdk/core/conf"
|
||||||
|
"git.apinb.com/bsm-sdk/core/env"
|
||||||
|
"git.apinb.com/bsm-sdk/core/print"
|
||||||
|
"git.apinb.com/bsm-sdk/core/vars"
|
||||||
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// RegisterFn defines the method to register a server.
|
||||||
|
RegisterFn func(*grpc.Server)
|
||||||
|
|
||||||
|
Service struct {
|
||||||
|
GrpcSrv *grpc.Server
|
||||||
|
Opts *Options
|
||||||
|
}
|
||||||
|
|
||||||
|
Options struct {
|
||||||
|
Addr string
|
||||||
|
Conf *conf.MicroServiceConf
|
||||||
|
EtcdClient *clientv3.Client
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(srv *grpc.Server, opts *Options) *Service {
|
||||||
|
return &Service{GrpcSrv: srv, Opts: opts}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Addr(ip string, port int) string {
|
||||||
|
return net.JoinHostPort(ip, strconv.Itoa(port))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Start() {
|
||||||
|
print.Info("[BSM - %s] Service Starting ...", vars.ServiceKey)
|
||||||
|
|
||||||
|
// register to etcd.
|
||||||
|
if s.Opts.Conf != nil && s.Opts.Conf.Enable {
|
||||||
|
if s.Opts.EtcdClient == nil {
|
||||||
|
print.Error("[BSM Register] Etcd Client is nil.")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
// get methods
|
||||||
|
methods := FoundGrpcMethods(s.GrpcSrv)
|
||||||
|
|
||||||
|
// set router key
|
||||||
|
routerKey := vars.ServiceRootPrefix + "Router/" + env.Runtime.Workspace + "/" + strings.ToLower(vars.ServiceKey) + "/" + s.Opts.Addr
|
||||||
|
|
||||||
|
// register to etcd
|
||||||
|
register, err := RegisterService(s.Opts.EtcdClient, routerKey, methods, vars.ServiceLease)
|
||||||
|
if err != nil {
|
||||||
|
log.Panicf("[ERROR] %s Service Register:%s \n", vars.ServiceKey, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
anonKey := vars.ServiceRootPrefix + "Router/" + env.Runtime.Workspace + "/"
|
||||||
|
|
||||||
|
register.SetAnonymous(anonKey, s.Opts.Conf.Anonymous)
|
||||||
|
|
||||||
|
// service register lease
|
||||||
|
go register.ListenLeaseRespChan()
|
||||||
|
}
|
||||||
|
|
||||||
|
// run grpc srv.
|
||||||
|
tcpListen, err := net.Listen("tcp", s.Opts.Addr)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
print.Success("[BSM - %s] Service Grpc Register & Runing Success!", vars.ServiceKey)
|
||||||
|
if err := s.GrpcSrv.Serve(tcpListen); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Stop() {
|
||||||
|
s.GrpcSrv.GracefulStop()
|
||||||
|
}
|
||||||
|
|
||||||
|
// found grpc methods.
|
||||||
|
func FoundGrpcMethods(s *grpc.Server) []string {
|
||||||
|
var mothods []string
|
||||||
|
for key, srv := range s.GetServiceInfo() {
|
||||||
|
srvName := strings.Split(key, ".")[1]
|
||||||
|
for _, mn := range srv.Methods {
|
||||||
|
mothods = append(mothods, srvName+"."+mn.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mothods
|
||||||
|
}
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/google/uuid"
|
||||||
ulid "github.com/oklog/ulid/v2"
|
ulid "github.com/oklog/ulid/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func UUID() string {
|
||||||
|
return uuid.Must(uuid.NewV7()).String()
|
||||||
|
}
|
||||||
|
|
||||||
// remove nanoid,uuid,replace to ulid
|
// remove nanoid,uuid,replace to ulid
|
||||||
func ULID() string {
|
func ULID() string {
|
||||||
return ulid.Make().String()
|
return ulid.Make().String()
|
||||||
|
|||||||
@@ -4,4 +4,7 @@ var (
|
|||||||
RUN_MODE_DEV = "dev"
|
RUN_MODE_DEV = "dev"
|
||||||
RUN_MODE_TEST = "test"
|
RUN_MODE_TEST = "test"
|
||||||
RUN_MODE_PROD = "prod"
|
RUN_MODE_PROD = "prod"
|
||||||
|
|
||||||
|
ServiceLease int64 = 60
|
||||||
|
ServiceRootPrefix string = "/"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user