-
Notifications
You must be signed in to change notification settings - Fork 4
/
sdk.go
144 lines (130 loc) · 3.58 KB
/
sdk.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Package hdsdk
// 提供各类底层能力的直接访问方式,SDK包在使用前必须要初始化
//
// 首先必须创建一个继承自sdk.BaseConfig的配置struct
// e,g:
//
// import hdget
//
// type XXXConfig struct {
// *sdk.Config `mapstructure:",squash"`
// }
package hdsdk
import (
"github.com/hdget/hdsdk/provider/cache/redis"
"github.com/hdget/hdsdk/provider/db/mysql"
"github.com/hdget/hdsdk/provider/graph/neo4j"
"github.com/hdget/hdsdk/provider/kv/etcd"
"github.com/hdget/hdsdk/provider/log"
"github.com/hdget/hdsdk/provider/mq/kafka"
"github.com/hdget/hdsdk/provider/mq/rabbitmq"
"github.com/hdget/hdsdk/types"
"github.com/pkg/errors"
)
// SdkProvider 底层能力实例
type SdkProvider struct {
Kind types.SdkType // 底层能力类型
Name string // 底层能力名字
Instance types.Provider // 底层能力实现实例
}
var (
Logger types.LogProvider // 日志能力
Mysql types.DbProvider // mysql数据库能力
Redis types.CacheProvider // redis缓存能力
Rabbitmq types.MqProvider // rabbitmq能力
Kafka types.MqProvider // kafka能力
Neo4j types.GraphProvider // 图数据库能力
Etcd types.KvProvider // kv能力
)
var (
LogProvider = &SdkProvider{
Kind: types.SdkCategoryLog,
Name: "log",
Instance: &log.LoggerImpl{},
}
// 除去日志外其他能力能力提供者实例
providers = []*SdkProvider{
{
Kind: types.SdkTypeDbMysql,
Name: "mysql",
Instance: &mysql.MysqlProvider{},
},
{
Kind: types.SdkTypeCacheRedis,
Name: "redis",
Instance: &redis.RedisProvider{},
},
{
Kind: types.SdkTypeMqRabbitmq,
Name: "rabbitmq",
Instance: &rabbitmq.RabbitmqProvider{},
},
{
Kind: types.SdkTypeMqKafka,
Name: "kafka",
Instance: &kafka.KafkaProvider{},
},
{
Kind: types.SdkTypeGraphNeo4j,
Name: "neo4j",
Instance: &neo4j.Neo4jProvider{},
},
{
Kind: types.SdkTypeKvEtcd,
Name: "etcd",
Instance: &etcd.EtcdProvider{},
},
}
)
// Initialize 初始化SDK, 指定的配置文件里面有什么配置就配置什么能力
func Initialize(configer types.Configer) error {
var err error
Logger, err = newLogger(configer)
if err != nil {
return err
}
for _, p := range providers {
err = p.Instance.Init(configer, Logger)
// 如果没有对应能力的配置,忽略该底层能力的后续初始化动作
if errors.Is(err, types.ErrEmptyConfig) {
continue
}
// 打印提示日志
if err != nil {
Logger.Error("initialize provider", "name", p.Name, "err", err)
} else {
Logger.Info("initialize provider", "name", p.Name)
}
setGlobalVars(p)
}
return nil
}
func setGlobalVars(p *SdkProvider) {
// 根据不同的能力类型,将provider Instance转换成具体的provider
switch p.Kind {
case types.SdkTypeDbMysql:
Mysql = p.Instance.(*mysql.MysqlProvider)
case types.SdkTypeCacheRedis:
Redis = p.Instance.(*redis.RedisProvider)
case types.SdkTypeMqRabbitmq:
Rabbitmq = p.Instance.(*rabbitmq.RabbitmqProvider)
case types.SdkTypeMqKafka:
Kafka = p.Instance.(*kafka.KafkaProvider)
case types.SdkTypeGraphNeo4j:
Neo4j = p.Instance.(*neo4j.Neo4jProvider)
case types.SdkTypeKvEtcd:
Etcd = p.Instance.(*etcd.EtcdProvider)
}
}
// 初始化日志服务
func newLogger(configer types.Configer) (types.LogProvider, error) {
err := LogProvider.Instance.Init(configer, nil)
if err != nil {
return nil, err
}
logger, ok := LogProvider.Instance.(*log.LoggerImpl)
if !ok {
return nil, errors.New("error convert to LoggerImpl")
}
return logger, nil
}