SpringCloud微服务 Apollo分布式配置中心客户端获取配置(二)
前言
本小结我们学习一下如何通过在Apollo客户端设置指定配置环境,在客户端启动时从配置中心获取相应的配置信息。
我们知道Apollo Client的Environment可以通过以下3种方式的任意一个配置:
- 通过Java System Property
- 可以通过Java的System Property env来指定环境
- 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
- 如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar
- 注意key为全小写
- 通过操作系统的System Environment
- 还可以通过操作系统的System Environment ENV来指定
- 注意key为全大写
- 通过配置文件
-
最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT
-
对于Mac/Linux,文件位置为/opt/settings/server.properties
-
对于Windows,文件位置为C:\opt\settings\server.properties
-
文件内容形如:
env=DEV
-
案例
-
启动Apollo配置中心,如还未成功在本地部署的请参考前文这里不赘述。
我们便以上配置信息作为本小结学习案例。
案例的Apollo配置中心APPID为 Dustyone163,同时在本地部署的环境上开启支持客户端的三个环境DEV/FAT/UAT -
在本地 C:\opt\settings目录下新建server.properties,且server.properties中的配置信息如下:
env=dev
-
然后本地访问:http://localhost:8087/deal/1
可见我们能正常获取配置信息。 -
如上为正常操作获取配置能够获取指定环境的配置的信息。下面我们将通过一些非常规操作来验证Apollo Client从配置中心能否正常获取配置信息。
-
在以上案例基础上修改C:\opt\settings目录下新建server.properties,且server.properties中的配置信息如下:
env=sit
然后重启Apollo Client我们依旧能够正常启动Client,Apollo配置中心的APPID为Dustyone163的项目在本地部署之后只支持DEV/DAT/UAT,为什么Apollo Client指定的env=sit也能从配置中心获取配置信息呢?
我猜想Client是不是有配置缓存,以至于当Client设置的ENV在配置中心没有对应的配置信息时Client会不会从缓存中读取呢?我们知道Client端的配置信息缓存是在C:\opt\data{APPID}\config-cache中保存的,当Client第一次成功连接到配置中心后会从配置中心拉取一份配置放在本地作为缓存配置使用,以至于在Client在与配置中心的交互出现异常时可以使用本地缓存信息来支持Client端正常运作,从而提高Client端的可用性。
-
尝试删除本地配置缓存信息,然后重新运行Client(此时Client env=sit),此时Client端依然能够正常运行,这说明:
-
Client端的本地缓存可能没有被使用。
- 验证:
- 删除Client端本地缓存,然后设置env=uat
- 重新启动Client,缓存被重新加载
- 这就说明在Client连接到配置中心的过程中会使用到缓存,但本地缓存只是优先级中的一项。
- 验证:
-
配置中心仍有Client的实例缓存。
当某个Client端实例第一次成功地从配置中心获取配置之后,配置中心会记录该实例以及该实例获取的配置信息,以至于在Client重新尝试连接配置中心时配置中心(从Client第一次成功获取配置信息到Client再次再次从配置中心拉取配置信息这段时间内,配置中心没有宕机过,实例缓存也能正常使用)可以识别该实例并返回相应的配置信息。
- 验证
- 重启配置中心,删除本地缓存,然后再次设置env=sit
- 重新启动Client,无法获取配置信息。
- 这就说明Client在成功获取配置之后,配置中心会保留该Client的一个实例,该Client再次使用指定的APPID和Meta_url来获取配置信息时配置中心将直接返回上次被返回的配置信息
- 验证
小结
下面我们总结一下Client从配置中心获取配置的几种case:
-
Client设置的ENV能正确从配置中心获取配置信息,Client端能正常启动,并在本地保留一份缓存配置信息。
-
Client设置的ENV不正确,若本地存在缓存配置也存在,则Client也能正常启动。
-
Client设置的ENV不正确,若本地存在缓存配置不存在,但配置中心保有该Client的实例则Client能正常启动。
-
Client设置的ENV不正确,若本地缓存配置存在,但配置中心宕机,Client能正常启动。
-
Client设置的ENV不正确,若本地缓存配置存在,配置中心为宕机,但没有该Client的实例Client能正常启动。
-
Client设置的ENV不正确,若本地缓存配置不存在,配置中心宕机,Client不能正常运作。
-
Client设置的ENV不正确,若本地缓存配置不存在,配置没有改Client的实例,Client不能正常运作。
上一篇: 闭包