• Apollo(阿波罗)分布式配置中心


    🍓 简介:java系列技术分享(👉持续更新中…🔥)
    🍓 初衷:一起学习、一起进步、坚持不懈
    🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
    🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

    🍓 更多文章请点击
    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    一、Apollo简介

    官方文档:https://github.com/apolloconfig/apollo

    Apollo(阿波罗)2016年5月 是 携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

    目前市面上用的比较多的配置中心有:

    1. Disconf
      2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年前了。
    2. Spring Cloud Config
      2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
    3. Apollo
      2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。
    4. Nacos
      2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。

    配置中心核心概念的对比
    由于Disconf不再维护,下面对比一下Spring Cloud Config、Apollo和Nacos。

    1.1 Nacos、 Apollo、Spring Cloud Config 对此

    NacosApolloSpring Cloud Config
    灰度发布不支持支持IP级别的灰度发布第三方框架支持
    权限管理不支持基本完善第三方平台支持
    版本管理&回滚支持之前回滚上一个版本,properties提供跨版本的回滚第三方平台支持
    配置实时推送(动态刷新)支持,但是敏感加密后的动态刷新出现无法解密基本完善第三方框架支持
    敏感加密引入Jasypt引入Jasypt原生支持
    多环境支持支持支持
    高可用支持支持支持
    社区支持一般活跃一般

    Spring Cloud Config作为官方提供的配置中心,适合学习和刚开始使用分布式框架的项目使用

    Nacos作为阿里2018年开源的产品,有阿里背书,且服务发现和配置集与一体。但是从目前的发展来看,阿里开发重心在于服务发现端,配置中心相关功能开发相对滞后,适合中小型企业使用

    Apollo是携程2016年开源的配置中心,经历了5年的迭代,现在已经是一个很完善的产品,能满足大型互联网的大多数需要

    总的来看,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,Nacos则使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。
    但对于一个开源项目的选型,项目上的人力投入(迭代进度、文档的完整性)、社区的活跃度(issue的数量和解决速度、Contributor数量、社群的交流频次等),这些因素也比较关键,考虑到Nacos开源时间不长和社区活跃度,所以从目前来看Apollo应该是最合适的配置中心选型。

    1.2 Apollo特性

    1. 统一管理不同环境、不同集群的配置
    2. 配置修改实时生效(热发布)
    3. 版本发布管理
    4. 灰度发布
    5. 权限管理、发布审核、操作审计
    6. 客户端配置信息监控
    7. 提供Java和.Net原生客户端
    8. 提供开放平台API

    1.3 执行流程

    在这里插入图片描述
    操作流程如下:

    1. Apollo配置中心修改配置

    2. 应用程序通过Apollo客户端从配置中心拉取配置信息

      用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:

      • 一种是Apollo配置中心会向客户端推送最新的配置;
      • 另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置,通过以上两种
        机制共同来保证应用程序能及时获取到配置。

    二、Apollo安装

    2.1 下载安装包

    1. 访问Apollo的官方主页https://github.com/apolloconfig/apollo/tags获取安装包,(本次使用1.3版本)
      在这里插入图片描述2. 下载对应的安装包https://github.com/apolloconfig/apollo/releases/tag/v1.3.0
      在这里插入图片描述
      3, . 解压安装包后将apollo-configservice-1.3.0.jar, apollo-adminservice-1.3.0.jar, apollo-portal-1.3.0.jar放置于
      apollo目录

    2.2 创建数据库

    Apollo服务端共需要两个数据库: ApolloPortalDBApolloConfigDB

    1. 创建ApolloPortalDB,sql脚本下载地址:
      https://github.com/apolloconfig/apollo/blob/v1.3.0/scripts/db/migration/portaldb/V1.0.0__initialization.sql
    2. . 创建ApolloConfigDB,sql脚本下载地址:
      https://github.com/apolloconfig/apollo/blob/v1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql
      在这里插入图片描述

    2.3 启动Apollo

    1. 确保端口未被占用
      Apollo默认会启动3个服务,分别使用8070(apollo‐portal), 8080(apollo-configservice), 8090(apollo‐adminservice)端口,请确保这3个端口当前没有被使用

    2. windows环境下
      apollo目录中创建runApollo.bat文件,快速启动三个服务(修改数据库连接地址,数据库以及password

      echo
      
      set url="localhost:3306"
      set username="root"
      set password="123456"
      
      start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
      start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
      start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    3. Linux环境下

      apollo目录中创建runApollo.sh文件,快速启动三个服务(修改数据库连接地址,数据库以及password

      #!/bin/sh
      
      url="localhost:3306"
      username="root"
      password="123456"
      
      java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-configservice.log -Dserver.port=8080 -jar apollo-configservice-1.3.0.jar &
      java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://${url}/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=${username} -Dspring.datasource.password=${password} -Dlogging.file=./logs/apollo-adminservice.log -Dserver.port=8090 -jar apollo-adminservice-1.3.0.jar & 
      java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -jar apollo-portal-1.3.0.jar &
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    启动成功后,访问管理页面

    在这里插入图片描述
    在这里插入图片描述

    三、使用步骤

    3.1 发布配置

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    3.2 应用读取配置

    3.2.1 引入依赖

    
       <dependency>
           <groupId>com.ctrip.framework.apollogroupId>
           <artifactId>apollo-clientartifactId>
           <version>1.1.0version>
       dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2.2 添加配置

    app:
      id: apollo-config   # app.id是必须配置的
    apollo:
      meta: http://localhost:8080 # Apollo Meta Server 地址(它的注册中心地址,eureka地址)
      bootstrap:
        enabled: true   #是否开启 Apollo 配置预加载功能。默认为 false。
        eagerLoad:
          enable: true  #是否开启 Apollo 支持日志级别的加载时机。默认为 false。
        # 指定 namespace
        namespaces: application  #使用的 Apollo 的命名空间,默认为 application,多个用逗号隔开
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.2.3 测试

    Apollo添加配置
    在这里插入图片描述
    项目读取

    @Component
    @Data
    public class Setting {
        @Value("${setting.upload-addr}")
        private String uploadAddr;
        @Value("${setting.path}")
        private String path;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    @RestController
    public class TestController {
        @Autowired
        private Setting setting;
        @GetMapping("/setting")
        public Map getSetting(){
            Map map = new HashMap<>();
            map.put("uploadAddr",setting.getUploadAddr());
            map.put("path",setting.getPath());
            System.err.println(map);
            return map;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    启动类添加@EnableApolloConfig注解

    @SpringBootApplication
    @EnableApolloConfig
    public class ConsumerApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    成功读取
    在这里插入图片描述

    四、Apollo工作原理

    4.1 整体架构

    在这里插入图片描述上图简要描述了 Apollo 的总体设计,从下往上看:

    • Config Service 提供配置的读取、推送等功能,服务对象是Apollo客户端
    • Admin Service 提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
    • Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的
    • Config Service 和 Admin Service 都是多实例、无状态部署,所以需要将自己注册到 Eureka 中并保持心跳
    • 在 Eureka 之上我们架了一层 Meta Server 用于封装 Eureka 的服务发现接口
    • Client 通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port 访问服务,同时在 Client 侧会做 load balance、错误重试
    • Portal 通过域名访问 Meta Server 获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
    • 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

    4.2 分步执行流程

    1. Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。
    2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server
    3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
    4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
    5. 获取到正确的Config Service和Admin Service的服务信息后,Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能

    4.3 核心概念

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

    在这里插入图片描述

    五、项目管理

    5.1 部门管理

    在这里插入图片描述
    查询organizations
    在这里插入图片描述编辑后保存,退出重新登录,则发现部门添加成功

    在这里插入图片描述

    5.2 添加用户

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    5.3 删除项目

    在这里插入图片描述

    在这里插入图片描述

    5.4 添加命名空间

    在这里插入图片描述

    在这里插入图片描述添加配置
    在这里插入图片描述

    测试读取

    public class GetConfigTest {
        public static void main(String[] args) {
    //        Config config = ConfigService.getAppConfig();  // 读取默认的namespace的配置信息
            Config config = ConfigService.getConfig("spring-test");//读取指定namespace下的配置信息
    
            String someKey = "date";
            String value = config.getProperty(someKey, null);
            System.out.println("读取的配置信息为: " + value);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    添加虚拟机参数

    -Dapp.id=apollo-config -Denv=DEV -Ddev_meta=http://localhost:8080
    在这里插入图片描述
    读取成功
    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述

  • 相关阅读:
    java-jdk8的stream 流对List<map>和list<对象>集合的一个字段值计算操作reduce() collect()的使用
    Spring框架——了解AOP和动态代理
    JS的this关键字详解
    对数器是什么?简单理解下
    TypeScript 基础学习
    无重复字符的最长子串-返回结果字符串
    Linux下OpenJDK的下载和安装
    NB15 牛群编号的回文顺序II
    算法基础课
    leetcode64 最小路径和
  • 原文地址:https://blog.csdn.net/qq_41805567/article/details/133783203