沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • 网络通信

  • 消息队列

  • Spring Cloud

    • Spring Cloud Alibaba 从入门到实战

      • 基础知识篇
      • 分布式配置
      • 服务注册与发现
      • 分布式服务调用
      • 服务熔断和限流
      • 分布式消息(事件)驱动
      • 分布式事务
    • SpringCloud Stream学习
    • Nacos入门
    • Apollo入门
      • Apollo 简介
      • Apollo 核心概念
      • 核心组件和架构
      • Apollo 与 Nacos 的对比
      • Apollo 快速上手
        • 环境准备
        • windows 环境启动
        • Docker 环境启动
        • Apollo 创建配置示例
        • Spring Boot 集成 Apollo
        • 方式一:使用 @Value
        • 方式二:使用 Config API
        • 客户端监听配置变化
      • 实践建议
      • 学习参考
  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

  • 虚拟机

  • 微服务
  • Spring Cloud
沉梦听雨
2025-07-24
目录

Apollo入门

# Apollo 入门

# Apollo 简介

Apollo (opens new window) 是携程开源的一款 分布式配置中心,用于集中管理应用配置,支持热更新、权限控制、灰度发布等功能,适用于微服务架构中配置管理的场景。

Apollo 的主要特点包括

  • 配置 集中管理,可视化修改;
  • 支持 实时推送(热更新),客户端自动刷新;
  • 支持配置 灰度发布;
  • 支持多环境、多集群、多命名空间;
  • 提供 版本回滚 功能;
  • 支持 权限管理与审计日志。

Apollo 支持 4 个维度管理 Key-Value 格式的配置

  1. application (应用)
  2. environment (环境)
  3. cluster (集群)
  4. namespace (命名空间)

# Apollo 核心概念

  1. application (应用)
    • 这个很好理解,就是实际使用配置的应用,Apollo 客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
    • 关键字:appId
  2. environment (环境)
    • 配置对应的环境,Apollo 客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
    • 关键字:env
  3. cluster (集群)
    • 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
    • 关键字:cluster
  4. namespace (命名空间)
    • 一个应用下不同配置的分组,可以简单地把 namespace 类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC 配置文件,应用自身的配置文件等
    • 关键字:namespaces

关系:应用包含多个环境,环境包含多个集群,集群中包含多个命名空间

命名空间注意事项

  • 命名空间名全局唯一(比如两个应用不能都创建一个叫 common.json 的公共命名空间);
  • 公共命名空间建议统一在一个配置应用下维护,比如 common-config;
  • 公共命名空间中的 key 如果与私有命名空间冲突,以 私有命名空间优先;
  • 一个应用可以同时引用多个公共命名空间。

命名空间实战建议

场景 建议类型
每个服务自己的业务配置 私有命名空间
多服务共享的 Redis、限流、开关等 公共命名空间
想以模块区分配置,如 log4j.yaml 私有或公共皆可,取决于是否共享
想全局维护一些规则 公共命名空间

# 核心组件和架构

Apollo 的核心由以下几个模块组成:

  1. Config Service:提供配置读取、推送服务(对客户端)。
  2. Admin Service:提供配置管理功能(供 Portal 使用)。
  3. Portal:可视化管理界面。
  4. 客户端 SDK:集成在服务中,实现配置读取和监听更新。

Apollo 架构图如下:

          +-----------+         +-----------------+
          |  Apollo   |<------->|  Config Service |
          |  Portal   |         +-----------------+
               |
         +-------------+
         | AdminService|
         +-------------+
1
2
3
4
5
6
7

客户端部署后,会通过 SDK 向 Config Service 拉取配置,并可实时监听配置变更。

# Apollo 与 Nacos 的对比

特性 Apollo Nacos
所属 携程开源 阿里开源
配置热更新 支持(默认开启) 支持(需依赖 Spring Cloud)
多命名空间支持 支持 支持
灰度发布 支持 不支持
权限管理 支持 简单支持
集群部署难度 相对复杂 较简单
配置格式支持 支持 Properties、YAML、JSON、XML 等 支持 Properties、YAML、JSON
服务注册与发现 不支持(只管配置) 支持(服务发现与配置中心二合一)

简而言之:

  • Apollo 更注重 配置管理能力,尤其适合配置量大、管理复杂的项目;
  • Nacos 是一个 配置中心 + 注册中心 的统一平台,更适合 Spring Cloud 项目。

# Apollo 快速上手

官方文档:Quick Start (opens new window)

# 环境准备

官方提供了 apollo-quick-start 项目 (opens new window),可以使用 Docker 快速部署。

# windows 环境启动

1、在 git bash 中,执行下面的启动命令:

export SPRING_PROFILES_ACTIVE="github,database-discovery,auth"

# 配置 ApolloConfigDB 数据库连接
unset SPRING_SQL_CONFIG_INIT_MODE
export SPRING_CONFIG_DATASOURCE_URL="jdbc:mysql://localhost:3306/apolloconfigdb?useUnicode=true&characterEncoding=utf8&useSSL=false"
export SPRING_CONFIG_DATASOURCE_USERNAME="root"
export SPRING_CONFIG_DATASOURCE_PASSWORD="123456"

# 配置 ApolloPortalDB 数据库连接
unset SPRING_SQL_PORTAL_INIT_MODE
export SPRING_PORTAL_DATASOURCE_URL="jdbc:mysql://localhost:3306/apolloportaldb?useUnicode=true&characterEncoding=utf8&useSSL=false"
export SPRING_PORTAL_DATASOURCE_USERNAME="root"
export SPRING_PORTAL_DATASOURCE_PASSWORD="123456"
java -jar apollo-all-in-one.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14

2、或者执行启动脚本命令:

  • ⚠️注意:这种命令启动无法直接通过 Ctrl + c 来关闭项目
# 启动
./demo.sh start

# 关闭
./demo.sh stop
1
2
3
4
5

# Docker 环境启动

参考:docker run apollo | 沉梦听雨的编程指南 (opens new window)

启动成功后:

  • Portal 地址: http://localhost:8070 (opens new window)
  • 默认账号: apollo / admin
  • 对应的 meta 是:http://localhost:8080

# Apollo 创建配置示例

进入 Portal:

  1. 创建一个新的应用(App Id 如 myApollo);
  2. 创建命名空间,如 application;
  3. 添加配置项:
    • test.name = apollo
    • test.age = 25

发布配置后,客户端即可拉取。

# Spring Boot 集成 Apollo

参考:Java 客户端使用指南 (opens new window)

以 Spring Boot 为例,引入依赖:


<!--        <dependency>-->
<!--            <groupId>com.ctrip.framework.apollo</groupId>-->
<!--            <artifactId>apollo-client</artifactId>-->
<!--            <version>2.4.0</version>-->
<!--        </dependency>-->

			<!-- 内部集成了 client 依赖 -->
			<dependency>
				<groupId>com.ctrip.framework.apollo</groupId>
				<artifactId>apollo-client-config-data</artifactId>
				<version>2.4.0</version>
			</dependency>

1
2
3
4
5
6
7
8
9
10
11
12
13
14

在 application.properties 中配置:

app.id=myApollo
apollo.meta=http://localhost:8080
apollo.bootstrap.enabled=true
apollo.cluster=default
apollo.bootstrap.namespaces=application
1
2
3
4
5

读取配置方式有两种:

# 方式一:使用 @Value

/**
 * apollo 配置项,会自动更新值
 *
 * @author chenmeng
 */
@Component
@Getter
public class MyConfigs {

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

    @Value("${test.age:18}")
    private String age;
}

    /**
     * 使用 @Value 注解获取配置
     */
    @RequestMapping("/hello")
    public String hello() {
        return "hello " + myConfigs.getName() + " " + myConfigs.getAge();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 方式二:使用 Config API

    /**
     * 使用 Config API 获取配置
     */
    @RequestMapping("/hello2")
    public String hello2() {
        // Config config = ConfigService.getAppConfig();
        Config config = ConfigService.getConfig("application-dev.yml");
        String name = config.getProperty("test.name", "default-name");
        String age = config.getProperty("test.age", "18");
        return "hello " + name + " " + age;
    }
1
2
3
4
5
6
7
8
9
10
11

# 客户端监听配置变化

官方示例:

Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
  @Override
  public void onChange(ConfigChangeEvent changeEvent) {
    for (String key : changeEvent.changedKeys()) {
      ConfigChange change = changeEvent.getChange(key);
      System.out.println(String.format(
        "Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
        change.getPropertyName(), change.getOldValue(),
        change.getNewValue(), change.getChangeType()));
     }
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

笔者示例:

@Component
public class ApolloConfigListener {

    /**
     * 方式 1:直接在 Spring Bean 中用 ConfigService 注册监听器
     * 
     * @PostConstruct 注解标记的方法会在 Spring Bean 初始化完成后自动执行(只执行一次,在 Bean 初始化完成后)
     */
    @PostConstruct
    public void init() {
        // 获取默认 application 命名空间的配置
        Config config = ConfigService.getAppConfig();
        // 真正的持续监听
        config.addChangeListener((ConfigChangeEvent changeEvent) -> {
            for (String key : changeEvent.changedKeys()) {
                ConfigChange change = changeEvent.getChange(key);
                System.out.printf("[init]配置变化: key=%s, old=%s, new=%s, type=%s%n",
                        change.getPropertyName(),
                        change.getOldValue(),
                        change.getNewValue(),
                        change.getChangeType());
            }
        });
    }

    /**
     * 方式 2:在 Spring Bean 中用 @ApolloConfigChangeListener 注解注册监听器
     */
    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent changeEvent) {
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.printf("[onChange]配置变化: key=%s, old=%s, new=%s, type=%s%n",
                    change.getPropertyName(),
                    change.getOldValue(),
                    change.getNewValue(),
                    change.getChangeType());
        }
    }

    /**
     * 监听指定 namespace 的配置变化
     */
    @ApolloConfigChangeListener("application-dev.yml")
    public void onChangeByNamespace(ConfigChangeEvent changeEvent) {
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.printf("[onChangeByNamespace]配置变化: key=%s, old=%s, new=%s, type=%s%n",
                    change.getPropertyName(),
                    change.getOldValue(),
                    change.getNewValue(),
                    change.getChangeType());
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 实践建议

  • 配置分类建议使用多个命名空间(如 DB 配置、线程池配置、开关配置分开管理);
  • 线上配置发布建议启用审计、灰度发布功能,避免全量影响;
  • 定期使用回滚功能测试变更的安全性;
  • 警惕误删配置项,可以启用强制发布审核流程。

# 学习参考

  • Apollo 官方文档 (opens new window)
  • 配置中心:Apollo入门了解 - 知乎 (opens new window)
  • apollo quick start操作 - 简书 (opens new window)
上次更新: 2025/8/12 17:40:31
Nacos入门
认识Seata

← Nacos入门 认识Seata→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式