Apollo公共类型的Namespace配置需要进行关联才能用吗?

简介: 其实,这个问题在强哥看来应该有稍微深入了解Apollo的使用者应该都能回答的上来。不过也是前些天,刚好看到公司新来的实习生在找Apollo配置时抓耳挠腮,了解情况之后,我发现,原来这个问题确实有许多人容易弄混。所以,强哥就在这里也简单科普一下。

其实,这个问题在强哥看来应该有稍微深入了解Apollo的使用者应该都能回答的上来。

不过也是前些天,刚好看到公司新来的实习生在找Apollo配置时抓耳挠腮,了解情况之后,我发现,原来这个问题确实有许多人容易弄混。所以,强哥就在这里也简单科普一下。


很多人会被Namespace类型弄混,主要是因为用多了:创建当前项目下的Namespace配置覆盖公共类型的Namespace配置。而慢慢的把公共类型的Namespace的具体性质给遗忘了,导致最后理解为:只要想在Apollo上自己的项目下使用公共的配置,就必须在项目下创建个相同名称的Namespace,然后关联上公共配置。如果不进行关联,项目就无法获取到公共类型的Namespace配置。


这点当然是错误的。新来的那个实习生就是因为这么理解了,导致他在Apollo上自己项目下找数据库配置信息时,一直找不到账号密码相关的配置。然后又项目代码中引用的公共Jar包源码里去找是否在代码中做了默认配置的处理。最后在代码中也没有找到,导致怀疑人生,在一旁直呼见鬼。


其实,Apollo的Namespace主要分成三种类型:私有类型、关联类型和公共类型。而在创建Namespace的时候,只要你将它配置为公共类型,那它就相当于应用到了所有的Apollo项目上,而不需要进行关联配置。


也正因如此,我们在创建公共Namespace时必须多想想,是不是说这些配置就是要应用到所有项目上。否则,如果滥用公共Namespace,也会造成很多代码发生奇奇怪怪的问题。


用一个官网的例子来解释下三种类型的关系:如下图所示,有三个应用:应用A、应用B、应用C。


应用A有两个私有类型的Namespace:application和NS-Private,以及一个关联类型的Namespace:NS-Public。


应用B有一个私有类型的Namespace:application,以及一个公共类型的Namespace:NS-Public。


应用C只有一个私有类型的Namespace:application


44.png


那么,我们分别在三个应用中获取配置时,结果如下:应用A获取Apollo配置


//application 
  Config appConfig = ConfigService.getAppConfig();
  appConfig.getProperty("k1", null); // k1 = v11
  appConfig.getProperty("k2", null); // k2 = v21
  //NS-Private
  Config privateConfig = ConfigService.getConfig("NS-Private");
  privateConfig.getProperty("k1", null); // k1 = v3
  privateConfig.getProperty("k3", null); // k3 = v4
  //NS-Public,覆盖公共类型配置的情况,k4被覆盖
  Config publicConfig = ConfigService.getConfig("NS-Public");
  publicConfig.getProperty("k4", null); // k4 = v6 cover
  publicConfig.getProperty("k6", null); // k6 = v6
  publicConfig.getProperty("k7", null); // k7 = v7


应用B获取Apollo配置


//application
  Config appConfig = ConfigService.getAppConfig();
  appConfig.getProperty("k1", null); // k1 = v12
  appConfig.getProperty("k2", null); // k2 = null
  appConfig.getProperty("k3", null); // k3 = v32
  //NS-Private,由于没有NS-Private Namespace 所以获取到default value
  Config privateConfig = ConfigService.getConfig("NS-Private");
  privateConfig.getProperty("k1", "default value"); 
  //NS-Public
  Config publicConfig = ConfigService.getConfig("NS-Public");
  publicConfig.getProperty("k4", null); // k4 = v5
  publicConfig.getProperty("k6", null); // k6 = v6
  publicConfig.getProperty("k7", null); // k7 = v7


应用C获取Apollo配置


//application
  Config appConfig = ConfigService.getAppConfig();
  appConfig.getProperty("k1", null); // k1 = v12
  appConfig.getProperty("k2", null); // k2 = null
  appConfig.getProperty("k3", null); // k3 = v33
  //NS-Private,由于没有NS-Private Namespace 所以获取到default value
  Config privateConfig = ConfigService.getConfig("NS-Private");
  privateConfig.getProperty("k1", "default value"); 
  //NS-Public,公共类型的Namespace,任何项目都可以获取到
  Config publicConfig = ConfigService.getConfig("NS-Public");
  publicConfig.getProperty("k4", null); // k4 = v5
  publicConfig.getProperty("k6", null); // k6 = v6
  publicConfig.getProperty("k7", null); // k7 = v7


好啦,相信通过这个例子,大家也就能更好地理解Apollo的Namespace三种类型的意义。


大家也要记得,在遇到不符合自己理解的知识点的问题时,最好是能够去官网等地方找找权威的解释。而不要一味的埋进自己理解有误的思维的牛角尖无法自拔。

相关文章
如何获取Apollo上项目下的所有namespace?
项目配置迁移到Apollo之后,通过统一的配置管理及配置监听使得项目配置修改的成本大大降低。
如何获取Apollo上项目下的所有namespace?
|
2月前
|
网络协议 Linux 应用服务中间件
Namespace技术概述
【10月更文挑战第6天】在Linux内核中,为了隔离不同类型的资源,实现了多种namespace,包括UTS(hostname)、User(用户和组)、Mount(文件系统挂载点)、PID(进程ID)和Network(网络协议栈)。常用指令`nsenter`可进入指定的namespace,而`unshare`则创建并加入新的namespace。在内核层面,每个进程的`task_struct`包含这些namespace的信息。
|
4月前
|
Kubernetes API 容器
在K8s中,容器内如何获取pod和namespace名?
在K8s中,容器内如何获取pod和namespace名?
|
6月前
|
C++
C++一分钟之—名空间(namespace)的作用与使用
【6月更文挑战第22天】C++的命名空间是代码组织的关键,防止命名冲突并促进模块化。通过`namespace`定义代码块,如`MyNamespace{...}`,并使用别名(`namespace MN = MyNamespace::...`)简化引用。避免过度使用和嵌套,以及`using namespace`的滥用,而应在小范围内导入所需成员。明智选择名空间名称并有效利用`using`声明,能提升代码可读性和专业性。
167 1
|
7月前
|
C++
C++中使用namespace关键字定义和访问命名空间的技术性探讨
C++中使用namespace关键字定义和访问命名空间的技术性探讨
51 3
|
7月前
|
Python
什么是Python中的命名空间(Namespace)?如何访问不同命名空间中的变量?
什么是Python中的命名空间(Namespace)?如何访问不同命名空间中的变量?
126 0
淘东电商项目(15) -项目配置信息分类(Apollo Namespace命名空间)
淘东电商项目(15) -项目配置信息分类(Apollo Namespace命名空间)
56 0
|
算法 C语言 C++
【C++技能树】NameSpace --命名空间的使用
我在这段代码中想使用rand这个变量名字.这是正常的行为.
100 0
|
SpringCloudAlibaba Java 测试技术
Nacos Config 使用自定义的NameSpace & Group
在之前的章节中,我们并没有对`SpringCloud Alibaba Nacos Config`的`NameSpace`、`Group`做过修改,都是使用的默认值,默认值分别是:`Public`、`DEFAULT_GROUP`,我们本章来看下如何自定义这两项参数。
|
Kubernetes 开发者 容器
K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结 | 学习笔记
快速学习 K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结
1916 0
K8S 集群 NaneSpace(命名空间)NameSpace 删除及学习总结 | 学习笔记