配置中心即为在分布式场景下,无法将最新的框架配置文件和应用程序绑定在一起,可以指定好配置中心的信息,例如配置中心类型和地址,并在框架启动时从配置中心拉取相应配置进行启动。
参考仓库:dubbo-go-samples/configcenter
dubbogo.yml
dubbo:
config-center:
protocol: nacos
address: 127.0.0.1:8848
data-id: dubbo-go-samples-configcenter-nacos-server
namespace: myNamespaceID # 可选配置 nacos namespace ID, 默认是 public
group: mygroup # 可选配置 nacos group, 默认是 DEFAULT_GROUP
配置中心 nacos 内
group 默认为 dubbo
dataID 为指定的id:dubbo-go-samples-configcenter-nacos-server
写入框架配置例如下面,即可正常启动。
dubbo:
registries:
demoZK:
protocol: zookeeper
timeout: 3s
address: 127.0.0.1:2181
protocols:
triple:
name: tri
port: 20000
provider:
services:
GreeterProvider:
interface: com.apache.dubbo.sample.basic.IGreeter
Config API 为 dubbogo 3.0 用来操作配置结构的 API。可使用框架提供的 Config API 进行配置结构的初始化,获取组件实例并使用。一个例子如下,包含了动态配置实例的初始化、发布配置、读取配置、订阅配置操作。
const configCenterNacosServerConfig = `# set in config center, group is 'dubbo', dataid is 'dubbo-go-samples-configcenter-nacos-server', namespace is default 'public'
dubbo:
registries:
demoZK:
protocol: zookeeper
address: 127.0.0.1:2181
protocols:
triple:
name: tri
port: 20000
provider:
services:
GreeterProvider:
interface: com.apache.dubbo.sample.basic.IGreeter # must be compatible with grpc or dubbo-java`
type GreeterProvider struct {
api.GreeterProviderBase
}
func (s *GreeterProvider) SayHello(ctx context.Context, in *api.HelloRequest) (*api.User, error) {
logger.Infof("Dubbo3 GreeterProvider get user name = %s\n", in.Name)
return &api.User{Name: "Hello " + in.Name, Id: "12345", Age: 21}, nil
}
// There is no need to export DUBBO_GO_CONFIG_PATH, as you are using config api to set config
func main() {
// 获取动态配置实例 dynamicConfig
dynamicConfig, err := config.NewConfigCenterConfigBuilder().
SetProtocol("nacos").
SetAddress("127.0.0.1:8848").
SetGroup("dubbo").
Build().GetDynamicConfiguration()
if err != nil {
panic(err)
}
// 使用 dynamicConfig 结构来发布配置
if err := dynamicConfig.PublishConfig("dubbo-go-samples-configcenter-nacos-server", "dubbo", configCenterNacosServerConfig); err != nil {
panic(err)
}
// 使用 dynamicConfig 结构来读取配置
data, err := dynamicConfig.GetRule("dubbo-go-samples-configcenter-nacos-server", config_center.WithGroup("dubbo"))
if err != nil{
panic(err)
}
logger.Infof("get config = %s", data)
// 使用 dynamicConfig 结构, 通过自定义listener来订阅配置更新事件
l := &listener{}
dynamicConfig.AddListener("dubbo-go-samples-configcenter-nacos-server", l)
time.Sleep(time.Second * 10)
config.SetProviderService(&GreeterProvider{})
// 以 API 的形式来启动框架
rootConfig := config.NewRootConfigBuilder().
SetConfigCenter(config.NewConfigCenterConfigBuilder().
SetProtocol("nacos").SetAddress("127.0.0.1:8848"). // 根据配置结构,设置配置中心
SetDataID("dubbo-go-samples-configcenter-nacos-server"). // 设置配置ID
SetGroup("dubbo").
Build()).
Build()
if err := rootConfig.Init(); err != nil { // 框架启动
panic(err)
}
select {}
}
type listener struct {
}
func (l listener) Process(event *config_center.ConfigChangeEvent) {
logger.Infof("listener get config = %s", event.Value)
}
当然,以 API 的形式来启动框架时,可以直接以API的形式来启动框架。参考基本概念模块的 Dubbogo 框架配置
// todo
正在开发中ing
下一章: 【Filter】