• Spring Boot 项目实战(六)集成 Apollo


    一、前言

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


    二、部署 Apollo

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

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


    三、使用 Apollo

    ① 登录 Apollo 管理控制台后创建项目,其中应用 ID 全局唯一。
    SpringBoot_6_1.png
    ② 创建成功后跳转到项目维护界面,左侧上方为环境列表,中间区域为项目信息,下方可操作集群及 namespace 。右侧为默认 namespace :application ,具体配置项在此区域维护。
    SpringBoot_6_2.png


    四、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 控制台中维护。
    SpringBoot_6_3.png

    4.3 验证 Apollo

    ① 启动日志中可以看到 Apollo 从 Meta Server 拉取配置项,并缓存到本地 config 目录。
    SpringBoot_6_4.png
    SpringBoot_6_5.png
    ② 访问 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 参数开启。
    SpringBoot_6_6.png

    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 。

  • 相关阅读:
    iOS 相册相机应用2
    运行时啊
    在iOS开发的Quartz2D使用中实现图片剪切和截屏功能
    内购
    自制数据挖掘工具分析北京房价 (二) 数据清洗
    数据挖掘工具分析北京房价 (一) 数据爬取采集
    程序员讨论 《黑客帝国》 (三) 情感
    程序员讨论《黑客帝国》(二)平衡和进化
    程序员讨论《黑客帝国》(一)真实与虚拟
    类库与框架,强类型与弱类型的闲聊
  • 原文地址:https://www.cnblogs.com/orzlin/p/10662492.html
Copyright © 2020-2023  润新知