前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊dubbo-go的apolloConfiguration

聊聊dubbo-go的apolloConfiguration

作者头像
code4it
发布2020-08-04 14:13:28
3760
发布2020-08-04 14:13:28
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下dubbo-go的apolloConfiguration

apolloConfiguration

dubbo-go-v1.4.2/config_center/apollo/impl.go

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • apolloConfiguration
  • newApolloConfiguration
  • GetProperties
  • AddListener
  • RemoveListener
  • NewApolloListener
  • OnChange
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档