前言Apollo,又名Apollo配置中心,前两年比较火,但是在阿里SpringCloud套件风靡全国后,nacos成为最火的分布式配置中心,nacos是配置中心和注册中心作为一个二合一产品,Apollo其实在纯功能上更强大。本文将与大家分享Apollo的安装和使用。安装1、安装包1)、github下载:https://github.com/nobodyiam/...2)、网盘下载:https://github.com/ctripcorp/...(此文档见下文2、环境要求虚拟机:内存2G+JDK:java1.8k环境数据库:mysqlat5.7+(如果是低版本数据库实现Apollo结构,默认是不能支持一表两表时间戳类型字段,所以建议使用5.7以上的mysql。)3.创建数据库表,从Github下载最新的apollo-build-scripts-master,整个Apollo环境包在apollo-build-scripts-master创建两个数据库\sql目录下有两个SQL文件:apolloconfigdb(存放配置文件信息)、apolloportaldb(门户网站),在数据库中执行创建;4、修改SQL脚本,修改apollo安装脚本demo.sh修改里面的数据库连接信息和相关的服务地址信息。5.启动,执行命令:./demo.shstartPS:记得关闭防火墙。如果连接的是远程数据库,记得打开mysql用户root@'%'的权限,不要使用本地数据库。虚拟机可能无法ping通本机,无法连接本地数据库。6、开始访问后,访问地址:http://192.168.121.129:8070默认账号密码:ap??olloadmin7,简单使用1),创建项目2),添加配置3),点击发布通用usageNote:1),这里的例子使用renren-fast,是一个单工程,所以只需要创建一个apollo工程,然后就可以创建多个命名空间来存放不同环境(开发、测试、生产)的配置文件;2)、如果是微服务项目,则为每个微服务创建一个apollo项目,应用ID为每个微服务的appId,应用名尽量熟悉。1.删??除示例工程2.新建工程3.命名空间可以针对不同的环境创建配置文件命名空间,它可以扩展扩展。PS:这是一个测试。真实环境最好按照规范命名,比如renren.user。4.如果yml命名空间是yml命名空间,直接复制文本即可。如果是默认的properties命名空间,而自己项目的配置是yml格式的,必须先转换,再复制到文中。yml-to-properties转换工具:将yml-to-properties工具复制到文本中,它会自行转换,最后点击publish。SpringBoot集成1.问题描述使用Apollo注意事项:1)、本地缓存地址:windows:C:\opt\data\,Linux:/opt/data2)、本地环境设置地址:windows:C:\opt\settings,Linux:/opt/settings3),如果配置完成,可以读取apollo发布的配置信息,但是修改发布后发现项目无法获取到最新的。需要检查本地缓存地址的数据目录下的配置文件是否更新,或者这个缓存文件是否存在。如果不存在,说明缓存根本没有成功,可能是这个命名空间有问题。PS:作者这里的问题是application-dev命名空间的配置信息根本没有缓存到本地,因为我创建的时候用的是yml格式,删掉后改成properties格式,然后就可以了很好。2、回顾之前的情况在Apollo环境没问题的前提下,这是案例环境的截图,有四个命名空间。3、官方文档1)、Apollo使用指南:https://github.com/ctripcorp/...使用指南2)、java示例客户端启动:https://github.com/ctripcorp/...开发指南#23-java示例客户端启动3)、spring-boot集成方式推荐:https://github.com/ctripcorp/...客户端使用指南#3213-spring-boot集成方式推荐4、引入依赖com.ctrip.framework.apolloapollo-client1.1.0com.ctrip.framework.apolloapollo-core1.1.05.从配置文件Application.yml和其他配置文件中删除原项目,在resources下新建application.properties文件。app.id=renren-fastapollo.meta=http://192.168.1.128:8080#注入非默认应用程序命名空间或多个命名空间的配置示例apollo.bootstrap.enabled=trueapollo.bootstrap.namespaces=application,application-dev,application-prod,application-test6,startup注解启动类加注解开启Apollo:@EnableApolloConfig@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})@EnableApolloConfigpublicclassRenrenApplicationextendsSpringBootServletInitializer{publicstaticvoidmain(String[]args){SpringApplication.run(RenrenApplication.class,args);}@OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilderapp){returnapp.sources(RenrenApplication.class);}}7.修改环境选项,这个settings/server.properties也可以不创建,只有在不同环境切换时才需要。修改/opt/settings/server.properties(Mac/Linux)或C:\opt\settings\server.properties(Windows)文件,新建一个没有目录的,设置env为DEV:env=DEV说明:1),这个环境配置的意思可以参考:https://github.com/ctripcorp/...客户端使用指南#3213-spring-boot集成方式推荐,搜索关键字env=DEV,或者去上网自己找资料;2).这个C:\opt\settings\server.properties需要自己创建,不会自己生成。8.本地缓存Apollo的本地缓存地址。这些配置文件实际上是缓存的。如果Apollo挂了,项目会访问这个缓存文件,不会影响项目的运行。9.验证测试一个接口,看是否可以获取到配置信息。启动后访问界面查看数据源url是否打印出来,修改配置发布,看是否会刷新:发现删除的部分没有了。java动态读取配置本案例参考各特教案例:网关中集成swagger文档,swagger硬编码部分以json形式保存在apollo中。网关服务通过java代码动态获取apollo保存的json信息,赋值给swagger文档实现。1、网关代码@SpringBootApplication@EnableEurekaClient@EnableZuulProxy@EnableSwagger2Doc@EnableApolloConfigpublicclassAppGateWay{?????//获取ApolloConfig?????@ApolloConfig?????privateConfigappConfig;?????publicstaticvoidmain(String[]args){???????????SpringApplication.run(AppGateWay.class,args);?????}//添加文档来源?????@Component?????@Primary?????classDocumentationConfigimplementsSwaggerResourcesProvider{???????????@Override???????????publicListget(){?????????????????//开启监听,配置文件发生改变需要更改?????????????????appConfig.addChangeListener(newConfigChangeListener(){??????????????????????@Override??????????????????????publicvoidonChange(ConfigchangeeEventChangeevent){get();}});ReturnResources();}/***Getresources**@Return*/privateListresources(){列表资源=newArrayList<>();//app-itmayiedu-order//网络使用服务别名获取远程服务的SwaggerApiStringswaggerDocJson=swaggerDocument();JSONArrayjsonArray=JSONArray.parseArray(swaggerDocJson);对于(对象对象:jsonArray){JSONObjectjsonObject=(JSONObject)对象;字符串名称=jsonObject.getString("名称");字符串位置=jsonObject.getString("位置");字符串版本=jsonObject.getString("版本");resources.add(swaggerResource(名称、位置、版本));}返回资源;}/***获取swaggerDocument配置*这里使用apollo提供的config来获取mayikt.zuul.swaggerDocument这个关键对应的json值*@return*/privateStringswaggerDocument(){Stringproperty=appConfig.getProperty("mayikt.zuul.swaggerDocument","");归还财产;}privateSwaggerResourceswaggerResource(Stringname,Stringlocation,Stringversion){SwaggerResourceswaggerResource=newSwaggerResource();swaggerResource.setName(名称);swaggerResource.setLocation(位置);swaggerResource.setSwaggerVersion(版本);返回swaggerResource;}}}2、新建key-value在apollo中对应的名字空间内新建一个key-value:mayikt.zuul.swaggerDocument,对应上面的config.getProperty("mayikt.zuul.swaggerDocument",""),后面是一个空字符串,表示如果没有取到,就返回一个空字符串key:mayikt.zuul.swaggerDocument值如下:[{"name":"app-mayikt-member","location":"/app-mayikt-member/v2/api-docs","version":"2.0"},{"name":"app-mayikt-weixin","location":"/app-mayikt-weixin/v2/api-docs","version":"2.0"}]监控ApolloPS:本次听力课项目启动后,会自动开启一个线程与apollo建立长连接,监控apollo配置的变化并打印日志。不要使用AOP或者放在get方法中,这样会开很多线程和apollo连接,导致系统CPU飙升。只需添加以下监听类:@Component@Slf4jpublicclassMyCommandLineRunnerimplementsCommandLineRunner{@ApolloConfigprivateConfigconfig;@Overridepublicvoidrun(String...args)throwsException{config.addChangeListener(newConfigr(C)publicvoidonChange(ConfigChangeEventchangeEvent){log.debug("分布式配置中心监听:{}",changeEvent.changedKeys().toString());}});}}总结Apollo配置中心是携程团队精心打造的开源产品,即使在Nacos如火如荼的当下,Apollo依然受到众多项目组的欢迎。一些公司的研发团队不一定使用阿里微服务套件进行开发项目。类似Apollo的组件将成为选择之一。有兴趣的可以尝试新版本的使用,也可以收藏这篇文章。以后要是用到就翻出来做参考。分享8年多的工作和学习,在云笔记中记录了很多内容。我在业余时间组织了它。这篇文章也是其中之一。有兴趣的朋友可以下载看看什么时候用。它可能会节省很多时间。链接:https://pan.baidu.com/doc/sha...提取码:bxaa本人原创文章,纯手写。如果觉得有帮助,请点个赞~我持续分享实际工作经验和主流技术,喜欢的话可以关注哦~更多最新技术文章可以关注GZH:【Java分享】客栈]