-
Notifications
You must be signed in to change notification settings - Fork 26.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于Dubbo适配不同配置中心的存储和组织模型的问题 #3266
Comments
关于外部化存储,我们的对接模型上是将dubbo.properties作为一个整体考虑的,比如
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.metadataReport.address=zookeeper://127.0.0.1:2181
dubbo.protocol.port=-1
dubbo.consumer.timeout=600
但是,我们发现,这样的模型和Apollo的组织并不是很匹配,Apollo倾向于将一个namespace下的所有配置组织为一个.properties或其他格式的文件 我们可以考虑做如下改造:继续保持在Dubbo框架侧将 |
关于配置中心如何在Dubbo中工作的,可以参考Dubbo的OPS中的 |
Apollo中的入口API中,有三种方法: ConfigSerfice.getConfig(String namespace) //获取NS下的配置,但是只提供每次一个key的读取,按这个模型我们需要将dubbo.properties整体作为一个key
ConfigService.getAppConfig() //同getconfig
ConfigService.getConfigFile(String namespace, ConfigFileFormat configFileFormat) //一次读取一个文件,支持.properties yaml json等?这个允许我们将dubbo.properties打散在一个NS中,又能实现一次性的读取和操作 不过看一下,Dubbo中的DynamicConfiguration API,都是以key为操作单位,适应一次性读取NS或许需要些改造 |
Apollo在设计之初就考虑到了公共组件的配置场景,下面摘抄一段之前在infoq上发表的文章:
更多说明可以参考Apollo核心概念之“Namespace” 所以,以apollo为例,对于一家公司内理想的配置使用方式可能是下面这样子的:
<dubbo:config-center address="apollo://106.12.25.204:8080"/>
所以,apollo的模型是倾向于把namespace类比为properties文件,包含了逻辑上的一组配置,同时对于公共配置,支持通过界面直观的操作单个/多个配置的自定义。 按照目前dubbo的组织方式(把dubbo相关配置作为一个配置项管理)也能实现上述功能,不过对于用户使用(配置或覆盖)可能就不那么直观了。 鉴于dubbo需要接入更多配置中心,所以在模型上做一层抽象是合理的,不过也希望能讨论下是否有可能使这个抽象也能更好地支持类似apollo这样的模型。 |
就API层面而言,apollo确实是支持获取单个key和整个文件两种不同用法的,以适配不同的使用场景,比如对上面提到的案例:
ConfigService.getConfig("dubbo").getIntProperty("dubbo.consumer.timeout", defaultTimeout);
//返回1000
ConfigService.getConfigFile("dubbo", ConfigFileFormat.Properties).getContent();
//以properties格式返回所有配置
//dubbo.registry.address=zookeeper\://1.2.3.4\:2181
//dubbo.consumer.timeout=5000 |
@nobodyiam 我想我们已经就
这是我开启这个issue讨论的原因之一,我们需要让Dubbo尽量遵循每个配置中心的原生概念。
ConfigService.getAppConfig()对应到ConfigService.getConfigFile("application", ConfigFileFormat.Properties).getContent(); |
我加了这个PR,理论上能适应Apollo的模型,同时也能使用Nacos及Zookeeper的模型。 |
关于服务治理部分,我发现使用中另一个模型匹配的问题,当前Dubbo的服务治理对Apollo的对接是:
而如之前提,Apollo中的每个namespace都是一种配置文件类型,如properties json yaml等,那么就出现了namespace内嵌套yaml规则的问题,如这里所示: |
是的
是的,目前看上去要么作为一个单独的namespace存在,要么作为一个namespace中的key存在 |
2.7.2 版本 使用apollo 作为配置中心后发现2个问题 |
@chickenlj 我们在尝试落地对接中,对于Apollo用于配置中心,仍存在一些疑惑
|
对于 Apollo 的场景来说,
因为通常需要配置规则的 service 还是少数的,并且 application 级别配置的引入一方面原因也是为了减少配置维护量。所以我认为实际和理论数据量还是会有些差异。
这个问题能否具体再描述一下?
能否举个例子。因为按照设计, |
比如
这条配置,既可以写在key=org.apache.dubbo.demo.DemoService::.configurators下,也可以写在key=demo-consumer.configurators下。因为在RegistryDirectory.overrideWithConfigurator()中都处理了。 |
从AbstractInterfaceConfig.prepareEnviroment的设计看,我理解整体上其实需要的是3份配置文件(先不管代码逻辑)
那么再进一步归纳,需要的其实是2类配置
是不是就简化为:
|
目前,在2.7.0中,我们引入了配置中心的概念,并对接了Zookeeper, Apollo实现,并且不久将实现对接Nacos。
配置中心在Dubbo中扮演两个角色:
The text was updated successfully, but these errors were encountered: