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 是否启动成功

apollo 配置redis apollo 配置中心 多版本_后端

4、访问 http://localhost:8070 会出现 Apollo 的登录页面(默认账号/密码:apollo/admin)

apollo 配置redis apollo 配置中心 多版本_后端_02

5、点击系统信息,查看各环境情况

apollo 配置redis apollo 配置中心 多版本_sql_03

apollo 配置redis apollo 配置中心 多版本_sql_04

Java客户端接入 Apollo 使用

Apollo 创建配置

1、创建项目

apollo 配置redis apollo 配置中心 多版本_后端_05


2、添加配置项,可以选择不同的环境

apollo 配置redis apollo 配置中心 多版本_apollo 配置redis_06


3、创建后需要点击发布才会生效

apollo 配置redis apollo 配置中心 多版本_java_07

代码部分

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

apollo 配置redis apollo 配置中心 多版本_java_08


2、将项目关联到公共 Namespace

apollo 配置redis apollo 配置中心 多版本_apollo 配置redis_09


3、创建公共配置项

apollo 配置redis apollo 配置中心 多版本_java_10


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 中的配置,会覆盖公共配置项

apollo 配置redis apollo 配置中心 多版本_apollo 配置redis_11


请求结果:

{
    "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 生效

apollo 配置redis apollo 配置中心 多版本_apollo 配置redis_12

2、创建灰度版本,修改回复配置 test 的值

apollo 配置redis apollo 配置中心 多版本_灰度_13


3、配置灰度规则,只对 192.168.31.200 生效,修改后需要点击”灰度发布“

apollo 配置redis apollo 配置中心 多版本_sql_14

192.168.31.200 上的请求结果:

{
    "code": 200,
    "message": "操作成功",
    "data": "i am dev-gray",
    "status": true
}

4、如果灰度的配置测试下来比较理想,符合预期,那么就可以点击”全量发布“;不符合预期可以点击”放弃灰度“