背景
SpringBoot引用Apollo(阿波罗)分布式配置管理中心后,Docker中服务启动速度变慢,刚开始启动只需要20s,加入配置后启动需要两分钟。每次部署服务都需要多浪费时间,这是为什么?要怎么解决呢?
原因
通过分析日志, 每次启动服务,都需要从Apollo服务拉取配置然后处理一分多时间导致总体时间很长
日志如下
[main] INFO c.c.f.f.i.p.DefaultServerProvider -Environment is set to null. Because it is not available in either (1) JVM system property 'env', (2) OS env variable 'ENV' nor (3) property 'env' from the properties InputStream.
[main] WARN c.c.f.a.i.DefaultMetaServerProvider -Could not find meta server address, because it is not available in neither (1) JVM system property 'apollo.meta', (2) OS env variable 'APOLLO_META' (3) property 'apollo.meta' from server.properties nor (4) property 'apollo.meta' from app.properties
[main] WARN c.c.f.apollo.core.MetaDomainConsts -Meta server address fallback to http://apollo.meta for env UNKNOWN, because it is not available in all MetaServerProviders
Started App in 114.872 seconds (JVM running for 118.52)
拉取流程:
解决
启动本地模式,使用挂载让容器内服务访问的配置文件存在。
步骤1、加入启动参数-Denv=local
示例
java -Denv=local -jar xxx.jar
步骤2、保证配置文件已被拉取且是最新
配置默认路径
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache
本地模式启动日志:
[main] INFO c.c.f.f.i.p.DefaultServerProvider -Loading opt\settings\server.properties
[main] INFO c.c.f.f.i.p.DefaultServerProvider -Environment is set to [local] by JVM system property 'env'.
[TID: N/A] [main] WARN c.c.f.a.spi.DefaultConfigFactory -==== Apollo is in local mode! Won't pull configs from remote server for namespace ! ====
官网地址:
https://www.apolloconfig.com/#/zh/usage/java-sdk-user-guide
小拓展
Apollo
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
Spring Cloud Config
在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。
在spring cloud config 组件中,分两个角色,一是config server,二是config client。
Config Server是一个可横向扩展、集中式的配置服务器,它用于集中管理应用程序各个环境下的配置,默认使用Git存储配置文件内容,也可以使用SVN存储,或者是本地文件存储。
Config Client是Config Server的客户端,用于操作存储在Config Server中的配置内容。
微服务在启动时会请求Config Server获取配置文件的内容,请求到后再启动容器。
Nacos
官网地址:
https://nacos.io/zh-cn/docs/v2/what-is-nacos.html Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
服务注册发现和服务健康检测
动态配置服务
动态DNS服务
服务及元数据管理
通过以上流行配置中心介绍,推荐使用nacos。
你们配置中心使用的是什么呢?