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 }