基于Spring Cloud的Apollo配置中心
Springboot项目如何使用apollo配置中心

Springboot项目如何使用 apollo配置中心
这篇文章主要介绍了Springboot项目如何使用apollo配置中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有 一定的参考学习价值,需要的朋友可以参考下
1. 引入 apollo 配置依赖
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.1.0</version>
</dependency>
或者在配置文件中添加,让配置中心的配置生效
apollo.bootstrap.enabled=true
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
2. 在应用名添加 apollo 配置开启
@Enableent
-Dapp.id=YOUR-APP-ID -Denv=YOUR-ENVIRONMENT
4. 删除本地配置文件
application.properties/application.yml
阿波罗动态配置实现原理

阿波罗动态配置实现原理
阿波罗是一款开源的分布式配置中心,由携程框架部门开发。
它可以实现应用程序的动态配置管理,从而使得应用程序能够在运行时灵活地获取最新的配置信息。
阿波罗的实现原理主要包括以下几个方面:
1. 数据存储
阿波罗使用数据库来存储配置信息,它支持多种类型的数据库,包括MySQL、Oracle、SQL Server等。
在存储配置信息时,阿波罗会根据应用程序的不同需求,将配置信息按照不同的维度进行划分和管理,从而使得配置信息更加高效地被应用程序所使用。
2. 配置发布
阿波罗的配置发布具有灵活性和高效性,它可以根据配置变更的情况自动进行发布,从而使得应用程序可以及时获取最新的配置信息。
同时,阿波罗的配置发布还支持版本管理和回滚功能,可以保证配置信息的稳定性和可靠性。
3. 配置获取
阿波罗的配置获取可以通过多种方式实现,包括HTTP接口、Java API等。
应用程序可以根据自身的需求选择相应的获取方式。
在获取配置信息时,阿波罗还支持配置缓存和自动更新功能,可以提高应用程序的性能和可靠性。
4. 安全性
阿波罗的安全性是非常重要的,它对配置信息的存储、发布和获
取都进行了严格的安全策略控制,包括访问控制、数据加密等。
阿波罗还支持多种身份认证方式,包括用户名密码、OAuth2等,可以保证配置信息的安全性和保密性。
总之,阿波罗是一款功能强大、性能高效、安全可靠的分布式配置中心,它可以帮助应用程序实现动态配置管理,提高应用程序的可维护性和可靠性。
springboot项目中如何使用Apollo配置中心

springboot项⽬中如何使⽤Apollo配置中⼼为什么要使⽤Apollo在开发应⽤的时候我们常常需要把⼀些属性抽取出来放在配置⽂件⾥⾯,⽅便后⾯根据需要进⾏修改。
在没有使⽤配置中⼼之前,可能我们只是把配置都放在项⽬的配置⽂件下⾯,这样虽然是省事了不少,但也有⼀些缺点,⽐如想要修改配置的时候需要重新构建项⽬和重启服务、⽣产环境上⼀些敏感的配置容易泄露等等。
Apollo安装这个可以上github,上⾯有详细的安装说明⽂档,,下⾯主要讲下在代码⾥⾯的使⽤在项⽬pom.xml中引⼊apollo相关jar包<dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.4.0</version></dependency>在配置⽂件(application.properties)中添加apollo相关配置# apollo集成# apollo 配置应⽤的 appidapp.id=test# apollo meta-server地址,⼀般同config-server地址#当前环境服务配置地址,⽣产环境建议⾄少双节点,可以填写多个逗号分隔,使⽤⼀个单独的域,如 (由nginx等软件负载平衡器⽀持),⽽不是多个IP地址,因为服务器可能会扩展或缩⼩。
apollo.meta=http://10.0.0.220:8080#启⽤apollo配置开关apollo.bootstrap.enabled=true#将Apollo配置加载提到初始化⽇志系统之前apollo.bootstrap.eagerLoad.enabled=true# apollo 使⽤配置的命名空间,多个以逗号分隔spaces = applicationjava代码中读取apollo配置的⼏种写法:1. 通过@Configuration和@Value注解的⽅式,此种⽅式发布会⾃动刷新@Configurationpublic class JavaConfigBean1 {@Value("${timeout:20}")private int timeout;public int getTimeout() {return timeout;}}2. 使⽤@ConfigurationProperties读取,此种⽅式发布不会⾃动刷新@Configuration@ConfigurationProperties(prefix = "xx")public class JavaConfigBean2 {private String name;public String getName() {return name;}public void setName(String name) { = name;}}3. 使⽤@ApolloConfig读取,此种⽅式发布会⾃动刷新@ApolloConfigprivate Config config;@GetMapping("/test3")public String test3(){Set <String> propertyNames = config.getPropertyNames();propertyNames.forEach(key -> {System.err.println(key+"="+config.getIntProperty(key,0));});return propertyNames.toString();}4. 使⽤@ApolloJsonValue读取,此种⽅式会⾃动刷新@ApolloJsonValue("${jsonBeanProperty:[]}")private List<User> anotherJsonBeans;@GetMapping("/test4")public void test4(){anotherJsonBeans.forEach(item -> {System.err.println(item.getUsername()+"--"+item.getPassword());});}⾃动刷新就是改了配置中⼼的配置可以不⽤重启服务,常⽤的使⽤⽅式就以上这些,当然还有⼀些复杂的使⽤⽅式,⽐如动态数据源等实现⽅式可以看官⽅的demo。
Apollo(阿波罗)分布式配置中心

Apollo(阿波罗)分布式配置中⼼第⼀部分: Apollo简介随着程序功能的⽇益复杂,程序的配置⽇益增多:各种功能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来越⾼:配置修改后实时⽣效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……在这样的⼤环境下,传统的通过配置⽂件、数据库等⽅式已经越来越⽆法满⾜开发⼈员对配置管理的需求。
Apollo配置中⼼应运⽽⽣!1、Apollo简介Apollo⽀持4个维度管理Key-Value格式的配置:application (应⽤)environment (环境)cluster (集群)namespace (命名空间)配置基本概念配置是独⽴于程序的只读变量配置独⽴于程序的,同⼀个程序在不同的配置下有不同的⾏为配置对于程序是只读的,程序通过读取配置来改变⾃⼰的⾏为,程序不应该去改变配置配置伴随应⽤的整个⽣命周期配置贯穿于应⽤的整个⽣命周期,应⽤在启动时通过读取配置来初始化,在运⾏时根据配置调整⾏为配置可以有多种加载⽅式配置⽂件、环境变量、启动参数、基于数据库配置需要治理权限控制(由于配置能改变程序的⾏为,不正确的配置甚⾄能引起灾难,所以对配置的修改必须有⽐较完善的权限控制)不同环境、集群配置管理(同⼀份程序在不同的环境(开发,测试,⽣产)、不同的集群(如不同的数据中⼼)经常需要有不同的配置,所以需要有完善的环境、集群配置管理)为什么需要Apollo统⼀管理不同环境、不同集群的配置Apollo提供了统⼀界⾯集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
同⼀份代码部署在不同的集群,可以有不同的配置,⽐如zookeeper的地址等通过命名空间(namespace)可以很⽅便地⽀持多个不同应⽤共享同⼀份配置,同时还允许应⽤对共享的配置进⾏覆盖配置修改实时⽣效(热发布)⽤户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应⽤程序版本发布管理所有的配置发布都有版本管理,从来很⽅便的⽀持配置回滚灰度发布⽀持配置的灰度发布,⽐如点了发布后,只对部分应⽤实例⽣效,等观察⼀段时间没问题后再推给所有应⽤实例权限管理、发布审核、操作审计应⽤和配置的管理都有完善的权限管理机制所有操作都有审计⽇志客户端配置信息监控可以在界⾯上⽅便地看到配置在被哪些实例使⽤提供Java和.Net原⽣客户端提供开放平台API部署简单 2、Apollo配置中⼼设计基础模型⽤户在配置中⼼对配置进⾏修改并发布配置中⼼通知Apollo客户端有配置更新Apollo客户端从配置中⼼拉取最新的配置、更新本地配置并通知到应⽤架构模块Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界⾯)Config Service和Admin Service都是多实例、⽆状态部署,所以需要将⾃⼰注册到Eureka中并保持⼼跳在Eureka之上我们架了⼀层Meta Server⽤于封装Eureka的服务发现接⼝Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),⽽后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),⽽后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑⾓⾊部署在同⼀个JVM进程中为什么需要eureka由于config-server和admin-server会部署多个,哪个前端client(⽐如JAVA)和portal怎么找到对应的config和admin呢?Apollo配置中⼼是基于Spring Cloud开发的,我们引⼊eureka作为服务注册及服务发现,Client和Portal通过eureka获取到对应config-server和admin-server的地址,然后直接于config-server或admin-server联系各模块概要介绍Config Service提供配置获取接⼝提供配置更新推送接⼝(基于Http long polling)服务端使⽤Spring DeferredResult实现异步化,从⽽⼤⼤增加长连接数量⽬前使⽤的tomcat embed默认配置是最多10000个连接(可以调整),使⽤了4C8G的虚拟机实测可以⽀撑10000个连接,所以满⾜需求(⼀个应⽤实例只会发起⼀个长连接)。
Apollo配置中心的部署与使用经验

Apollo配置中心的部署与使用经验一、部署环境准备在部署Apollo配置中心之前,需要准备以下环境:1.操作系统:建议使用Linux或Windows服务器操作系统。
2.硬件资源:根据实际需求,准备足够的内存、CPU和存储资源。
3.网络环境:确保服务器可以访问互联网,并且网络带宽和稳定性能够满足需求。
4.软件环境:安装Java运行环境和数据库(如MySQL、PostgreSQL等)。
二、Apollo配置中心安装1.下载Apollo配置中心压缩包,并解压到目标目录。
2.修改Apollo配置文件(config.properties),配置数据库连接信息和其他相关参数。
3.运行Apollo引导程序(startup.sh或startup.bat),启动Apollo配置中心服务。
三、配置文件上传与编辑1.在浏览器中访问Apollo配置中心地址,使用默认账号(admin/123456)登录。
2.在左侧导航栏中选择“应用管理”,创建一个新的应用,并记录下应用的App ID和Secret。
3.在本地编辑配置文件(如application-default.properties),修改配置项,如数据库连接信息、日志级别等。
4.上传配置文件至Apollo配置中心,选择“发布配置”按钮,将配置发布到目标应用上。
四、配置生效与刷新1.在Apollo配置中心中,点击“生效策略”选项卡,选择“立即生效”或“定时生效”。
2.刷新目标应用,使新配置生效。
可以通过重启应用或使用热加载机制来实现。
五、权限与安全设置1.在Apollo配置中心中,可以设置不同角色的权限,如管理员、开发人员和测试人员等。
2.为每个应用设置访问权限,确保只有授权用户可以访问和修改特定应用的配置。
3.使用SSL加密通信,保证数据传输的安全性。
4.对敏感配置项进行加密存储,以保护敏感数据的安全。
六、监控与日志查看1.在Apollo配置中心中,可以查看各个应用的配置信息和运行状态。
Apollo分布式配置中心

Apollo分布式配置中⼼1. 介绍Apollo(阿波罗)是携程框架部门研发的分布式配置中⼼,能够集中化管理应⽤不同环境、不同集群的配置,配置修改后能够实时推送到应⽤端,并且具备规范的权限、流程治理等特性,适⽤于微服务配置管理场景。
-- 摘⾃Apollo官⽹1.1. 痛点修改配置后,需要重启项⽬⼤量重复的配置,不便于管理1.2. 为什么选择ApolloApollo VS Spring Cloud ConfigSpring Cloud Config 依赖于GitHub,所有配置都是写在⽂件中,然后通过提交GitHub上来⽣效的,不同的环境⽤不⽤的⽂件区分Apollo VS阿⾥云应⽤配置管理ACM依赖于阿⾥云,不便于后续迁移阿⾥云已经放弃了该项⽬,不再维护2. 快速开始2.1. 服务端配置运⾏⽅式有很多,作为⼊门,这⾥选择直接从官⽹下载打好的jar包运⾏在开始之前,⾸先需要建表。
将项⽬clone下来,脚本位于${YOUR-WORKSPACE}/apollo/scripts/db/migration/也可以直接去github上找,、1 source /your_local_path/configdb/V1.0.0__initialization.sql2 source /your_local_path/portaldb/V1.0.0__initialization.sql数据库有了,接下来修改配置⽂件中相应的数据库连接信息如⽆意外,⾄此,adminservice、configservice、portal都起来了初始账号密码是:apollo/admin⾸先,新建⼀个项⽬然后,编辑配置并发布2.2. 客户端配置application.properties修改配置后,实时⽣效下⼀篇继续探索Apollo未完待续。
3. ⽂档。
SpringCloud系列之Apollo配置中心(三)

SpringCloud系列之Apollo配置中⼼(三)本篇⽂章为系列⽂章,未读前⼏集的同学请猛戳这⾥:本篇⽂章讲解A p o l l o多环境部署⽅案,教⼤家搭建除了D E V的其他环境。
多环境部署⽅案点击链接观看:(获取更多请关注公众号「哈喽沃德先⽣」)为了让⼤家有更真实的感受,多环境部署⽅案我们在L i n u x环境下搭建,不再使⽤Q u i c k S t a r t脚本。
当项⽬要上线部署到⽣产环境时,项⽬的配置⽐如数据库、缓存、队列等服务器的地址都会发⽣改变,这时候就需要通过A p o l l o为⽣产环境添加配置。
⽬前A p o l l o预先定义的环境为:「D E V」:D e v e l o p m e n t e n v i r o n m e n t开发环境,⽤于开发者调试使⽤;「F A T」:F e a t u r e A c c e p t a n c e T e s t e n v i r o n m e n t功能验收测试环境,⽤于软件测试者测试使⽤;「U A T」:U s e r A c c e p t a n c e T e s t e n v i r o n m e n t⽤户验收测试环境(仿真环境),⽤于⽣产环境下的软件测试者测试使⽤「P R O」:P r o d u c t i o n e n v i r o n m e n t⽣产环境,最终上线环境。
这⾥我们要明确⼀些信息:P o r t a l部署在⽣产环境的机房,通过它来直接管理F A T、U A T、P R O等环境的配置即可;C o n f i g S e r v i c e、A d m i n S e r v i c e和A p o l l o C o n f i gD B在每个环境都单独部署;应⽤需要配置指定的环境,默认为D E V。
总结下来就是:⼀套P o r t a l可以管理多个环境,但是每个环境都需要独⽴部署⼀套C o n f i g S e r v i c e、A d m i n S e r v i c e和A p o l l o C o n f i g D B。
玩转apollo配置中心——springboot整合Apollo实现集中配置自动化更新

玩转apollo配置中⼼——springboot整合Apollo实现集中配置⾃动化更新前⾯我们⼀起交流了Apollo配置中⼼的基本原理以及各种环境的搭建,今天我们进⾏springboot整合Apollo实现集中化配置、⾃动化更新应⽤场景任何没有业务应⽤场景的技术都是纸上谈兵,先说说应⽤场景随着现在微服务技术越来越⽕爆热门,越来越普及,当单体服务升级为集群或者微服务的时候,服务变多变复杂,相关的配置也会呈⼏何倍数增长拿springboot举例,我们开发环境的时候,数据库参数、缓存各种参数都写在application配置⽂件中,测试、⽣产环境通过启动参数-Dspring.datasource....之类的进⾏指定。
或者有些通过application-env配置⽂件进⾏不同环境的不同参数进⾏配置,在启动的时候指定当前运⾏环境-Dspring.profile.active=dev等。
但是服务变多以后,配置参数的检查,更新将会是⼀个灾难性的场景,⽽且还不⽀持配置参数的热更新,修改参数后必须重新打包、重启应⽤。
所以在这种情况下,配置中⼼这种中间件应运⽽⽣,⽬前主流的有携程的Apollo、netflux的config、ali的nacos,今天我们主要讨论Apollo应⽤整合⾸先创建⼀个springboot应⽤,具体创建过程不是本⽂重点(略)整合改造过程1.修改pom添加Apollo依赖,以⽀持Apollo配置中⼼<dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.4.0</version></dependency>2.填写Apollo信息配置# 项⽬名称app.id=${}# Apollo配置中⼼地址apollo.meta=http://localhost:8080# 是否开启spring参数⾃动更新apollo.autoUpdateInjectedSpringProperties=true3.启动类上⾯添加注解在启动类上加上apollo开启注解@EnableApolloConfig4.创建配置项项⽬改造完成以后,打开浏览器输⼊apollo控制台地址进⾏配置的管理创建⼀个和刚才创建的应⽤同名的应⽤(配置中的),然后在⾥⾯新增⼀个配置(因为8080端⼝被apollo占⽤,所以增加⼀个服务绑定端⼝的配置)test=9995server.port=8085然后在springboot中创建⼀个controller@RestControllerpublic class HelloController {@Value("${test}")private String test;@GetMapping("hello")public Object say() {System.out.println(res);return "hello " + test;}}5.启动程序,进⾏测试这样就实现了服务的集中化配置,以及⾃动化热更新apollo集群配置Apollo配置中⼼的四个维度其中有⼀个集群,默认都是没有配置集群的(default),如果有需要,可以这样添加1.Apollo配置中⼼新增⼀个集群打开Apollo控制台,进⼊项⽬,在界⾯左下⽅找到添加集群按钮并点击然后在添加集群页⾯输⼊集群名称(我这⾥⽤的shanghai),勾选所要⽣效的环境确定即可2.在springboot项⽬中使⽤springboot中如果不指定集群配置,即使⽤默认的集群default,如果需要使⽤新的集群,可在配置⽂件或者启动参数中加这个配置apollo.cluster=shanghai最后再在shanghai这个集群中添加⼀些配置并发布,⽐如test=8888server.port=8003多环境配置springboot使⽤Apollo配置中⼼的多环境配置时有些特殊这⾥我们使⽤sit环境apollo.meta=http://localhost:8082springboot中配置好后,再在apollo的sit环境中添加相应配置并发布,然后重启springboot即可看到配置已⽣效多namespace配置在apollo配置中⼼⾥多namespace配置在项⽬配置界⾯左下⾓点击添加namespace按钮,然后在添加页⾯选择创建namespace,然后输⼊名称确定即可在项⽬配置页⾯看到新建的namespace空间在这个空间⾥添加⾃⼰的配置在springboot中指定项⽬所使⽤的命名空间稍微有点不同,这⾥⽀持同时配置多个namespace,多个⽤英⽂逗号隔开spaces=application,datasources,pay.ymlPS1:这⾥需要注意的是,如果这多个namespace中包含相同的配置,那么以配置靠前的namespace中的配置为准PS2:如果apollo中添加的namespace配置格式为yml等⾮properties的时候,springboot中配置应该带上.后缀名,⽐如我的pay.yml然后在各个环境中添加好相应的配置并发布,再重启springboot即可看到多namespace的配置已⽣效⼏点个⼈建议⾸先对于四个维度app,env,cluster,namespace的应⽤application,即项⽬,每个springboot项⽬都要设置⾃⼰的名称spring.application,name,然后apollo配置中⼼中创建的项⽬名称尽量要和springboot的项⽬名称相同,这样在配置中指定app.id=${}即可,⼈员排查配置问题的时候也⽅便检查,其实重点就是⼈员⾁眼观察起来⽅便,可读性强cluster,集群,这个配置可以根据⾃⼰项⽬实际,进⾏添加配置,⽬前中⼩型公司⽤到的不多,个⼈觉得作⽤不是很⼤,⼏乎可以忽略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
Apollo in depth•Core Concepts
•
application (应用用)
基于Spring Cloud的 Apollo配置中心心介绍
宋顺 携程框架研发部
Overview
• • • • •
What is Apollo Why Apollo Apollo at a glance Apollo in depth Future
一一个小小故事
•
小小A是XX团队主力力力开发,有一一天产品说要上线一一 个迪士士尼⻔门票内购功能 由于迪士士尼⻔门票很火火爆,产品一一拍脑袋说,每个 用用户限购5张! 于是小小A在代码里里里是这么写的
•
•
private static final int MAX_QTY_PER_USER = 5;//产品需求限购5张 if (qty > MAX_QTY_PER_USER) { throw new IllegalStateException( String.format("每个用用户最多购买%d张!", MAX_QTY_PER_USER)); }
Apollo at a glance
•
客户端监听配置变化(Java API样例例)
Config config = ConfigService.getAppConfig(); config.addChangeListener(new ConfigChangeListener() { @Override public void onChange(ConfigChangeEvent changeEvent) { for (String key : changeEvent.changedKeys()) { ConfigChange change = changeEvent.getChange(key); System.out.println(String.format( “Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s”, change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType())); } } });
•
配置可以有多种加载方方式
•
程序内部hard code,配置文文件,环境变量量,启动参数,基于数据库等
•
配置需要治理理
• • •
权限控制、发布审核 不不同环境、集群配置管理理 公共组件配置管理理
Why Apollo
•
有治理理能力力力的配置管理理平台
• • • • • • •
统一一管理理不不同环境、不不同集群的配置 配置修改实时生生效(热发布) 版本发布管理理 灰度发布 权限管理理、发布审核、操作审计 客户端配置信息监控 Java,.Net原生生客户端,Spring支支持
What is Configuration
•
配置是独立立于程序的只读变量量
•
DB Connection Str、Thread Pool Size、Buffer Size、Request Timeout、 Feature Switch、Server Urls等
•
配置伴随应用用的整个生生命周期
•
启动时读取配置,运行行行时根据配置调整行行行为
•
•
一一个小小故事
•
第二二天中午,由于内购实在太火火爆,产品急匆匆 的跑过来对小小B说,赶紧改成每人人1张! 小小B不不紧不不慢的说:10秒内搞定~
•
What is Apollo
• •
携程框架部⻔门推出的应用用配置中心心 支支持4个维度管理理配置(Key-Value)
• • • •
application (应用用) environment (环境) cluster (集群) namespace (命名空间)
•
客户端获取配置(Java API样例例)
Config config = ConfigService.getAppConfig(); Integer defaultRequestTimeout = 200; Integer requestTimeout = config.getIntProperty(“request.timeout”, defaultRequestTimeout);
Apollo at a glance
•
Spring集成样例例
@Configuration @EnableApolloConfig public class AppConfig {} @Component public class SomeBean { @Value("${request.timeout:200}") private int timeout; @ApolloConfigChangeListener private void someChangeHandler(ConfigChangeEvent changeEvent) { if (changeEvent.isChanged("request.timeout")) { refreshTimeout(); } }
一一个小小故事
•
第二二天中午,由于内购实在太火火爆,产品急匆匆 的跑过来对小小A说,赶紧改成每人人1张! 小小A只好放弃了了午饭,改代码、回归测试、上线, 整整花了了1个小小时才搞定。。。
•
一一个小小故事
•
小小B是YY团队主力力力开发,有一一天产品说要上线一一 个欢乐谷谷⻔门票内购功能 由于欢乐谷谷⻔门票很火火爆,产品一一拍脑袋说,每个 用用户限购5张! 小小B吸取了了小小A的教训,二二话不不说把配置写在了了 Apollo配置中心心
Apollo at a glance
Apollo at a glance
Apollo at a glance
•
添加/修改配置项
Apollo at a glance
•
添加/修改配置项
Apollo at a glance
•
发布配置
Apollo at a glance
•
发布配置
Apollo at a glance