apollo命名空间与集群
# 一、namespace简介
我们可以把namespace理解为一个单独抽取出来的配置文件。为什么会出现namespace的概念呢?我们想象一个场景:在一个公司中,难免有一些项目组是使用公总资源的,比如:共用服务注册中心eureka、共用消息队列中间件RocketMQ等等。这就导致一些运维上的问题,例如:
- 当我们的每个应用都要使用到eureka客户端的时候,每个应用或服务都要在apollo服务配置中心中配置eureka客户端配置。
- 加入我们的eureka服务端ip换了,所有的应用或服务都要改一遍配置
为了解决公有配置的重复配置,变更之后重复修改的问题,apollo为我们提供了一种解决方案:namespace。
- 我们可以把公共配置单独抽取出来,形成一个namespace,比如:eureka客户端配置
- 然后所有用到eureka客户端的应用或服务关联namespace:eureka,就可以使用eureka的客户端配置。以后即使eureka服务端ip换了,我们就修改namespace:eureka的配置,就可以影响所有使用到eureka客户端配置的应用和服务。
# 二、namespace关键问题说明
- 所有的spring boot应用默认有一个namespace,就是application(Spring Boot项目都有一个默认配置文件application.yml)
- namespace配置根据获取权限分为两种
- private 私有的namespace,私有的namespace只能被创建该namespace的apollo客户端项目关联使用。
- public 共有的namespace,可以被所有的apollo客户端应用或服务关联使用。
- 一个项目的配置有两部分组成:自有配置和namespace公有配置
- namespace的名称必须全局唯一
- 如果一个项目的自有配置和namespace公有配置的配置项发生冲突,以自有配置的配置项为准,可以覆盖namespace公有配置。(我们可以把关联关系理解为继承关系,孩子集成了父亲的配置属性,但孩子是独立个体有更改自已独立属性的权利,虽然这个属性是继承得来的)
举例说明:公共namespace有两个配置项
k1 = v1
k2 = v2
2
然后应用A关联了此公共Namespace,且覆盖了配置项k1,新值为v3。那么在应用A实际运行时配置为:
k1 = v3
k2 = v2
2
# 三、namespace配置管理
说了这么多理论,下面我们就来实际创建一个那么space 。例如:在dongbb-cloud-aservice-rbac项目中,我们使用到了eureka客户端,在该项目的管理界面我们创建namespace:yanfa.eureka-client
yanfa是dongbb-cloud-aservice-rbac项目所属的部门,为namespace名称设置前缀有利于保障namespace的全局唯一性。在那么space创建完成之后,我们发现dongbb-cloud-aservice-rbac项目的配置管理界面分为上下两部分:
- 上半部分是自有配置
- 下半部分是namespace共有配置
我们将eureka客户端的公有配置,加入到namespace:yanfa.eureka-client的配置项里面
eureka.instance.instance-id = ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
eureka.instance.prefer-ip-adderss = true
eureka.client.service-url.defaultZone = http://192.168.161.3:9431/eureka/,http://192.168.161.4:9431/eureka/,http://192.168.161.5:9431/eureka/
2
3
并且将namespace:yanfa.eureka-client的配置项发布。
# 四、Spring Boot应用程序使用namespace公共配置
在spring boot的配置项中,加入apollo.bootstrap.namespaces配置项即可。
然后启动应用程序,测试应用程序就可以正确加载namespace:yanfa.eureka-client的配置项,将服务正确的注册到eureka服务注册中心。
# 五、关联namespace
在dongbb-cloud-aservice-rbac项目中我们创建了namespace:yanfa.eureka-client,并使用其配置项。如果dongbb-cloud-aservice-sms项目也想使用namespace:yanfa.eureka-client该怎么办?关联就可以了,不需要新建namespace。 进入到apollo配置中心的dongbb-cloud-aservice-sms项目管理界面
将其原有的eureka配置删除,点击“添加namespace“
- 在spring boot的配置项中,加入apollo.bootstrap.namespaces配置项(仿做第四小节)
- 然后启动应用程序,测试应用程序就可以正确加载namespace:yanfa.eureka-client的配置项,将服务正确的注册到eureka服务注册中心。
# 六、使用集群配置
集群的概念要比namespace简单的多,“集群”就起到一个为应用按部署集群(机房)不同进行配置管理分类的作用。某些大型企业,为了满足异地容灾的需要,通常将应用部署在不同的机房。项目A在B机房有一套配置(IP等环境不同),在C机房有一套配置。为了能区分配置的不同,apollo衍生出了集群的概念。 所以:apollo配置中心要为项目增加集群,一定是项目在不同集群(机房)部署的时候配置不同。如果应用在不同的集群(机房)可以使用相同的配置,就没必要为项目添加集群。
点击添加集群,弹出集群创建页面(就是为集群起个名)
集群创建完成后,发现我们的DEV环境下出现了两个集群,一个是default集群,一个是我们新建的TEST集群。
上图显示:项目dongbb-cloud-aservice-sms在DEV环境下,TEST集群暂时没有任何配置项。(因为集群是新建的)。我们之前配置的配置项信息,都属于default集群。
如果需要删除集群,项目的负责人是没有权限的,需要使用aplollo配置中心的管理员账号:apollo进行删除。
Springboot项目如何使用集群配置?
apollo:
cluster: TEST
2
或者
java -jar -Dapollo.cluster=TEST