序
本文次要钻研一下dubbo-go的apolloConfiguration
apolloConfiguration
dubbo-go-v1.4.2/config_center/apollo/impl.go
const ( apolloProtocolPrefix = "http://" apolloConfigFormat = "%s.%s")type apolloConfiguration struct { url *common.URL listeners sync.Map appConf *agollo.AppConfig parser parser.ConfigurationParser}
- apolloConfiguration定义了url、listeners、appConf、parser属性
newApolloConfiguration
dubbo-go-v1.4.2/config_center/apollo/impl.go
func newApolloConfiguration(url *common.URL) (*apolloConfiguration, error) { c := &apolloConfiguration{ url: url, } configAddr := c.getAddressWithProtocolPrefix(url) configCluster := url.GetParam(constant.CONFIG_CLUSTER_KEY, "") appId := url.GetParam(constant.CONFIG_APP_ID_KEY, "") namespaces := getProperties(url.GetParam(constant.CONFIG_NAMESPACE_KEY, cc.DEFAULT_GROUP)) c.appConf = &agollo.AppConfig{ AppId: appId, Cluster: configCluster, NamespaceName: namespaces, Ip: configAddr, } agollo.InitCustomConfig(func() (*agollo.AppConfig, error) { return c.appConf, nil }) return c, agollo.Start()}
- newApolloConfiguration办法创立AppConfig,而后执行agollo.InitCustomConfig,最初执行agollo.Start()
GetProperties
dubbo-go-v1.4.2/config_center/apollo/impl.go
func (c *apolloConfiguration) GetProperties(key string, opts ...cc.Option) (string, error) { /** * when group is not null, we are getting startup configs(config file) from Config Center, for example: * key=dubbo.propertie */ config := agollo.GetConfig(key) if config == nil { return "", errors.New(fmt.Sprintf("nothing in namespace:%s ", key)) } return config.GetContent(agollo.Properties), nil}
- GetProperties办法先执行agollo.GetConfig(key)获取Config,之后通过config.GetContent(agollo.Properties)获取属性
AddListener
dubbo-go-v1.4.2/config_center/apollo/impl.go
func (c *apolloConfiguration) AddListener(key string, listener cc.ConfigurationListener, opts ...cc.Option) { k := &cc.Options{} for _, opt := range opts { opt(k) } key = k.Group + key l, _ := c.listeners.LoadOrStore(key, NewApolloListener()) l.(*apolloListener).AddListener(listener)}
- AddListener办法执行c.listeners.LoadOrStore(key, NewApolloListener())及l.(*apolloListener).AddListener(listener)
RemoveListener
dubbo-go-v1.4.2/config_center/apollo/impl.go
func (c *apolloConfiguration) RemoveListener(key string, listener cc.ConfigurationListener, opts ...cc.Option) { k := &cc.Options{} for _, opt := range opts { opt(k) } key = k.Group + key l, ok := c.listeners.Load(key) if ok { l.(*apolloListener).RemoveListener(listener) }}
- RemoveListener办法执行l.(*apolloListener).RemoveListener(listener)
NewApolloListener
dubbo-go-v1.4.2/config_center/apollo/listener.go
type apolloListener struct { listeners map[config_center.ConfigurationListener]struct{}}// NewApolloListener ...func NewApolloListener() *apolloListener { return &apolloListener{ listeners: make(map[config_center.ConfigurationListener]struct{}, 0), }}
- NewApolloListener创立apolloListener
OnChange
dubbo-go-v1.4.2/config_center/apollo/listener.go
// OnChange ...func (a *apolloListener) OnChange(changeEvent *agollo.ChangeEvent) { for key, change := range changeEvent.Changes { for listener := range a.listeners { listener.Process(&config_center.ConfigChangeEvent{ ConfigType: getChangeType(change.ChangeType), Key: key, Value: change.NewValue, }) } }}
- OnChange办法接管ChangeEvent,之后遍历listeners,执行listener.Process回调
小结
apolloConfiguration定义了url、listeners、appConf、parser属性;newApolloConfiguration办法创立AppConfig,而后执行agollo.InitCustomConfig,最初执行agollo.Start()
doc
- apollo/impl.go