十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apollo配置中心从入门到精通:架构、部署与动态配置实战

Apollo配置中心从入门到精通:架构、部署与动态配置实战 1. 项目概述为什么是Apollo如果你正在接触分布式系统、微服务或者你的团队正在为配置管理头疼——配置文件散落在各个服务里改个数据库地址都得重启好几个应用那“Apollo”这个名字你肯定不陌生。它不是什么新潮概念而是经过无数大厂生产环境验证过的、开源的分布式配置中心。简单说它就是把我们以前写在application.properties或application.yml里的那些配置项统一放到一个中心化的平台去管理。这样一来发布新功能时想动态调整个参数线上出问题了想快速降级某个开关不同环境开发、测试、生产的配置需要隔离这些以前需要运维同学半夜爬起来改配置、重启服务的操作现在在Apollo的Web界面上点几下鼠标就能实时推送到所有相关应用而且应用还不用重启。我最早接触Apollo是在一个微服务重构项目里当时几十个服务每个服务都有自己的一堆配置文件管理起来简直是噩梦。自从上了Apollo研发效率和对线上问题的响应速度那提升可不是一星半点。所以这篇“超级详细”的入门指南就是把我从零开始搭建、配置、到实际业务接入踩过的所有坑以及那些官方文档里不会细说的“潜规则”给你一次性讲透。无论你是想自己搭建一套玩玩还是团队正准备引入跟着这篇走保你能避开90%的初期弯路。2. Apollo核心架构与设计思路拆解要玩转一个系统先得搞清楚它肚子里装的是什么。Apollo的架构设计得非常清晰理解了它的组件和交互后面无论是部署还是排错你心里都会有张地图。2.1 四大核心组件各司其职Apollo不是一个大单体它由几个独立部署的组件构成各司其职共同协作。Config Service配置服务这是核心中的核心干的是“提供配置”的活。你的业务应用在启动时或者定时拉取配置时请求的就是它。它自己不存数据而是从数据库里读取配置信息然后返回给客户端。它的设计是无状态的这意味着你可以水平部署多个实例前面挂个负载均衡器轻松实现高可用和水平扩展。我见过不少团队一开始只部署一个流量一大就扛不住其实多加几个实例配置一下Nginx问题就解决了。Admin Service管理服务这是给咱们“配置管理员”用的后台服务。你在Apollo那个漂亮的Portal界面上进行的任何操作——比如新建一个配置、修改某个key的值、发布一个版本——最终都是通过调用Admin Service来完成的。它负责将你的操作持久化到数据库。同样它也是无状态的可以多实例部署。Portal配置门户这就是我们常说的“管理后台”或者Web UI。一个基于Spring Boot的独立Web应用。我们通过浏览器访问的就是它。它本身不直接操作数据库所有对配置的增删改查请求都通过调用后端的Admin Service来完成。Portal还负责用户权限管理、项目管理、集群管理这些上层建筑。Client客户端这是集成到我们业务应用中的部分。通常以SDK比如Java的apollo-client的形式存在。它负责与Config Service通信拉取配置并监听配置的变更。当你在Portal上改了配置并发布后Config Service会通过一种高效的机制后面会细说通知ClientClient收到通知后会主动去拉取最新的配置并更新到内存中整个过程对应用代码几乎是透明的。2.2 数据流转与“推拉结合”的奥秘理解了谁是谁还得知道它们怎么“说话”。Apollo配置更新的及时性是其一大亮点这得益于它“推拉结合”的机制。应用启动与长轮询你的应用集成了Apollo Client启动时会从Config Service拉取一次完整的配置。之后Client会启动一个长轮询任务定期默认1秒去询问Config Service“我关心的那个配置Namespace有没有新版本”这个请求会挂起一段时间默认60秒。配置发布与通知当你在Portal发布了一个配置Admin Service会更新数据库并同时发布一个配置变更通知到一个叫ReleaseMessage的表并通知Config Service通常通过部署在同一内网的Eureka等注册中心或者直接的内存通知机制。实时推送与主动拉取Config Service发现有配置更新后会立即结束那些正在挂起的长轮询请求返回“有变更”的响应。Client收到这个响应后并不会直接拿到新配置的值而是会立即发起一次新的请求去拉取完整的、最新的配置内容。所以严格来说Apollo是“推通知 拉数据”既保证了实时性秒级又保证了数据传输的可靠性和完整性。这里有个非常关键的实操心得很多人会误解“auto update apollo changed value successfully”这个日志。这个日志只代表Client收到了变更通知并成功拉取到了新配置。但是这个新配置值是否已经应用到你的业务代码里是另一回事这取决于你的代码是如何使用配置的。如果你是用Value注解并且没有配合RefreshScopeSpring Cloud环境或者没有使用Apollo的ConfigChangeListener监听器那么即使配置中心的值变了你内存中的变量还是旧的。这就是为什么有时候你在Portal上看到“new value”但程序行为还是“旧的值”的原因。这一点是初期接入最容易踩的坑后面我们会详细讲如何避免。2.3 环境、集群与Namespace的三层模型Apollo通过三层模型来优雅地管理配置的复杂性这是它设计上非常精妙的地方。环境Environment这是最顶层隔离比如DEV开发、FAT测试、UAT预发布、PRO生产。不同环境的Apollo服务端Config/Admin Service、数据库、甚至Portal都是物理隔离或逻辑隔离的。客户端通过指定env参数如启动参数-DenvPRO来决定连接哪个环境。集群Cluster在同一个环境下可以为不同的服务集群分配不同的配置。比如你在生产环境PRO下可能有机房A和机房B两个集群它们的数据库连接地址可能不同。你可以为“机房A集群”设置特定的配置覆盖掉默认的公共配置。客户端默认使用default集群可以通过apollo.cluster指定。命名空间Namespace这是配置的集合单元也是我们最常打交道的概念。默认的命名空间叫application。你可以根据功能、团队、组件创建不同的Namespace例如redis-config、business-rules。Namespace有两种类型私有Namespace归属于某个项目只有该项目下的应用可以读取。公共Namespace可以被多个项目共享比如公司级的中间件配置、邮件模板等。公共Namespace的配置一旦在某个项目中被发布所有关联项目都会生效。这里有个大坑修改公共Namespace一定要极其谨慎因为影响面广最好有严格的审批流程。3. 从零开始搭建Apollo服务端理论懂了手会痒。咱们来实际搭一套。为了覆盖最广泛的场景我们选择基于源码编译部署这样你对整个项目结构会有最深刻的理解。生产环境通常使用Kubernetes或成熟的发布系统但原理相通。3.1 环境准备与源码获取首先确保你的机器上有以下环境Java 8Apollo服务端主要是Java写的。建议用JDK 8或11这是经过最广泛验证的版本。MySQL 5.7Apollo的核心数据都存在MySQL里。生产环境务必用5.7或8.0。别用MariaDB虽然可能兼容但官方只保证MySQL。Maven 3.6用于编译项目。# 检查环境 java -version mysql --version mvn -v接下来从GitHub拉取源码。我建议拉取一个稳定的发布版本分支而不是默认的master避免遇到开发中的不稳定代码。git clone -b v2.1.0 https://github.com/apolloconfig/apollo.git cd apollo这里我选择了v2.1.0这是一个长期支持且非常稳定的版本。你可以去 Release页面 查看最新稳定版。3.2 数据库初始化Apollo的数据库脚本在scripts目录下。我们需要创建两个数据库ApolloConfigDB存储配置数据和ApolloPortalDB存储门户管理数据。-- 登录MySQL创建数据库和用户请替换your_password为强密码 CREATE DATABASE IF NOT EXISTS ApolloConfigDB DEFAULT CHARACTER SET utf8mb4; CREATE DATABASE IF NOT EXISTS ApolloPortalDB DEFAULT CHARACTER SET utf8mb4; CREATE USER apollo% IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON ApolloConfigDB.* TO apollo%; GRANT ALL PRIVILEGES ON ApolloPortalDB.* TO apollo%; FLUSH PRIVILEGES;然后分别执行对应的SQL脚本# 在apollo源码根目录下执行 mysql -uapollo -pyour_password ApolloConfigDB scripts/db/migration/configdb/V2.1.0__initialization.sql mysql -uapollo -pyour_password ApolloPortalDB scripts/db/migration/portaldb/V2.1.0__initialization.sql重要注意事项务必检查SQL脚本是否执行成功特别是表结构是否创建完整。曾经有同事因为MySQL版本问题脚本中某些语法执行失败导致后期服务启动各种诡异报错排查了半天才发现是数据库表缺字段。3.3 服务端配置与编译Apollo的配置主要通过scripts/build.sh和各个服务模块下的application-github.properties或-local文件来管理。我们以最简化的本地部署为例。修改公共配置编辑scripts/build.sh找到数据库连接配置部分修改为你自己的数据库信息。# apollo-configdb config_db_urljdbc:mysql://localhost:3306/ApolloConfigDB?characterEncodingutf8serverTimezoneAsia/Shanghai config_db_usernameapollo config_db_passwordyour_password # apollo-portaldb portal_db_urljdbc:mysql://localhost:3306/ApolloPortalDB?characterEncodingutf8serverTimezoneAsia/Shanghai portal_db_usernameapollo portal_db_passwordyour_password同时在这个文件里你可以定义Meta Server的地址。对于本地开发Config Service和Admin Service统称为Meta Server。我们假设部署在本机端口默认。# meta server url, different environments should have different meta server addresses dev_metahttp://localhost:8080 fat_metahttp://localhost:8080 uat_metahttp://localhost:8080 pro_metahttp://localhost:8080注意生产环境部署时pro_meta必须指向生产环境的真实地址并且通常是一个负载均衡器的地址后面会接多个Meta Server实例。编译打包在源码根目录下执行编译脚本。./scripts/build.sh这个脚本会依次编译apollo-configservice,apollo-adminservice,apollo-portal三个模块并生成对应的可执行Jar包和启动脚本输出在apollo-xxx/target/目录下。第一次编译会下载大量依赖需要一些时间。3.4 启动服务与验证编译成功后我们分别启动三个服务。建议按顺序启动Config Service - Admin Service - Portal。启动Config Servicecd apollo-configservice/target/ java -jar apollo-configservice-2.1.0.jar观察日志没有报错且看到类似Started ConfigServiceApplication in X seconds的日志说明启动成功。默认端口是8080。启动Admin Servicecd ../../apollo-adminservice/target/ java -jar apollo-adminservice-2.1.0.jar默认端口是8090。同样观察启动日志。启动Portalcd ../../apollo-portal/target/ java -jar apollo-portal-2.1.0.jar默认端口是8070。验证打开浏览器访问http://localhost:8070。你应该能看到Apollo的登录页面。默认超级管理员账号是apollo密码是admin。登录后你可以尝试创建一个项目比如叫SampleApp然后在默认的application命名空间下添加一个配置比如server.port 8081。如果页面操作流畅说明整个服务端链路基本通了。踩坑实录在启动时最常见的错误是数据库连接失败。请仔细检查build.sh中的数据库地址、端口、用户名密码以及MySQL服务是否正常运行且允许远程连接如果非本地。另一个常见错误是端口冲突确保8080,8090,8070端口没有被其他程序占用。4. 客户端接入与核心功能实战服务端跑起来了现在让我们开发一个最简单的Spring Boot应用把它接入Apollo体验动态配置的魅力。4.1 创建Spring Boot项目并引入依赖使用你喜欢的IDE如IntelliJ IDEA或 Spring Initializr 创建一个新的Spring Boot项目。在pom.xml中添加Apollo客户端依赖。对于Spring Boot 2.x推荐使用apollo-client的Spring Boot Starter它提供了最丝滑的集成体验。dependency groupIdcom.ctrip.framework.apollo/groupId artifactIdapollo-client/artifactId version2.1.0/version !-- 版本号尽量与服务端对应或兼容 -- /dependency !-- 如果你使用Spring Cloud还需要这个 -- dependency groupIdcom.ctrip.framework.apollo/groupId artifactIdapollo-client-config-data/artifactId version2.1.0/version /dependency4.2 配置application.yml与bootstrap.yml这是最关键的一步很多配置不生效的问题都出在这里。在Spring Boot中bootstrap.yml的加载优先级高于application.yml常用于配置应用启动时就需要知道的信息比如配置中心地址。创建src/main/resources/bootstrap.ymlapp: id: SampleApp # 必须与你在Apollo Portal中创建的项目AppId完全一致 apollo: bootstrap: enabled: true # 启用Apollo配置加载 eagerLoad: enabled: true # 在应用启动阶段就加载Apollo配置防止Value注入为null namespaces: application # 要加载的命名空间多个用逗号分隔如application,redis-config meta: http://localhost:8080 # Meta Server地址即你的ConfigService地址 cacheDir: /opt/data/apollo-config # 本地配置缓存目录防止配置中心不可用时应用无法启动app.id这是桥梁必须匹配。apollo.bootstrap.enabledtrue这是让Apollo在Spring Boot启动早期就介入的开关。apollo.bootstrap.eagerLoad.enabledtrue强烈建议开启。如果不开启在某些场景下Value注解可能会在Apollo配置加载前就被解析导致注入失败拿到null或默认值。apollo.meta指向你的Config Service地址也就是Meta Server。创建src/main/resources/application.ymlspring: application: name: apollo-demo-client server: port: 8088 # 这里设置一个默认端口但我们会用Apollo的配置覆盖它这里server.port我们故意写一个8088目的是为了演示Apollo配置的优先级更高。4.3 编写测试代码与配置拉取验证在Apollo Portal上配置登录Portal在SampleApp项目的application命名空间下添加一个配置项Key:server.portValue:8099点击“发布”。在Spring Boot应用中读取配置import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class ConfigController { // 方式1使用Value注解直接注入 Value(${server.port:8080}) // 冒号后面是默认值如果Apollo中没找到则使用此值 private String serverPort; // 方式2也可以注入Apollo的Config对象进行编程式读取更灵活 // Autowired // private Config config; GetMapping(/getPort) public String getServerPort() { return Current server port from Apollo is: serverPort; } // 模拟一个需要动态开关的接口 Value(${feature.toggle.newPayment:false}) private boolean newPaymentFeatureEnabled; GetMapping(/payment) public String payment() { if (newPaymentFeatureEnabled) { return Using NEW payment gateway!; } else { return Using OLD payment gateway.; } } }启动应用并测试启动你的Spring Boot应用。观察启动日志你应该能看到类似下面的信息表明Apollo客户端成功连接并拉取了配置Loading Apollo Config Service from http://localhost:8080... Apollo Config Service initialized for appId: SampleApp应用启动后访问http://localhost:8099/getPort注意端口是8099不是8088。你会看到页面显示Current server port from Apollo is: 8099。这证明了Apollo的配置成功覆盖了本地application.yml中的配置。此时如果你去Apollo Portal上将server.port的值修改为8098并发布。稍等片刻通常1-2秒无需重启应用再次访问http://localhost:8099/getPort可能会失败因为端口变了但你可以尝试访问http://localhost:8098/getPort如果能看到返回值就证明了配置的动态更新。实际上server.port这个属性比较特殊Spring Boot在运行时动态修改它并不会改变正在监听的端口。但对于我们自定义的业务配置如feature.toggle.newPayment动态更新是立即生效的。4.4 实现配置动态更新与监听要让Value注解的字段也能动态更新你需要结合Spring Cloud的RefreshScope注解如果你用的是Spring Cloud或者使用Apollo原生的监听器。方法一使用RefreshScope(Spring Cloud方式)import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RestController; RestController RefreshScope // 加上这个注解 public class DynamicController { Value(${feature.toggle.newPayment:false}) private boolean newPaymentFeatureEnabled; GetMapping(/checkFeature) public String checkFeature() { return New payment feature enabled: newPaymentFeatureEnabled; } }当Apollo配置变更后这个Bean会被重新创建新的配置值会注入进来。访问/checkFeature接口就能看到变化。方法二使用Apollo的ConfigChangeListener(更底层、更灵活)import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigService; import com.ctrip.framework.apollo.model.ConfigChangeEvent; import com.ctrip.framework.apollo.spring.annotation.ApolloConfig; import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; Component public class MyApolloConfigListener { // 注入指定Namespace的Config对象 ApolloConfig(application) private Config config; // 监听指定Namespace的配置变化 ApolloConfigChangeListener(application) private void onChange(ConfigChangeEvent changeEvent) { // 判断我们关心的key是否发生了变化 if (changeEvent.isChanged(feature.toggle.newPayment)) { String newValue changeEvent.getChange(feature.toggle.newPayment).getNewValue(); System.out.println(Feature newPayment changed to: newValue); // 这里可以执行一些自定义逻辑比如刷新缓存、重置连接池等 // 注意这里只是拿到了新值你的业务变量如Value注入的可能还没变需要结合方法一或手动更新。 } } // 编程式获取配置 PostConstruct public void printConfig() { String value config.getProperty(some.key, defaultValue); System.out.println(Value of some.key: value); } }这种方式非常强大你可以在配置变更时执行任何复杂的业务逻辑。5. 高级特性与生产级考量当你完成了基础接入想要将Apollo用于生产环境时下面这些高级特性和注意事项就必须了解了。5.1 多环境配置与灰度发布多环境管理在Portal的“管理员工具” - “系统参数”里可以配置各个环境的Meta Server地址。客户端通过env参数JVM参数-DenvPRO、环境变量APOLLO_ENVPRO或bootstrap.yml中配置apollo.envPRO来指定使用哪个环境。最佳实践是在部署脚本或容器启动命令中注入这个参数。灰度发布这是Apollo非常实用的一个功能。当你对一个关键配置的修改没有十足把握时可以先只对一小部分应用实例生效。在Portal上修改配置后不要直接点击“发布”而是点击“灰度发布”。输入灰度规则比如按IP地址10.0.0.1、按服务器集群cluster或者按自定义的label需要在客户端通过apollo.label指定。选择一台或几台机器作为灰度机器。点击“灰度发布”。此时只有被选中的灰度机器会接收到新的配置其他机器仍使用旧配置。在灰度机器上观察业务运行是否正常。如果一切OK可以“全量发布”如果发现问题可以“放弃灰度”灰度机器会自动回滚到上一个全量发布的版本。这个功能在需要修改数据库连接池参数、开关降级等场景下能极大地降低风险。5.2 配置的权限管理与审计对于企业级应用权限控制必不可少。Apollo Portal提供了完善的权限体系。项目权限可以为项目分配管理员、编辑、发布、浏览等不同角色。比如开发同学有编辑权限但发布需要组长审批发布权限。Namespace权限可以针对某个Namespace进行更细粒度的授权。操作审计Portal记录了所有的配置修改、发布、回滚操作包括操作人、时间、IP和具体变更内容。这对于问题追溯和安全合规非常重要。实操心得建议初期就规划好权限模型。例如为每个微服务团队创建一个Apollo项目团队负责人作为项目管理员普通开发为编辑者。对于公共Namespace设置一个公共配置管理团队只有该团队的成员有发布权限。5.3 客户端高可用与容灾策略绝不能因为配置中心挂了导致所有应用都启动不了。Apollo客户端设计时就考虑了高可用。本地缓存客户端拉取到配置后会持久化到本地文件系统apollo.cacheDir指定的目录。当Apollo服务端完全不可用时客户端会使用本地缓存文件中的配置来启动应用。务必设置一个合理的、有读写权限的cacheDir。配置访问策略客户端支持配置多个Meta Server地址用逗号分隔它会按顺序尝试直到成功为止。客户端容灾脚本Apollo提供了一个apollo-client的扩展包apollo-client-config-util里面包含了一个ConfigUtil工具类可以在应用启动前通过脚本预先从Apollo拉取配置到本地作为一种更强的容灾保障。生产环境部署建议服务端Config Service和Admin Service至少部署2个实例前面用Nginx或硬件负载均衡器做负载和故障转移。Portal可以单实例因为它的可用性要求相对低一些。数据库MySQL必须做主从或集群保证数据可靠性。客户端配置apollo: meta: http://config-service-lb-1:8080,http://config-service-lb-2:8080 # 多个Meta Server地址 cacheDir: /opt/data/{{app.id}}/apollo-config # 缓存目录按应用区分 bootstrap: enabled: true eagerLoad: enabled: true config-service: refresh-interval: 5 # 配置服务刷新间隔单位分钟默认5。在服务端不可用时客户端会按此频率尝试重连。5.4 与Spring Boot配置的优先级与覆盖关系这是一个容易混淆的点。Spring Boot的配置源有很多它们的优先级从高到低大致是命令行参数--server.port9000SPRING_APPLICATION_JSON环境变量中的JSONApollo配置中心远程bootstrap.yml/bootstrap.propertiesapplication.yml/application.propertiesConfiguration类上的PropertySourceSpring Boot默认属性关键规则Apollo远程配置的优先级高于本地的bootstrap.yml和application.yml。这意味着如果Apollo上有某个配置项它会覆盖本地文件中的相同项。如果Apollo上删除了某个已发布的配置项客户端会回退到本地配置文件中的值如果有的话。6. 常见问题排查与实战技巧实录即使按照指南操作在实际接入中还是会遇到各种问题。这里把我遇到的和社区里常见的问题做个汇总。6.1 问题排查清单问题现象可能原因排查步骤与解决方案客户端启动报错Apollo.Config is not initialized yet...1.apollo.bootstrap.enabled未设置为true。2.app.id未设置或与Portal中的AppId不匹配。3.apollo.meta地址错误或网络不通。4. 依赖缺失或版本冲突。1. 检查bootstrap.yml配置。2. 核对app.id区分大小写。3. 用curl或浏览器测试{apollo.meta}/services/config能否访问。4. 检查Maven依赖树排除冲突的旧版本。Value注入的值为null或默认值1.apollo.bootstrap.eagerLoad.enabled未开启注入早于配置加载。2. 配置的Key在Apollo中不存在。3. 使用了RefreshScope但Bean未被正确代理。1.务必开启eagerLoad。2. 登录Portal确认Key是否存在且已发布。3. 检查类路径确保spring-cloud-context依赖存在。配置已修改并发布但应用未生效1. 客户端未正确监听变更长连接失败。2. 使用了Value但未配合RefreshScope或监听器。3. 客户端IP不在灰度规则内或配置未发布到对应环境/集群。1. 查看客户端日志搜索long polling关键词看是否正常。2. 对需要热更新的字段使用RefreshScope或监听器。3. 检查Portal上的发布环境、集群和灰度规则。日志显示auto update apollo changed value successfully但业务代码还是旧值这是最经典的误解。这个日志只代表配置在Apollo客户端内存中更新成功。业务代码中引用配置的方式决定了它是否感知更新。如果是静态变量、或是在初始化阶段就固定下来的值则不会变。必须通过RefreshScope、ConfigChangeListener或从Config对象实时getProperty来获取最新值。Portal操作缓慢或无法打开1. Portal服务内存不足或GC频繁。2. 数据库连接池耗尽或慢查询。3. 网络问题。1. 检查Portal实例的JVM内存和GC日志。2. 检查MySQL性能优化Item、Release等核心表的查询。3. 检查网络延迟和带宽。6.2 实战技巧与“潜规则”Namespace命名规范建议使用小写字母连字符的格式如application,datasource,redis-cluster。避免使用特殊字符和空格。配置项Key的设计使用点分式spring.datasource.url或下划线式spring_datasource_url保持风格统一。Apollo本身对Key格式没有限制但点分式能与Spring Boot原生配置风格完美融合。敏感配置加密数据库密码、API密钥等敏感信息不应明文存储在Apollo中。可以使用Apollo提供的密钥加密功能企业版功能或者在使用前在应用层进行解密如使用Jasypt。社区也有将Apollo与Vault集成的方案。关于spring boot apollo 读取本地文件配置有时我们希望部分配置如仅本地开发使用的放在本地文件不被Apollo覆盖。可以在bootstrap.yml中通过spring.cloud.apollo.override-system-propertiesfalse来禁用Apollo对系统属性的覆盖但更常见的做法是在Apollo中为不同环境DEV, PRO设置不同的值而不是依赖本地文件。本地开发时可以连接DEV环境的Apollo。如果必须用本地文件可以考虑使用Spring Profilesapplication-local.yml来覆盖特定环境的配置并确保该Profile下的配置不提交到代码库。客户端日志调优Apollo客户端的日志级别默认是INFO可能会比较吵。如果不需要详细日志可以在logback-spring.xml中调整logger namecom.ctrip.framework.apollo levelWARN/监控与告警务必对Apollo服务端JVM指标、接口响应时间和客户端配置拉取失败次数、长轮询异常做好监控。配置发布是一项高危操作建议与公司的发布系统集成并设置关键配置变更的审批流和操作告警。从最初的手动管理配置文件到引入Apollo实现配置的集中化、动态化管理这个转变带来的运维效率和研发体验的提升是巨大的。它不仅仅是一个工具更是一种工程实践。我个人的体会是引入配置中心的最佳时机就是在你第一次为“改个配置需要重启一堆服务”而感到痛苦的时候。前期花点时间搭建和磨合后期在应对快速迭代、故障应急、多环境部署时你会感谢当初的这个决定。最后一个小建议在全面推广前先在一个非核心的服务上做一次完整的试点把整个流程跑通把该踩的坑都踩一遍形成你们团队自己的接入规范和运维手册这样后续的推广就会顺利得多。
返回列表