-
Notifications
You must be signed in to change notification settings - Fork 3
/
plugin.go
117 lines (106 loc) · 3.43 KB
/
plugin.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
package grpc_service
import (
"context"
"fmt"
"github.com/nacos-group/nacos-sdk-go/v2/clients"
"github.com/nacos-group/nacos-sdk-go/v2/vo"
"github.com/no-mole/neptune/application"
"github.com/no-mole/neptune/config"
"github.com/no-mole/neptune/logger"
clientv3 "go.etcd.io/etcd/client/v3"
"gopkg.in/yaml.v3"
"strconv"
)
// NewPlugin 服务注册、服务发现组件
func NewPlugin(_ context.Context) application.Plugin {
plg := &Plugin{
Plugin: application.NewPluginConfig("grpc-register", &application.PluginConfigOptions{
ConfigName: "register.yaml",
ConfigType: "yaml",
EnvPrefix: "",
}),
config: &config.Config{},
}
plg.Flags().StringVar(&plg.config.Type, "register-type", "", "config client type")
plg.Flags().StringVar(&plg.config.Endpoints, "register-endpoints", "", "config client endpoints")
plg.Flags().StringVar(&plg.config.Namespace, "register-namespace", "", "config client namespace")
plg.Flags().StringVar(&plg.config.Username, "register-username", "", "config client username")
plg.Flags().StringVar(&plg.config.Password, "register-password", "", "config client password")
plg.Flags().StringToStringVar(&plg.config.Settings, "register-settings", nil, "config client settings")
return plg
}
type Plugin struct {
application.Plugin
config *config.Config
}
func (p *Plugin) Config(ctx context.Context, conf []byte) error {
return yaml.Unmarshal(conf, p.config)
}
func (p *Plugin) Init(ctx context.Context) error {
logger.Info(
ctx,
"config center plugin init",
logger.WithField("grpcRegisterType", p.config.Type),
logger.WithField("grpcRegisterEndpoints", p.config.Endpoints),
logger.WithField("grpcRegisterNamespace", p.config.Namespace),
logger.WithField("grpcRegisterUsername", p.config.Username),
logger.WithField("grpcRegisterSettings", p.config.Settings),
)
initFn, ok := registryClientTypes[p.config.Type]
if !ok {
return fmt.Errorf("unsupported register type:[%s]", p.config.Type)
}
return initFn(context.Background(), p.config)
}
func (p *Plugin) Run(ctx context.Context) error {
<-ctx.Done()
return Close()
}
type InitRegisterFunc func(ctx context.Context, conf *config.Config) error
var registryClientTypes = map[string]InitRegisterFunc{}
func RegistryClientType(typeName string, fn InitRegisterFunc) {
registryClientTypes[typeName] = fn
}
var DefaultEtcdTTL int64 = 10
func init() {
RegistryClientType("etcd", func(ctx context.Context, conf *config.Config) error {
clientConf := config.Trans2EtcdConfig(ctx, conf)
cli, err := clientv3.New(clientConf)
if err != nil {
return err
}
ttl := DefaultEtcdTTL
if ttlStr, ok := conf.Settings["ttl"]; ok {
ttlInt, _ := strconv.Atoi(ttlStr)
if ttlInt > 0 {
ttl = int64(ttlInt)
}
}
SetDefaultRegister(NewEtcdRegister(ctx, cli, conf.Namespace, ttl))
RegisterEtcdResolverBuilder(ctx, cli, conf.Namespace)
return nil
})
RegistryClientType("nacos", func(ctx context.Context, conf *config.Config) error {
groupName := ""
if groupStr, ok := conf.Settings["groupName"]; ok {
groupName = groupStr
}
clientConfig, serverConfigs, err := config.Trans2NacosConfig(ctx, conf)
if err != nil {
return err
}
// create nacos client
cli, err := clients.NewNamingClient(
vo.NacosClientParam{
ClientConfig: clientConfig,
ServerConfigs: serverConfigs,
},
)
if err != nil {
return err
}
SetDefaultRegister(NewNacosRegister(ctx, cli, groupName))
RegisterNacosResolverBuilder(ctx, cli)
return nil
})
}