以我们目前的项目来做考量,每个项目存在很多相同的配置,如:数据库连接、mongoDB连接、MQ连接等。
在接入Apollo后,我们应如何配置这些相同的配置项,以达到最少的配置实现最好的效果?
每个开发人员本地开发环境都不一样(假设本地装有数据库、mongoDB、MQ),又应该怎样进行自己的配置而不影响其他人?
下面来讲讲Apollo的公共配置和集群,这两个东西可以解决我们的问题。
一、公共配置
为了方便管理公共配置,我登录Apollo管理界面,新建了一个common项目。
1.创建新的Namespace
创建Namespace需要项目管理员权限,如果发现没有添加Namespace按钮,可以找项目管理员授权。
-
点击页面左侧的添加Namespace
进入common项目后,点击页面左下角的添加Namespace。
-
点击“创建新的Namespace”
输入公共组件的Namespace名称,需要注意的是Namespace名称全局唯一
Apollo会默认把部门代号添加在最前面
-
点击提交后,页面会自动跳转到关联Namespace页面
首先,选中所有需要有这个Namespace的环境和集群,一般建议全选
其次,选中刚刚创建的namespace
最后,点击提交
-
关联成功后,页面会自动跳转到Namespace权限管理页面
分配修改权限
分配发布权限
修改完成后,返回项目首页。
2.添加公共配置项,并发布
在公共的Namespace下添加的是各应用项目统一的配置项。采用文本方式更加简单快速。
Apollo-namespace3.png3.应用关联以及覆盖公共配置
-
关联公共组件Namespace
进入使用公共组件的应用项目首页,我们这里以cas单点登录项目为例,也就是进入cas项目的首页,点击左侧的添加Namespace按钮,进入关联公共Namespace页面进行关联公共配置。关联成功后返回项目首页。
关联成功后,会在原来的默认application配置下面多出公共配置。
Apollo-namespace5.png-
覆盖公共配置
覆盖公共配置有两种方式:
方式一:点击公共配置项右边的”覆盖此配置“的按钮,进行配置更改覆盖
方式二:直接在私有配置(application)下进行配置同名的配置项,同名的私有配置会比公共配置优先级高
4.更改应用项目使用的Namespace
apollo.bootstrap.namespaces=application,rscenter.common
5.测试
@RestController
@RequestMapping("test")
public class TestController {
@Value("${testname:}")
private String testName;
@GetMapping("testApollo")
public String testApollo() {
return "hello: " + testName;
}
}
启动项目后访问,即可获取到公共配置中testname
的值
二、集群
在有些特殊情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的es服务器地址和部署在B机房的应用连接的es服务器地址不一样。
在这种情况下,可以通过在Apollo创建不同的集群来解决。
当然我们也可以用Apollo的集群来解决我们各开发人员在自己本地开发时,需要配置不同的配置的问题。而这些不同的配置大致都是些公共配置,如:数据库连接、MongoDB连接、MQ连接等。所以我们一般只需要进行公共配置集群就可以了。
1. 创建集群
创建集群需要项目管理员权限,如果发现没有添加集群按钮,可以找项目管理员授权。我这里只进行公共配置的集群。所以直接进入common项目首页进行操作。
-
点击页面左侧的“添加集群”按钮
-
输入集群名称,选择环境并提交
Apollo默认会读取机器上
/opt/settings/server.properties(linux)
或C:\opt\settings\server.properties(windows)
文件中的idc
属性作为集群名字,在这里创建的集群名字需要和机器上
server.properties中
的idc
属性一致集群的名称最好以约定好的格式来命名,我们目前只为了解决开发人员本地不用的配置问题,可以约定以人名来命名,如:caishihua
-
切换到对应的集群,修改配置并发布
2.更改应用项目所需要的集群
Apollo支持多种集群配置方式,这里只选择了server.properties
的配置方式进行讲解。其他方式请看后面
-
更改server.properties的idc配置
把
/opt/settings/server.properties(linux)
或C:\opt\settings\server.properties(windows)
文件中的idc
属性配置为集群名字
env=DEV
#apollo.meta=http://192.168.10.126:8080
idc=caishihua
访问cas的测试接口进行验证:
注意Apollo中cas项目的testname
公共配置不能被覆盖,否则不会读取到common
公共配置的caishihua
集群配置。或者需要在cas项目中新建集群。
三、集群的所有配置方式
Apollo支持以下方式集群,按照优先级从高到低分别为:
1. 通过Java System Property
apollo.cluster
可以通过Java的System Property
apollo.cluster
来指定
在Java程序启动脚本中,可以指定
-Dapollo.cluster=SomeCluster
如果是运行jar文件,需要注意格式是java -Dapollo.cluster=SomeCluster -jar xxx.jar
也可以通过程序指定,如System.setProperty("apollo.cluster", "SomeCluster");
2. 通过Spring Boot的配置文件
可以在Spring Boot的
application.properties
或bootstrap.properties
中指定apollo.cluster=SomeCluster
3. 通过Java System Property
可以通过Java的System Property
idc
来指定环境
在Java程序启动脚本中,可以指定
-Didc=xxx
如果是运行jar文件,需要注意格式是
java -Didc=xxx -jar xxx.jar
注意key为全小写
4. 通过操作系统的System Environment
还可以通过操作系统的System Environment
IDC
来指定
注意key为全大写
5. 通过server.properties 配置文件
可以在
server.properties
配置文件中指定idc=xxx
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
四、Cluster Precedence(集群顺序)
-
如果
apollo.cluster
和idc
同时指定:-
我们会首先尝试从
apollo.cluster
指定的集群加载配置 -
如果没找到任何配置,会尝试从
idc
指定的集群加载配置 -
如果还是没找到,会从默认的集群(
default
)加载
-
-
如果只指定了
apollo.cluster
:-
我们会首先尝试从
apollo.cluster
指定的集群加载配置 -
如果没找到,会从默认的集群(
default
)加载
-
-
如果只指定了
idc
:-
我们会首先尝试从
idc
指定的集群加载配置 -
如果没找到,会从默认的集群(
default
)加载
-
-
如果
apollo.cluster
和idc
都没有指定:- 我们会从默认的集群(
default
)加载配置
- 我们会从默认的集群(
网友评论