Apollo 简介
Apollo配置中心介绍微服务架构~携程Apollo配置中心架构剖析
部署情况
Apollo 本地开发组件版本要求
- Java: 1.8+
- MySQL: 5.6.5+
注意点
apollo-portal 服务和 ApolloPortalDB 数据库只需要在生产环境部署一套
apollo-configservice、apollo-adminservice 服务和 ApolloConfigDB 需要在每个环境部署各一套
服务、数据库
本地模拟部署DEV(开发)、FAT(测试)、UAT(预发布)、PRO(生产)环境
服务:
环境 | 地址 | 服务名 |
– | localhost:8070 | apollo-portal |
DEV | localhost:8081 localhost:8091 | apollo-configservice apollo-adminservice |
FAT | localhost:8082 localhost:8092 | apollo-configservice apollo-adminservice |
UAT | localhost:8083 localhost:8093 | apollo-configservice apollo-adminservice |
PRO | localhost:8084 localhost:8094 | apollo-configservice apollo-adminservice |
数据库:
环境 | 地址 | 数据表名称 |
– | localhost:3306 | ApolloPortalDB |
DEV | localhost:3306 | ApolloConfigDBDev |
FAT | localhost:3306 | ApolloConfigDBFat |
UAT | localhost:3306 | ApolloConfigDBUat |
PRO | localhost:3306 | ApolloConfigDBPro |
Apollo 安装
源码下载
从 Apollo-github 下载源码
初始化数据库
执行sql语句,创建 ApolloConfigDB 和 ApolloPortalDB 两个数据表完成初始化
sql文件路径:
- scripts/sql/apolloconfigdb.sql
- scripts/sql/apolloportaldb.sql
调整配置并打包项目
1、找到 scripts/build.sh 文件,修改数据库配置和 各环境 meta 地址
# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDBDev?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=root
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=root
# meta server url, different environments should have different meta server addresses
dev_meta=http://localhost:8081
fat_meta=http://localhost:8082
uat_meta=http://localhost:8083
pro_meta=http://localhost:8084
2、打包编译,执行命令:
./scripts/build.sh
部署服务
1、多环境部署需要先修改 ApolloPortalDB 数据库 serverconfig 表可支持的环境列表的值为 dev,fat,uat,pro
update `ApolloPortalDB`.`serverconfig` set `Value`='dev,fat,uat,pro' where `Id`='1';
2、apollo-configservice、apollo-adminservice、apollo-portal 三个服务都用相同处理方式,处理完成后必须按照此顺序启动,这里以 apollo-adminservice 为例,步骤如下:
- 复制 apollo-configservice/target/apollo-configservice-1.7.0-SNAPSHOT-github.zip 到新的文件夹,解压文件
- 打开解压后的 scripts/startup.sh 文件,修改 LOG_DIR 的值(不修改可能会有创建文件夹权限问题)以及 SERVER_PORT 的值(看需要修改,也可以不改)
## Adjust log dir if necessary
LOG_DIR={path}/100003171
## Adjust server port if necessary
SERVER_PORT=${SERVER_PORT:={port}}
- 如果 SERVER_PORT 修改了端口号,需要执行 sql 语句:
update `ApolloConfigDB_DEV`.`serverconfig` set `Value`='http://localhost:{port}/eureka/' where `Id`='1';
- 执行 startup.sh 文件,启动服务
3、访问 http://localhost:{port}/ ({port} 值为 apollo-configservice 的 SERVER_PORT 值),可以查看 apollo-configservice 和 apollo-adminservice 是否启动成功
4、访问 http://localhost:8070 会出现 Apollo 的登录页面(默认账号/密码:apollo/admin)
5、点击系统信息,查看各环境情况
Java客户端接入 Apollo 使用
Apollo 创建配置
1、创建项目
2、添加配置项,可以选择不同的环境
3、创建后需要点击发布才会生效
代码部分
1、引入apollo-client 依赖
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.6.0</version>
</dependency>
2、spring boot 启动类文件增加 @EnableApolloConfig 注解
@EnableApolloConfig
public class AppraisalPointsApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AppraisalPointsApplication.class, args);
}
}
3、修改 application.yml 配置文件:
app:
id: crm
apollo:
meta: http://localhost:8081
cacheDir: /opt/data/apollo-config
- app.id 是上面创建的项目 AppId
- apollo.meta 是 apollo-configservice 服务地址
- apollo.cacheDir 是配置的本地缓存目录,可不配置,默认路径为:target/classes/config-cache
4、测试
代码部分:
@Controller("ReportController")
@RequestMapping("/admin/report")
public class ReportController extends AbstractBaseController {
@Value("${test}")
private String val;
@ResponseBody
@GetMapping(value = "/test")
public ResultInfo test() {
return ResultInfo.success(val);
}
}
接口请求结果:
{
"code": 200,
"message": "操作成功",
"data": "i am dev",
"status": true
}
更多应用
公共配置项
1、创建 Namespace
2、将项目关联到公共 Namespace
3、创建公共配置项
4、修改application.yml 配置文件,注入非默认 application 的 namespace或多个 namespace 的配置
app:
id: crm
apollo:
meta: http://localhost:8081
bootstrap:
enabled: true
namespaces : application,TEST1.common
请求结果:
{
"code": 200,
"message": "操作成功",
"data": "i am common",
"status": true
}
5、如果私有 properties 也有公共 Namespace 中的配置,会覆盖公共配置项
请求结果:
{
"code": 200,
"message": "操作成功",
"data": "i am dev-common",
"status": true
}
灰度发布
通过灰度发布功能,可以实现:
- 对于一些对程序有比较大影响的配置,可以先在一个或者多个实例生效,观察一段时间没问题后再全量发布配置
- 对于一些需要调优的配置参数,可以通过灰度发布功能来实现A/B测试。可以在不同的机器上应用不同的配置,不断调整、测评一段时间后找出较优的配置再全量发布配置
使用场景
1、查看实例列表,有 192.168.31.198 和 192.168.31.200 两个客户端使用当前配置;希望修改配置项 test 的值,只对 192.168.31.200 生效
2、创建灰度版本,修改回复配置 test 的值
3、配置灰度规则,只对 192.168.31.200 生效,修改后需要点击”灰度发布“
192.168.31.200 上的请求结果:
{
"code": 200,
"message": "操作成功",
"data": "i am dev-gray",
"status": true
}
4、如果灰度的配置测试下来比较理想,符合预期,那么就可以点击”全量发布“;不符合预期可以点击”放弃灰度“