Apollo配置中心的安装与使用

ps:偷个懒,直接把我写的文档粘贴过来了,毕竟不想打字了= =

一、 文档目的
本文档主要目的为,介绍Apollo配置中心的配置及在Java程序中的调用,以便方便大家的开发与使用。
二、 Apollo简介
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
三、 Apollo部署方式
Apollo的部署方式,可以分为本地快速部署(Quick Start)和分布式部署。

  1. Quick Start
    Quick Start是Apollo为了让大家快速上手配置中心,提供给开发者在本地部署及启动的部署方式。本方式仅限于本地测试。

官网地址:https://github.com/ctripcorp/apollo/wiki/Quick-Start

使用Quick Start有以下步骤:
1.1 准备工作
1.1.1 环境要求
1.1.1.1 Java
Apollo对java的版本要求如下:
Apollo服务端:1.8+
Apollo客户端:1.7+
因Quick Start需要在本地同时启动服务端与客户端,所以要求java版本为1.8以上。
1.1.1.2 Mysql
版本要求:5.6.5+。
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。但可以根据相关文档说明,进行数据库降级使用。可参考https://github.com/ctripcorp/apollo/issues/481。
1.1.2 Quick Start安装包准备
1.1.2.1 从github直接下载安装包
地址:https://github.com/nobodyiam/apollo-build-scripts
1.1.2.2 自行打包(不推荐)
因Quick Start本身即为方便快速启动而准备的程序包,所以并不推荐自己打包,但若有兴趣自行打包,可参考下面步骤:
修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin
在根目录下执行mvn clean package -pl apollo-assembly -am -DskipTests=true
复制apollo-assembly/target下的jar包,rename为apollo-all-in-one.jar
1.1.3 安装步骤
1.1.3.1 创建数据库
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,且官方已提供文件,自行下载导入即可。
下载地址:https://github.com/nobodyiam/apollo-build-scripts/tree/master/sql
1.1.3.2 配置数据库连接信息
安装完数据库之后,需要对数据库连接信息进行配置,让服务端知道你数据库存放地址。打开demo.sh,修改下面的配置项(其他位置不需要改动):
#apollo_config_db_info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
#apollo_portal_db_info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)

1.1.3.3 启动Apollo配置中心
启动时,使用命令行进入项目所在目录(不需要通过IDE打开),运行demo.sh start即可访问。

注意:服务会默认占用8070(portal), 8080(configservice), 8090(adminservice)三个端口,其中,configservice跟默认的eureka注册中心位于同一进程内,占用8080端口。请保证这仨个端口未被占用。

  1. 分布式部署
    2.1 准备工作
    2.1.1 运行时环境
    2.1.1.1 OS
    服务端基于Spring Boot,启动脚本理论上支持所有Linux发行版,建议CentOS 7。
    2.1.1.2 Java
    同1.1.1.1.
    对于Apollo客户端,运行时环境只需要1.7+即可。
    注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6.
    可参考:https://github.com/ctripcorp/apollo/issues/483。
    2.1.2 Mysql数据库
    同1.1.1.2
    2.1.3 环境设置
    Apollo支持多种环境的配置与使用,需要在部署之前,确认要部署的环境。当前支持的环境有:
    • DEV
    o 开发环境
    • FAT
    o 测试环境,相当于alpha环境(功能测试)
    • UAT
    o 集成环境,相当于beta环境(回归测试)
    • PRO
    o 生产环境
    在部署的时候,Portal只需要在产品环境部署一次,adminservice与configservice需在每个环境部署一次。若需要添加自定义的环境,则需要修改com.ctrip.framework.apollo.core.enums.Env这个枚举类,添加新的枚举即可。
    参考文档:https://github.com/ctripcorp/apollo/wiki/%E9%83%A8%E7%BD%B2&%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98#42-%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E7%8E%AF%E5%A2%83

2.1.4 网络策略
网络策略在官网有具体说明,主要为了解决网络设置导致的获取不到配置的问题。我在测试的时候,将服务部署在10.60.但我在本地访问,却访问不到配置中心。在查看日志后发现,该服务器有两个网卡,分别时10.18.X.X与192.168.X.X,而服务默认使用了192.168.X.X的网卡,导致我访问不了。解决这个问题,有多种方式,官网有说明,我使用了在start.sh中添加-D参数直接指定启动ip解决的。
参考文档:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97#14%E7%BD%91%E7%BB%9C%E7%AD%96%E7%95%A5

2.2 部署步骤
2.2.1 创建数据库
同1.1.3.1.
数据库中重要表字段说明,可参照下面文档:
https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97#21-%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93

2.2.2 获取安装包
安装包同样可直接下载或自己通过源码构建。根据自己需求改动。
2.2.2.1 下载安装包
下载地址:https://github.com/ctripcorp/apollo/releases
下载apollo-adminservice-1.5.0-github.zip,apollo-configservice-1.5.0-github.zip,apollo-portal-1.5.0-github.zip,三个压缩包即可。
下载完成后需要做如下操作:

  1. 将压缩包上传到服务器,并进行解压。
  2. 修改config目录下的application-github.properties文件,修改为你数据库的正确地址。注意:adminService和configService连接的是ApolloConfigDB,而portal连接的是ApolloPortalDB。

DataSource

spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = someuser
spring.datasource.password = somepwd
3. 配置apollo-portal的meta信息(这里在多环境管理还会提到)。修改portal服务config路径下的apollo-env.properties,对meta进行修改,若无对应环境,可删除对应的配置。默认情况下,meta service 与 config service是在同一个JVM进程中,所以这里指定的即为config service的地址。如:
dev.meta=http://localhost:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com
2.2.2.2 通过源码构建
源码下载地址:https://github.com/ctripcorp/apollo
通过源码构建,需要做如下操作:

  1. 修改scripts/build.sh中的数据库信息。跟上面相同。
  2. 修改scripts/build.sh中的meta server地址,跟上面相同。
  3. 若没有自己的个性化设置,则可以直接运行build.sh进行打包即可。
  4. Build运行成功后,可在portal,adminservice,configservice下对应的target目录下,拿到apollo-XX-x.x.x-github.zip。跟直接下载的包相同。

Ps:在windows下执行构建操作时,可能会报如下异常:ERROR OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference (starting with slash) / [duplicate]。问题原因是编译脚本调用获取文件的时候,以linux的路径来进行访问,所以在windows下会找不到,解决方式如下(我测试时,第二种方式可行,第一种有可能出现问题):

<fileSets>
  <fileSet>
    <directory>src/main/resources</directory>
    <outputDirectory/>
  </fileSet>
</fileSets>
或者

<fileSets>
  <fileSet>
    <directory>src/main/resources</directory>
    <outputDirectory>./</outputDirectory>
  </fileSet>
</fileSets>

2.2.3 部署及启动应用
将zip包上传到服务器相应位置,解压后,执行scripts/start.sh即可。
Ps:在执行start.sh时可设置JVM内存内存设置,可根据需求来设置。我使用了默认配置。
四、 Java客户端调用方式

  1. 环境要求
    1.1 必选设置
    1.1.1 AppId
    AppId是应用的身份信息,也是在Apollo配置中心中创建项目的必要参数。
    通常可在app. Properties或 application.properties中配置即可:
    AppId=myProject
    1.1.2 Apollo Meta Server
    Apollo支持应用在不同的环境有不同的配置,所以需要在运行提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。
    Apollo Meta Server的设置方式有多种,
    通常可在application.properties或bootstrap.properties中指定:
    apollo.meta=http://config-service-url
    或在apollo-env.properties中配置,apollo-env.properties中的配置如下:
    dev.meta=http://1.1.1.1:8080
    fat.meta=http://apollo.fat.xxx.com
    uat.meta=http://apollo.uat.xxx.com
    pro.meta=http://apollo.xxx.com
    更多配置方式可参考:https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#122-apollo-meta-server

1.1.3 本地缓存路径
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。

Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache
本地配置文件会以下面的文件名格式放置于本地缓存路径下:

{appId}+{cluster}+{namespace}.properties

appId就是应用自己的appId,如100004458
cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default
namespace就是应用使用的配置namespace,一般是application.

本地缓存路径,可以根据自身需求进行自定义。自定义方式有多种:

  1. 在application.properties或bootstrap.properties中指定apollo.cacheDir=/opt/data/some-cache-dir。

  2. 在server.properties配置文件中指定apollo.cacheDir=/opt/data/some-cache-dir。
    这里同样可以通过指定jvm参数的方式指定,更多自定义方式请参考:
    https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#1231-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BC%93%E5%AD%98%E8%B7%AF%E5%BE%84

  3. maven依赖
    配置完环境后,需要引入Apollo的client依赖,如下:

<dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.5.0</version>
</dependency>
  1. 客户端读取配置方式
    Java客户端在读取Apollo配置中心配置时,有多种方式,且多种方式并不冲突,可组合使用。
    3.1 API使用方式
    API方式是最简单、高效使用Apollo配置的方式,不依赖Spring框架即可使用。
    Config config= ConfigService.getAppConfig();
    config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent configChangeEvent) {
    ConfigChange change=configChangeEvent.getChange(key);
    }
    });
    String value=config.getProperty(key,“default”);

上述代码的作用是,获取默认的配置NameSpace(application.properties),并设置监听,最后通过键值key获取配置文件中的值。
注:在获取Config对象时,可通过ConfigService.getAppConfig();获取默认的NameSpace(application.properties),也可通过ConfigService.getConfig(configNamespace);来获取其他NameSpace下的配置信息。
若配置文件的格式不为properties,则需要写完整的名称,如test.yaml。
3.2 Spring整合方式
Apollo也支持和Spring整合(Spring 3.1.1+),只需要做一些简单的配置.Apollo支持spring的多种整合方式,xml方式,javaconfig方式,springboot方式等,xml方式暂不介绍。
3.2.1 配置
3.2.1.1 Javaconfig整合方式
直接看代码:

需要注意的点:

  1. @EnableApolloConfig要和@Configuration一起使用,不然不会生效。
  2. @EnableApolloConfig后面可加参数可不加参数,若直接使用@EnableApolloConfig,则会注入默认的Namespace(application.properties).若要注入其他的NameSpace,则需要通过value属性来指定。若有多个,则用“,”分割。
  3. @EnableApolloConfig可使用order属性,其值为整数,最小值为0.且值越小,优先级越高。
    3.2.1.2 Spring boot整合方式
    在application.properties/bootstrap.properties中进行配置:
  4. 注入默认application namespace的配置示例
    apollo.bootstrap.enabled = true
  5. 注入非默认application namespace或多个namespace的配置示例
    apollo.bootstrap.enabled = true
    apollo.bootstrap.namespaces = application,FX.apollo,application.yml

3.2.2 Spring Placeholder的使用
跟读取配置文件中的使用方式相同:

@Value("${name:default}")
private String name;

同时,也可以在应用中的配置文件里,使用placeholder,读取配置中心的配置信息。
多种方式不做赘述了。有疑问可参考:
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#322-spring-placeholder%E7%9A%84%E4%BD%BF%E7%94%A8

3.2.3 Spring Annotation支持
Apollo增加了几个新的Annotation来简化在Spring环境中的使用。

  1. @ApolloConfig
    o 用来自动注入Config对象

  2. @ApolloConfigChangeListener
    o 用来自动注册ConfigChangeListener

  3. @ApolloJsonValue
    o 用来把配置的json字符串自动注入为对象

然后在configuration类中,将bean注入spring容器即可。

五、 多环境管理
Apollo可支持多个环境的管理和配置,实现步骤如下:

  1. 创建多个环境
    每一个环境需要独立部署一套Config Service、Admin Service和ApolloConfigDB,所以第一步需要在不同的服务器安装这些环境。(portal和ApolloPortalDB只需要部署在产品环境)
  2. 将多个环境配置到portal中
    向portal添加环境其实很简单,只需要修改portal的配置文件就好(apollo-env.properties这里有多种方式,可以去查看官网文档,我这里只写集群部署的配置文档)。配置完成后,服务需要重启。

这里指定了不同环境的meta server(即eureka注册中心,默认为configsevice的地址),根据你的具体情况作出调整。
3. 客户端设置
Java客户端调用时可使用下面方式:
1)在配置文件中添加 env=你的环境。对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties(没有可自己创建)。
2)在你应用的根目录或者config目录,添加文件apollo-env.properties,在文件中指定meta server。结合1.2步,就可以修改server.properties时,自动更改配置了。
apollo-env.properties配置如下:

六、 参考文档及源码
Apollo分布式部署指南:
https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97
Java客户端使用指南:
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
源码:
https://github.com/ctripcorp/apollo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值