You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kratos/contrib/config/apollo/apollo.go

118 lines
2.3 KiB

package apollo
import (
"github.com/go-kratos/kratos/v2/config"
"github.com/apolloconfig/agollo/v4"
apolloConfig "github.com/apolloconfig/agollo/v4/env/config"
)
type apollo struct {
client *agollo.Client
}
type Option func(*options)
type options struct {
appid string
secret string
cluster string
endpoint string
namespace string
isBackupConfig bool
}
// WithAppID with apollo config app id
func WithAppID(appID string) Option {
return func(o *options) {
o.appid = appID
}
}
// WithCluster with apollo config cluster
func WithCluster(cluster string) Option {
return func(o *options) {
o.cluster = cluster
}
}
// WithEndpoint with apollo config conf server ip
func WithEndpoint(endpoint string) Option {
return func(o *options) {
o.endpoint = endpoint
}
}
// WithEnableBackup with apollo config enable backup config
func WithEnableBackup() Option {
return func(o *options) {
o.isBackupConfig = true
}
}
// WithDisableBackup with apollo config enable backup config
func WithDisableBackup() Option {
return func(o *options) {
o.isBackupConfig = false
}
}
// WithSecret with apollo config app secret
func WithSecret(secret string) Option {
return func(o *options) {
o.secret = secret
}
}
// WithNamespace with apollo config namespace name
func WithNamespace(name string) Option {
return func(o *options) {
o.namespace = name
}
}
func NewSource(opts ...Option) config.Source {
op := options{}
for _, o := range opts {
o(&op)
}
client, err := agollo.StartWithConfig(func() (*apolloConfig.AppConfig, error) {
return &apolloConfig.AppConfig{
AppID: op.appid,
Cluster: op.cluster,
NamespaceName: op.namespace,
IP: op.endpoint,
IsBackupConfig: op.isBackupConfig,
Secret: op.secret,
}, nil
})
if err != nil {
panic(err)
}
return &apollo{client}
}
func (e *apollo) load() []*config.KeyValue {
kv := make([]*config.KeyValue, 0)
e.client.GetDefaultConfigCache().Range(func(key, value interface{}) bool {
kv = append(kv, &config.KeyValue{
Key: key.(string),
Value: []byte(value.(string)),
})
return true
})
return kv
}
func (e *apollo) Load() (kv []*config.KeyValue, err error) {
return e.load(), nil
}
func (e *apollo) Watch() (config.Watcher, error) {
w, err := NewWatcher(e)
if err != nil {
return nil, err
}
return w, nil
}