前言

Apollo又称阿波罗配置核心,在前两年还是挺火的,但阿里SpringCloud套件席卷国内之后,nacos就成为了最被亲睐的分布式配置核心,nacos是配置核心和注册核心二合一的产品,单纯性能上Apollo其实更弱小一些。本篇就把Apollo的装置及应用分享给大家。

装置

1、安装包

1)、GitHub下载:https://github.com/nobodyiam/...

2)、网盘下载:https://github.com/ctripcorp/...(看这个文档上面给的网盘链接)

2、环境要求

虚拟机:内存2G+

JDK:java1.8k环境

数据库:mysql在5.7+(如果在低版本数据库执行阿波罗构造时,默认是不能反对在一个表中有两个工夫戳类型字段,所以倡议大家应用mysql在5.7以上。)

3、创立数据库表

去Github上下载最新的apollo-build-scripts-master 整个阿波罗环境包

创立两个数据库

在apollo-build-scripts-master\sql目录下有两个SQL文件:别离为:apolloconfigdb(寄存配置文件信息)、apolloportaldb(门户网站),在数据库中执行创立;

4、批改SQL脚本

批改apollo装置脚本demo.sh,批改其中的数据库连贯信息和相干服务地址信息。

5、启动

执行命令:./demo.sh start

PS:记得敞开防火墙,如果连的是近程数据库,记得凋谢mysql用户的权限,root@'%',也别用本机数据库,虚拟机可能ping不通本机,连不上本机数据库。

6、拜访

启动后,拜访地址:http://192.168.121.129:8070

默认账号密码:apollo admin

7、简略应用

1)、创立我的项目

2)、新增配置

3)、点击公布

惯例用法

留神:

1)、这里示例应用的是renren-fast,是繁多我的项目,所以就创立一个apollo我的项目即可,而后能够创立多个namespace,寄存不同环境的配置文件(开发、测试、生产);

2)、如果是微服务项目,那么给每一个微服务都创立一个apollo我的项目,利用ID是每个微服务的appId,利用名称也尽量见名知意。

1、删除示例我的项目

2、创立新我的项目

3、命名空间

能够创立不同环境的配置文件命名空间,并且能够开展伸缩。

PS:这里是测试,实在环境最好依照标准比方renren.user这样来命名。

4、yml命名空间

如果是yml命名空间,就间接文本拷贝进来。

如果是默认的properties命名空间,本人我的项目的配置是yml格局,就要先进行转换,而后拷贝到文本中。

yml转properties转换工具:yml转properties工具

拷贝到文本中

它会本人转换

最初点击公布即可

SpringBoot整合

1、问题阐明

应用阿波罗注意事项:

1)、本地缓存地址:windows:C:\opt\data\,Linux:/opt/data

2)、本地环境设置地址:windows:C:\opt\settings,Linux:/opt/settings

3)、如果配置实现后能够读取到apollo公布的配置信息,然而批改后再公布,发现我的项目获取不到最新的,须要检查一下本地缓存地址data目录下的配置文件是否更新,或者是否存在这个缓存文件,如果不存在,阐明基本没有缓存胜利,这个命名空间大略有问题。

PS:这里笔者呈现的问题就是本地基本没缓存application-dev这个命名空间的配置信息,因为我创立的时候用的是yml格局,删掉后我改用properties格局,而后就能够了。

2、前情回顾

在后面搭建Apollo环境OK的前提下,这是案例环境的截图,有四个命名空间。

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、引入依赖

<!-- apollo依赖 --><dependency>    <groupId>com.ctrip.framework.apollo</groupId>    <artifactId>apollo-client</artifactId>    <version>1.1.0</version></dependency><dependency>    <groupId>com.ctrip.framework.apollo</groupId>    <artifactId>apollo-core</artifactId>    <version>1.1.0</version></dependency>

5、配置文件

删掉我的项目本来的application.yml等配置文件,在resources下新建一个application.properties文件。
app.id=renren-fastapollo.meta=http://192.168.1.128:8080# 注入非默认application namespace或多个namespace的配置示例apollo.bootstrap.enabled=trueapollo.bootstrap.namespaces=application,application-dev,application-prod,application-test

6、启动注解

启动类加上开启Apollo的注解:@EnableApolloConfig
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})@EnableApolloConfigpublic class RenrenApplication extends SpringBootServletInitializer {    public static void main(String[] args) {        SpringApplication.run(RenrenApplication.class, args);    }    @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {        return app.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、本地缓存

阿波罗在本地的缓存地址,缓存的其实就是这些配置文件,如果阿波罗挂掉了,我的项目会拜访这个缓存文件,也不影响我的项目运行。

9、验证

测试一个接口看是否能获取到配置信息

启动后拜访接口

查看是否有打印出数据源url

批改一下配置后再公布,看是否会刷新:发现删掉的局部曾经没了。

Java动静读取配置

此案例参考了每特教育的案例:

网关内集成了swagger文档,把swagger写死的局部作为json保留在apollo中,网关服务通过java代码动静获取apollo保留的json信息,赋给swagger文档实现。

1、网关代码

@SpringBootApplication@EnableEurekaClient@EnableZuulProxy@EnableSwagger2Doc@EnableApolloConfigpublic class AppGateWay {      // 获取ApolloConfig      @ApolloConfig      private Config appConfig;      public static void main(String[] args) {            SpringApplication.run(AppGateWay.class, args);      }      // 增加文档起源      @Component      @Primary      class DocumentationConfig implements SwaggerResourcesProvider {            @Override            public List<SwaggerResource> get() {                  // 开启监听,配置文件产生扭转须要更改                  appConfig.addChangeListener(new ConfigChangeListener() {                       @Override                       public void onChange(ConfigChangeEvent changeEvent) {                             get();                       }                  });                  return resources();            }            /**             * 从阿波罗服务器中获取resources             *             * @return             */            private List<SwaggerResource> resources() {                  List resources = new ArrayList<>();                  // app-itmayiedu-order                  // 网关应用服务别名获取近程服务的SwaggerApi                  String swaggerDocJson = swaggerDocument();                  JSONArray jsonArray = JSONArray.parseArray(swaggerDocJson);                  for (Object object : jsonArray) {                       JSONObject jsonObject = (JSONObject) object;                       String name = jsonObject.getString("name");                       String location = jsonObject.getString("location");                       String version = jsonObject.getString("version");                       resources.add(swaggerResource(name, location, version));                  }                  return resources;            }            /**             * 获取swaggerDocument配置             * 这里应用apollo提供的config来获取mayikt.zuul.swaggerDocument这个key对应的json值             * @return             */            private String swaggerDocument() {                  String property = appConfig.getProperty("mayikt.zuul.swaggerDocument", "");                  return property;            }            private SwaggerResource swaggerResource(String name, String location, String version) {                  SwaggerResource swaggerResource = new SwaggerResource();                  swaggerResource.setName(name);                  swaggerResource.setLocation(location);                  swaggerResource.setSwaggerVersion(version);                  return swaggerResource;            }      }}

2、新建key-value

在apollo中对应的命名空间内新建一个key-value:mayikt.zuul.swaggerDocument,对应下面config.getProperty("mayikt.zuul.swaggerDocument",""),前面空示意没取到就返回空串。

key:mayikt.zuul.swaggerDocument

value是如下内容:

[    {        "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"    }]

监听Apollo

PS:这个监听类会在我的项目启动后主动开启一个线程和apollo建设长连贯,监听apollo配置的变动并打印出日志。切忌应用AOP或者放在get办法外面,这样会开启很多线程和apollo连贯,导致系统CPU飙高。

新增上面一个监听类即可:

@Component@Slf4jpublic class MyCommandLineRunner implements CommandLineRunner {      @ApolloConfig      private Config config;      @Override      public void run(String... args) throws Exception {        config.addChangeListener(new ConfigChangeListener() {              @Override              public void onChange(ConfigChangeEvent changeEvent) {                   log.debug("分布式配置核心监听: {}", changeEvent.changedKeys().toString());              }        });      }}

总结

Apollo配置核心是携程团队精心创作的开源产品,哪怕当初Nacos如日中天,Apollo也仍然受到很多我的项目团队的欢送。有些公司的研发团队开发我的项目并不一定会应用阿里微服务套件,像Apollo这样的组件就会成为选项之一,大家感兴趣的话能够尝试一下新版本的应用,也能够珍藏本篇,当前若用到翻出来参考即可。

分享

8年多工作及学习过程中在云笔记中记录了很多内容,我空闲之余都做了下整顿,本篇也是其中之一,有感兴趣的敌人能够下载看看,什么时候用到了打开说不定就能节俭很多工夫。

链接: https://pan.baidu.com/doc/sha...

提取码: bxaa


自己原创文章纯手打,感觉有一滴滴帮忙就请点个吧~

自己继续分享理论工作教训和支流技术,喜爱的话能够关注下哦~

更多最新技术文章可关注GZH:【Java分享客栈】