Apollo配置中心学习教程
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
第一步:分了解一些名词
Apollo-config:配置服务中心,包括新增,修改的配置参数;客户端拉取新的,修改的配置参数。需要与数据库ApolloConfigDB连接。在多环境部署时,每一个环境需要部署一台,注意数据库连接地址的修该。需要注册发布到Eureka注册中心。
Meta-Server:配置服务的注册服务中心,类似与zookeeper,eureka的作用,但仅限apollo相关服务使用。配置方式与aoollo-config一同启动,同一个jvm所以地址与apollo-config一样。
Apollo-Admin:配置发布新更新的管理后台,主要为管理web界面apollo-portal服务。需要连接数据库ApolloConfigDB。需要注册发到Eureka注册中心。
Apollo-Portal:WEB管理界面,具有用户,权限管理,不同环境,不同appId的配置文件发布,修改。需要连接数据库ApolloPortalDB,管理多个环境只需要一套,配置好不同环境的Meta-Server地址即可进行管理。
AppID:这是Apollo给定义的一个名词,没一个子项目必须有一个唯一的id,用与在发布配置参数时进行对每个子应用的区分。eg:userprod
Apollo-Client:只需要maven依赖apollo-client包,配置meta-server地址,appID即可。
第二步:Apollo项目源码的修改与服务端的发布
Git地址:https://github.com/ctripcorp/apollo
打包,发布时的顺序
Apollo-config -> Apollo-Admin -> Apollo-portal
关闭服务时相反。
2.1:可使用修该源码的一些参数与实际项目更加符合。
系统原本默认的为DEV环境,其他源码中预置的环境与我们的项目不符合,进行修改,加入test,release两个环境配置(请根据你的实际项目来确认)。
- 假设需要添加的环境名称叫beta
- 修改com.ctrip.framework.apollo.core.enums.Env类,在其中加入BETA枚举:
public enum Env{
LOCAL, DEV, BETA, FWS, FAT, UAT, LPT, PRO, TOOLS, UNKNOWN;
...
}
- 修改com.ctrip.framework.apollo.core.enums.EnvUtils类,在其中加入BETA枚举的转换逻辑:
public final class EnvUtils {
public static Env transformEnv(String envName) {
if (StringUtils.isBlank(envName)) {
return Env.UNKNOWN;
}
switch (envName.trim().toUpperCase()) {
...
case "BETA":
return Env.BETA;
...
default:
return Env.UNKNOWN;
}
}
}
- 修改apollo-env.properties,增加beta.meta占位符:
local.meta=http://localhost:8080
dev.meta=${dev_meta}
fat.meta=${fat_meta}
beta.meta=${beta_meta}
uat.meta=${uat_meta}
lpt.meta=${lpt_meta}
pro.meta=${pro_meta}
- 修改com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider类,增加读取BETA环境的meta server地址逻辑:
public class MetaDomainConsts {
...
domains.put(Env.BETA,
env.getProperty("beta_meta", prop.getProperty("beta.meta")));
...
}
.
- 数据库的配置修改 ApolloPortalDB.ServerConfig.apollo.portal.envs = DEV,TEST,RELEASE
2.2 : 源码中配置参数的修改\
Apollo-Config
注释掉com.ctrip.framework.apollo.configservice.ConfigServiceApplication类上的
@EnableEurekaServer,统一注册到Shuaiche的eureka上
application.yml文件 application-name,server-port,logging-file三项的修改
bootstrap.yml文件 eureka-instance-hostname 地址与端口
configservice.properties文件,配置数据库的连接地址(注意不同环境打包时修改)
startup.sh启动脚本中修改 应用名,日志地址,服务端口,jvm参数等。
Apollo-Admin
application.yml文件 application-name,server-port,logging-file三项的修改
bootstrap.yml文件 eureka-instance-hostname 地址与端口
adminservice.properties文件, 配置数据库的连接地址(注意不同环境打包时修改)。
startup.sh启动脚本中修改 应用名,日志地址,服务端口,jvm参数等。
Apollo-Portal
apollo-env.properties:多环境的meta-server地址,使用占位符dev.meta=${dev_meta}
application.yml文件 application-name,server-port,logging-file三项的修改
portal.properties文件:配置数据库的连接地址。
startup.sh启动脚本中修改 应用名,日志地址,服务端口,jvm参数等。
最后在主项目中的script文件夹下
找到configDB与portalDB数据库的初使化的sql文件,按需求导入到mysql中。
修改打包脚本build.bat中的meta-server与数据库连接的配置参数.
最后使用build.bat打包脚本进行打包操作。
2.3 在虚拟机上进行部署
分别上传打好包的文件
apollo-configservice-1.3.0-SNAPSHOT-github.zip
apollo-adminservice-1.3.0-SNAPSHOT-github.zip
apollo-portal-1.3.0-SNAPSHOT-github.zip
进入config文件夹,解压文件,进入script文件夹,使用脚本进行启动项目
其他项目的启动类似。
2.4 部署中需要注意的问题
1:开放服务的端口(可以自己指定)
eureka 8890
apollo-adminservice 9090
apollo-configservice 9080
apollo-portal 9070
2:AppId:代表一个应用的唯一的标识
application.properties中指定 app.id=YOUR-APP-ID
或者classpath:/META-INF/app.properties 文件中指定 app.id=YOUR-APP-ID
3:当前虚拟机的环境(dev,test,release)指定(官方推荐第一种)
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data\{appId}\config-cache
或者修改启动脚本
java -Dapollo.cacheDir=/opt/data/some-cache-dir -jar xxx.jar
或者:application.properties或bootstrap.properties中指定
apollo.cacheDir=/opt/data/some-cache-dir
4: config与admin每个环境要部署一套,portal只需要部署一套,跟据你所部署情况做好hosts映射。
5:Eureka的地址,ApolloConfigDB拥有*别,一定要注意修改
Ps:我现在使用hosts映射的方式去配置,因为这样不同环境中的eureka只需要同一个指定域名就可以了,不需要都 去修改ip地址。
第三步:客户端(具体应用的项目)的修改
1:引入maven的依赖
2:启动类上加入Apollo的注解
3:配置参数发布与修改的 监听器
4:使用Apollo的配置生效
5.配置文件application.properties
Ps:注意hosts文件的映射
6:具体的参数获取值
Ps:后边的参数表示默认值,在发布失败或者发布的类型不符合时,可以使用默认值。
第四步:WEB管理页面
http://192.168.2.143:9070/ 商品号为9070 username:apollo password:admin(可以新增)
最五步:apollo里边还有几个特色功能
灰度发布:暂时没有用到
通过创建灰度版本,您可以对某些配置做灰度测试
灰度流程为:
1.创建灰度版本
2.配置灰度配置项
3.配置灰度规则.如果是私有的namespace可以按照客户端的IP进行灰度,如果是公共的namespace则可以同时按AppId和客户端的IP进行灰度
4.灰度发布
灰度版本最终有两种结果:全量发布和放弃灰度
全量发布:灰度的配置合到主版本并发布,所有的客户端都会使用合并后的配置
放弃灰度:删除灰度版本,所有的客户端都会使用回主版本的配置
注意事项:
- 如果灰度版本已经有灰度发布过,那么修改灰度规则后,无需再次灰度发布就立即生效。
集群:通过添加集群,可以使同一份程序在不同的集群(如不同的数据中心)使用不同的配置。
Eg: ordercenter 部署了4个,其中的配置有不相同的,则可以按配置参数相同作为分组设置成集群。(如果相同环境下的ordercenter的配置是相同的就没有必要配置集群)
配置方法:/opt/settings/server.properties文件idc= 作为集群的名称
Namespace:是配置项的集合,类似于一个配置文件的概念。
默认创建一个“application”的Namespace(现在只使用默认的这个)
分为private,public,关联的,相互可以覆盖,交集的。具体可以查看