spring boot 使用Ali ACM配置

spring boot 使用Ali ACM配置

公司一直有在用,最近有时间自己配置一下。

一、好处

如果你需要使用Ali ACM,你最好先弄清楚这个东西是什么,有什么用,能给你的项目带来什么样的好处,这样才能更快上手。

对我而言,有如下场景:一个应用A有着多种开发环境:本地、内网测试环境、外网测试环境、正式环境。此应用需要连接数据库,本地和内网环境需要连数据库A,外网测试环境需要连数据库B,正式环境需要连数据库C。

如果我把数据库链接以配置文件的方式写死在应用中,在把应用推送至外网测试、正式环境的时候,我需要手动修改配置文件,否则就会访问错误的库。如果正式环境的库出现问题,需要切换至备用库,我需要手动修改配置文件,并且重启应用。综上,“写死”是一个非常落后的选择。

这时候,接触过分布式的同学就会想起一个叫做“配置中心”的概念。Ali ACM正是这样一种配置中心。

至于其他的好处,Ali ACM的官方文档中也有提到,这里不再细说。

https://help.aliyun.com/document_detail/59953.html

二、教程

直接去找ali acm的官方文档即可,非常详细,这里仅仅贴个地址:

https://help.aliyun.com/document_detail/60369.html

基本上没有什么坑,比较奇葩的是这个错误:

java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava

会导致你的spring boot项目无法启动。如果你遇到了这个错误,需要更改你的spring boot版本,不要用太新的。我个人使用2.0.0以上的版本就会出问题,最后换用1.5.9.RELEASE就没事了。具体可以查看:

https://www.cnblogs.com/syp172654682/p/9015057.html

Ali ACM官方声称:

QQ截图20180909163823

这样看来还是支持得不太好(笑)。

三、根据不同环境切换配置

上面的那些步骤只能实现“云配置”,也就是“每个项目的配置都从云服务那里拿”而已,完全没有实现“根据不同环境切换配置”。

至于如何实现这个功能,我可以提供一个思路:

不同的“云配置”,在ACM上是通过命名空间来划分的。

假设现在有本机dev(同样使用uat环境),内网测试服务器uat、外网测试服务器pre、正式环境服务器prd,一共四台服务器(或者是ECS实例,什么都行),那么就需要三种环境,也就需要三种命名空间,将其命名为uat、pre、prd。

本机(dev)默认使用uat环境,所以本机的alibaba.acm.namespace属性应该默认为uat的id。我们在开发时启动应用,就会拿到uat的配置,然后连接uat的数据库。

当应用被推上uat环境后,在启动时,应用“察觉到自己已经不在dev环境”,于是从当前服务器(uat)的环境变量中获取uat命名空间的id,并且通过ACM拿到最新的配置。

同理,当应用被推上pre、prd后,也能拿到pre、prd命名空间的id,分别拿到不同的配置。

那么问题来了,上文引申出了三个问题:

  1. 应用应该如何“察觉到自己已经不在dev环境”呢?
  2. 如何在不同服务器的环境变量中配置相应的命名空间id呢(如果使用docker,如何通过docker配置来设置启动时的环境变量)?
  3. 应用如何获取环境变量?

其实1、3两个问题是同一个问题…我们又可以推出三个解决思路:

  1. java、golang(语言)、spring boot(框架)如何获取系统环境变量。
  2. 如何设置环境变量。
  3. 如何覆盖掉spring boot中的配置。

有兴趣的同学可以自行研究,也许我以后还会搞一篇教程。

个人提示:使用docker + spring boot,可以在应用启动时替换掉相应的配置项。详情请参考:https://www.jianshu.com/p/49155f18884c

四、总结

好久没更新,最近太偷懒了…

发布者

xie4ever

《spring boot 使用Ali ACM配置》上有1条评论

发表评论

电子邮件地址不会被公开。