说明:
(如果微服务开发没有严格统一的代码开发规范,不建议采用apollo,否则只会更浪费时间在一堆配置上)
通常情况下,我们无论是但模块开发,还是微服务多模块开发,都采用springboot一个个模块,每个模块服务中都有一个一个配置文件,application.yml或者application.properties。
每个配置文件中都设置 端口号、服务名称,mysql、redis等其他一些中间件的连接信息,这样虽然方便开发,但是在正式部署的情况下,或造成一些问题:
第一:配置文件跟随jar包运行,不加密的情况下容易导致数据库和中间件账号密码等关键信息暴露
第二:服务模块大规模集群情况下,每个都有大部分相同的配置,重复配置
第三:如果需要改配置信息,需要重新部署发布应用才能生效
apollo配置可以动态更新配置,利用namespaces可以把公用配置抽取出来,如mysq密码连接方式,elasticsearch、redis、naocs、rocketmq等中间件
apollo有三个模块:
apollo-configservice:配置中心(默认端口8080),和springboot进行连接的配置中心,里面还包含了Eureka注册中心
apollo-adminservice:管理中心(默认端口8090)。提供配置的修改、发布等功能,服务对象是 Apollo Portal(管理界面)
apollo-portal:提供Web界面的服务(默认端口8070),启动成功后,可以打开http://localhost:8070/登录web界面,默认账号密码是apollo/admin
概念:
Apollo支持4个维度管理Key-Value格式的配置:
● application (应用),即 app.id 参数
● environment (环境)
● cluster (集群)
● namespace (命名空间)
(1)、application
● Apollo 客户端在运行时需要知道当前应用是谁,从而可以根据不同的应用来获取对应应用的配置。
● 每个应用都需要有唯一的身份标识,可以在代码中配置 app.id 参数来标识当前应用,Apollo 会根据此指来辨别当前应用。
(2)、environment
Apollo 中默认提供了四种环境:
● FAT(Feature Acceptance Test):功能测试环境
● UAT(User Acceptance Test):集成测试环境
● DEV(Develop):开发环境
● PRO(Produce):生产环境
在程序中如果想指定使用哪个环境,可以配置变量 env 的值为对应环境名称即可
(3)、cluster
● 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
● 对不同的集群,同一个配置可以有不一样的值,比如说上面所指的两个北京、上海两个机房设置两个集群,两个集群中都有 mysql 配置参数,其中参数中配置的地址是不一样的。
(4)、namespace
配置环境分类,比如jdbc、redis、es分为不同的名称空间,可以把它当成分组的概念,假设A服务同时间需要jdbc、redis、mq的配置,就直接在application.yml中配置多个名称空间配置即可
apollo中间件部署
需要先安装JDK1.8+ 和mysql5.7+环境,apollo的三个模块依赖他们,且需要导入apollo设计的数据库和表
参考:官方部署文档 https://www.apolloconfig.com/#/zh/deployment/quick-start
sprinboot使用:
(1)引入依赖:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.0.1</version>
</dependency>
(2)application.yml配置
app:
id: demo_0306 # apollo配置的应用id,一般是一个平台下的所有jar包模块公用一个应用id
apollo:
bootstrap:
enabled: true # 启用apollo,或者在启动类上加上@EnableApolloConfig,一样的效果
namespaces: application # apollo中配置的空间名称
meta: http://192.168.13.21:8080 # apollo配置服务Config Services模块的连接信息,端口默认是8080
其他更多参数设置说明
#Apollo 配置
app:
id: apollo-test #应用ID
apollo:
cacheDir: /opt/data/ #配置本地配置缓存目录,一旦配置中心失联,可以保证可用
cluster: default #指定使用哪个集群的配置
meta: http://192.168.2.11:30002 #DEV环境配置中心地址
autoUpdateInjectedSpringProperties: true #是否开启 Spring 参数自动更新
bootstrap:
enabled: true #是否开启 Apollo
namespaces: application #设置 Namespace
eagerLoad:
enabled: false #将 Apollo 加载提到初始化日志系统之前
其他:
动态配置的局限:
端口号没法自动更新,就算开启了autoUpdateInjectedSpringProperties:true,也不行
除了 server.port 外,还有一些配置参数是无法通过动态更新实现的,包括但不限于:
- 应用程序日志级别:通常应用程序的日志级别在应用启动时已经确定,无法通过动态更新配置参数来实现实时调整日志级别。
- 数据库连接信息:数据库连接信息如数据库地址、用户名、密码等通常在应用启动时已经加载并建立连接,无法通过动态更新配置参数来实现实时更改数据库连接信息。
- 安全相关配置:涉及安全认证、权限控制等敏感配置通常在应用启动时已经加载并生效,无法通过动态更新配置参数来实现实时更改。
- 静态资源路径:应用程序的静态资源路径通常在应用启动时已经确定,无法通过动态更新配置参数来实现实时更改静态资源路径。
这些配置参数一般需要在应用启动时确定,并且涉及到应用程序的核心功能或安全性,因此无法通过动态更新配置参数的方式来实现实时更改。