实践:把Springboot项目配置迁移至 Apollo 配置管理中心

导读:由于配置日益增多不方便管理且期望配置修改实时生效,因此笔者决定部署一个配置中心,经过分析对比之后决定采用携程开源的 Apollo 配置管理中心。本文分享笔者基于 Apollo 提供 quick start 搭建服务端,并将一个多环境配置的 Springboot 项目迁移至 Apollo 的实践,希望对各位熟悉 Apollo 有所帮助。

本地部署 Apollo

为了方便用户体验,其官方文档提供了一个 quick start 部署 Apollo 的方案。具体部署可参考官方文档。其主要步骤如下:

  • 创建 ApolloPortalDB
  • 创建 ApolloConfigDB
  • 修改 demo.sh 数据库信息
  • 启动后访问 http://localhost:8070 apollo/admin

https://www.apolloconfig.com/#/zh/deployment/quick-start

Apollo 服务端操作

部署 Apollo 成功后访问 http://localhost:8070 apollo/admin 进入管理页面

1、创建应用

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

这里我们主要关注的是 appid,用来标识应用身份的唯一id,需要和客户端配置的 app.id 对应

2、Namespace 管理

Namespace 这一听起来比较迷糊,其实我们也可以通俗理解为它对应于我们项目中配置文件(如 properties、yml)。每一个应用创建好后都会有一个默认的 application.properties 的 namespace。

实践:把Springboot项目配置迁移至 Apollo 配置管理中心


由于笔者 Springboot 项目中配置均采用 yml 格式,因此需要借助下方这个转换网址把 yml 转换为 properties 格式,之后添加到 Apollo 的 Namespace 中。

https://www.toyaml.com/index.html

当然这里也支持不想转 properties 而直接使用 yml 的场景。我们可以重新创建一个私有的 Namespace,在创建时要注意箭头所指的位置选项。

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

创建之后我们就可以将原本项目中 yml 文件直接粘贴到新建的 Namespace 中了。

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

这里涉及到一个一开始比较困扰笔者的问题。在笔者 Springboot 项目中是分环境有多个配置文件的,公共配置存于主配置 application.yml 文件中,其他环境配置文件如 application-dev.yml 则各有所差异。最后通过主配置文件中的 spring.profiles.active 来指定运行时的环境。

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

3、那么当把项目中的配置文件迁移到 Apollo 时该如何区分环境?

这里 Apollo 是具有环境概念的,详细可参考官方文档。 Apollo 支持 DEV、FAT、UAT、PRO 环境,也支持自定义,这需在部署时进行控制。

https://www.apolloconfig.com/#/zh/usage/java-sdk-user-guide?id=_1241-environment

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

因此笔者就把原项目中 application-dev.yml 配置信息添加到 Apollo DEV 环境中新建的私有 Namespace application.yml 中。 而对于原项目 application.yml 中公共部分,则添加到新建的公共 Namespace TEST1.spider_media_url 中,配置如上图所示, 其他环境同理。

4、保存之后需要点击右上角发布按钮才会生效

Apollo 客户端操作

1、项目中引入 client 依赖

<!-- Apollo 分布式配置中心依赖 -->         <dependency>             <groupId>com.ctrip.framework.apollo</groupId>             <artifactId>apollo-client</artifactId>             <version>1.8.0</version>         </dependency>

2、application.properties 配置文件

在项目 Resource/META-INF/ 目录下创建 application.properties,其主要用于指定 appid, namespace 等 apollo 所需配置。

  • app.id:需要与我们在服务端创建应用时的 appid 对应
  • apollo.bootstrap.namespaces:要指定我们在 Apollo 创建的 Namespace,要注意我们刚创建的私有 application.yml 后缀也需要写上。公共配置文件部门前缀也需加上。
app.id=spider # 注入默认的 namespace application.properties apollo.bootstrap.enabled = true # 注入其他的 namespace apollo.bootstrap.namespaces = application.yml,TEST1.spider_media_url.yml # 是否自动更新(默认为 true) apollo.autoUpdateInjectedSpringProperties=true # 客户端定时从Apollo配置中心服务端拉取应用的最新配置,默认5分钟,单位(分钟) apollo.refreshInterval=1 # 使Apollo的加载顺序放到日志系统加载之前 # apollo.bootstrap.eagerLoad.enabled=true # Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行,本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\ #apollo.cache-dir=/opt/data/some-cache-dir 

3、指定 Env 环境

上文说到,我们在服务端区分环境添加好对应的配置之后,我们客户端在启动时需要告知应从哪个环境中拉取配置,官方文档提供了多种方式。

https://www.apolloconfig.com/#/zh/usage/java-sdk-user-guide?id=_1241-environment

笔者采用了通过配置文件方式来指定环境

  • 对于Mac/Linux,默认文件位置为/opt/settings/server.properties
  • 对于Windows,默认文件位置为C:\opt\settings\server.properties

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

创建server.properties

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

指定当前环境

除了上面这种设置环境的方式,另一种用的比较多的是可以在启动 Springboot jar 时通过 Java System Property 进行指定

java -Denv=YOUR-ENVIRONMENT -jar xxx.jar

4、Apollo Meta Server 指定

在 Resource 目录下创建 apollo-env.properties 结合 Env 环境来指定 Apollo Meta Server

dev.meta=http://localhost:8080  fat.meta=http://apollo.fat.xxx.com uat.meta=http://apollo.uat.xxx.com pro.meta=http://apollo.xxx.com

5、添加注解

项目启动类添加 @EnableApolloConfig 注解

@SpringBootApplication @MapperScan("com.xxx.spider.mapper") @EnableApolloConfig @EnableScheduling    // 开启定时任务 public class SpiderApplication {     public static void main(String[] args) {         SpringApplication.run(SpiderApplication.class, args);     } }

6、备份

把原先的 yml 等配置文件做好备份并从项目中删除,项目中只保留关于 Apollo 的配置文件

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

(补充)根据官方文档,以上那些参数配置也可以不在项目中设置配置文件,而采用启动参数的方式,这就可根据实际情况进行配置方式选择。

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

自此便将 Springboot 项目的配置文件成功迁移到 Apollo 配置中心上,启动项目打印如下:

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

拓展资料

1、修改配置实时更新原理:Http Long Polling + Spring 拓展机制Apollo通过自定义的BeanPostProcessor(Bean后置处理器)和BeanFactoryPostProcessor将参数中包含${...}占位符和@Value注解的Bean注册到Apollo框架中定义的注册表中。然后通过http长轮询不断地去拉取配置中心服务端的最新配置信息,一旦配置发生变化,Apollo会根据变化的配置key找到对应的Bean,然后修改Bean的属性,从而实现了配置动态生效的特性

https://blog.csdn.net/fedorafrog/article/details/103919805

2、Apollo 架构解析

实践:把Springboot项目配置迁移至 Apollo 配置管理中心

https://blog.csdn.net/zjh_746140129/article/details/86179522

3、Apollo 官方文档

https://www.apolloconfig.com/#/zh/README

Apollo配置管理中心 springboot apollo配置中心 bootstrap windows Apollo Spring https Linux 定时任务 文件系统 本地缓存 http Java html 分布式 数据库 ide SSO CDC
分享到:

您可能还会对下面的文章感兴趣: