一、前言

上篇介绍了 Spring Boot 集成 Dubbo,使我们的系统打下了分布式的基础。随着程序功能的日益复杂,程序的配置日益增多:各种功能开关、参数配置、服务器地址等;对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制等;在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。分布式配置中心应运而生。本篇将主要介绍分布式配置中心 Apollo 的集成过程。


二、部署 Apollo

① 部署教程见官方文档:https://github.com/ctripcorp/apollo/wiki/分布式部署指南

② 架构剖析:https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ


三、使用 Apollo

① 登录 Apollo 管理控制台后创建项目,其中应用 ID 全局唯一。



② 创建成功后跳转到项目维护界面,左侧上方为环境列表,中间区域为项目信息,下方可操作集群及 namespace 。右侧为默认 namespace :application ,具体配置项在此区域维护。


四、Spring Boot 集成 Apollo

4.1 引入 Apollo 依赖包

① 首先在项目父 pom 文件中声明 Apollo 依赖。

<dependencyManagement>
<dependencies>
...省略其余部分...
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
</dependencyManagement>

② 其次在 demo-biz 层中的 pom 文件添加上述 Apollo 依赖。

<dependencies>
...省略其余部分...
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
</dependency>
</dependencies>

4.2 添加 Apollo 配置项

① 在 application.properties 文件中的添加 Apollo 相关的配置项:

# 应用全局唯一的身份标识
app.id = 20000
# Apollo Meta Server 地址
apollo.meta = http://xxx.xxx.xxx.xxx:7881
# 自定义本地配置文件缓存路径
apollo.cacheDir = ./config
# 设置在应用启动阶段就加载 Apollo 配置
apollo.bootstrap.enabled = true
# 注入 application namespace
apollo.bootstrap.namespaces = application

② 将 application.properties 文件中的除了 Apollo 及 Logback 的其他配置项都转移到 Apollo 控制台中维护。

4.3 验证 Apollo

① 启动日志中可以看到 Apollo 从 Meta Server 拉取配置项,并缓存到本地 config 目录。





② 访问 http://localhost:8080/demo/test?id=1 接口正常返回。

4.4 托管 Logback 配置项

① Apollo 1.2.0 版本后支持托管日志相关配置项,只需要在 application.properties 文件中增加以下 Apollo 配置项。

# 将 Apollo 配置加载提到初始化日志系统之前,需要托管日志配置时开启
apollo.bootstrap.eagerLoad.enabled = true

② 将 Logback 配置项转移到 Apollo 控制台中维护。

4.5 本地开发模式

某些情况下比如 Dubbo 接口本地联调,需要修改依赖方的接口版本,此时可以开启本地开发模式,在本地开发模式下,Apollo 只会从本地文件读取配置信息,不会从 Apollo 服务器读取配置。通过设置 JVM 参数开启。

4.6 Dubbo 及 Apollo 的兼容问题

官方在集成 Dubbo 及 Apollo 时提供了两种方式:

  • ① 纯 Spring Boot 方式;即依赖 dubbo-spring-boot-starter 包。
  • ② 原生 Dubbo 方式;即依赖 dubbo 、zookeeper 、 zkclient 、curator-framework 包,然后通过 XML 方式配置,配置项用 ${} 占位符。

而我当时为了能清楚知道,对外提供了哪些 Dubbo 接口以及依赖了哪些外部 Dubbo 接口,使用 Spring XML 的形式配置 Dubbo,同时又依赖了 dubbo-spring-boot-starter 包,结果将 Dubbo 配置项托管至 Apollo 后,出现无法找到 Dubbo 配置项的情况。原因是通过 Spring XML 方式配置 Dubbo 时所依赖的 OverrideDubboConfigApplicationListener 执行时机太早了(远早于 Apollo 配置加载的时机)。Apollo 1.2.0 版本支持「 apollo.bootstrap.eagerLoad.enabled 」配置项后虽然能解决这个问题,但还是不推荐 dubbo-spring-boot-starter + XML 这种形式的配置方式,推荐纯 Spring Boot 方式。

注:详见 https://github.com/ctripcorp/apollo/issues/1600


五、结语

至此 Spring Boot 集成 Apollo 的过程介绍完毕,相关代码已同步至 GitHub 。

Spring Boot 项目实战(六)集成 Apollo的更多相关文章

  1. Spring Boot 项目实战(五)集成 Dubbo

    一.前言 上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题.随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以 ...

  2. Spring Boot 项目实战(四)集成 Redis

    一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...

  3. Spring Boot 项目实战(三)集成 Swagger 及 JavaMelody

    一.前言 上篇介绍了 Logback 的集成过程,总体已经达到了基本可用的项目结构.本篇主要介绍两个常用工具,接口文档工具 Swagger .项目监控工具 JavaMelody 的集成步骤. 二.Sw ...

  4. Spring Boot 项目实战(二)集成 Logback

    一.前言 上篇介绍了 Spring Boot Maven 多模块项目的搭建方法以及 MyBatis 的集成.通常在调试接口或者排查问题时我们主要借助于日志,一个设计合理的日志文件配置能大大降低我们的排 ...

  5. Spring Boot 项目实战(一)Maven 多模块项目搭建

    一.前言 最近公司项目准备开始重构,框架选定为 Spring Boot ,本篇主要记录了在 IDEA 中搭建 Spring Boot Maven 多模块项目的过程. 二.软件及硬件环境 macOS S ...

  6. Github 上热门的 Spring Boot 项目实战推荐

    最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目.对于这些实战项目,有部分是比较适合 Spring Boot 刚入 ...

  7. 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成

    前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...

  8. Spring Boot 2.X(六):Spring Boot 集成Redis

    Redis 简介 什么是 Redis Redis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库. Redis 与其他 key-value 缓存(如 Memcac ...

  9. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

随机推荐

  1. Linux Oracle bash: “sqlplus / as sysdba”: command not found 解决方法

    bash: sqlplus: command not found 解决方法 注:本文来源于 <   bash: sqlplus: command not found 解决方法   > 1: ...

  2. UINavigationController 、navigationBar 、 UINavigationItem、UIBarButtonItem之间的关系

  3. (六)STL仿函数functor

    1.仿函数为算法服务,特点是重载操作符() 2.一共分为3大类,包括算术类,逻辑运算类,相对关系(比较大小):都继承了binary_function 3.仿函数的一些调用示例,其中右边的仿函数没有继承 ...

  4. Java 并发类

    java.util.concurrent包里 提供了一批线程安全的类 一. java.util.concurrent.atomic java.util.concurrent.atomic包里的原子处理 ...

  5. Best Free Hacking E-Books 2017 In PDF Format

    1.Best Free Hacking E-Books 2017 In PDF Format: 电子书籍下载地址 后续我会更新在我的百度云资源 上,需要的留言Black Belt Hacking &a ...

  6. hdu5758 思维,树形dp

    /*可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖dp[u]表示覆盖完u为根的子树需要走的边数 ...

  7. MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)

    在centos6.8上源码安装了MySQL5.7.20,进入mysql的时候报错如下: 解决办法如下: 在mysql的配置文件内加入: vim  /etc/my.cnf skip-grant-tabl ...

  8. jQuery绑定或删除绑定事件

    <!DOCTYPE html><html lang="en" class="loading"><head> <meta ...

  9. python selenium打开新窗口,多窗口切换

    # coding=utf-8 from selenium import webdriver browser=webdriver.Firefox() browser.maximize_window() ...

  10. k-近邻算法-手写识别系统

    手写数字是32x32的黑白图像.为了能使用KNN分类器,我们需要把32x32的二进制图像转换为1x1024 1. 将图像转化为向量 from numpy import * # 导入科学计算包numpy ...