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

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

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

文章目录

  • 一、Apollo简介
    • 1.1 Nacos、Nacos、Spring Cloud Config 对此
    • 1.2 Apollo特性
    • 1.3 执行流程
  • 二、Apollo安装
    • 2.1 下载安装包
    • 2.2 创建数据库
    • 2.3 启动Apollo
  • 三、使用步骤
    • 3.1 发布配置
    • 3.2 应用读取配置
      • 3.2.1 引入依赖
      • 3.2.2 添加配置
      • 3.2.3 测试
  • 四、Apollo工作原理
    • 4.1 整体架构
    • 4.2 分步执行流程
    • 4.3 核心概念
  • 五、项目管理
    • 5.1 部门管理
    • 5.2 添加用户
    • 5.3 删除项目
    • 5.4 添加命名空间

Apollo(阿波罗)分布式配置中心_第1张图片

一、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、Nacos、Spring Cloud Config 对此

Nacos Nacos Spring 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 执行流程

Apollo(阿波罗)分布式配置中心_第2张图片
操作流程如下:

  1. 在Apollo配置中心修改配置

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

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

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

二、Apollo安装

2.1 下载安装包

  1. 访问Apollo的官方主页https://github.com/apolloconfig/apollo/tags获取安装包,(本次使用1.3版本)
    Apollo(阿波罗)分布式配置中心_第3张图片2. 下载对应的安装包https://github.com/apolloconfig/apollo/releases/tag/v1.3.0
    Apollo(阿波罗)分布式配置中心_第4张图片
    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
    Apollo(阿波罗)分布式配置中心_第5张图片

2.3 启动Apollo

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

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

    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
    
  3. Linux环境下

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

    #!/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 &
    
    

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

  • http://localhost:8070/
  • 账号/密码:apollo/admin

Apollo(阿波罗)分布式配置中心_第6张图片
Apollo(阿波罗)分布式配置中心_第7张图片

三、使用步骤

3.1 发布配置

Apollo(阿波罗)分布式配置中心_第8张图片
Apollo(阿波罗)分布式配置中心_第9张图片Apollo(阿波罗)分布式配置中心_第10张图片

3.2 应用读取配置

3.2.1 引入依赖


   <dependency>
       <groupId>com.ctrip.framework.apollogroupId>
       <artifactId>apollo-clientartifactId>
       <version>1.1.0version>
   dependency>

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,多个用逗号隔开

3.2.3 测试

Apollo添加配置
Apollo(阿波罗)分布式配置中心_第11张图片
项目读取

@Component
@Data
public class Setting {
    @Value("${setting.upload-addr}")
    private String uploadAddr;
    @Value("${setting.path}")
    private String path;
}
@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;
    }
}

启动类添加@EnableApolloConfig注解

@SpringBootApplication
@EnableApolloConfig
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

成功读取
Apollo(阿波罗)分布式配置中心_第12张图片

四、Apollo工作原理

4.1 整体架构

Apollo(阿波罗)分布式配置中心_第13张图片上图简要描述了 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

Apollo(阿波罗)分布式配置中心_第14张图片

五、项目管理

5.1 部门管理

Apollo(阿波罗)分布式配置中心_第15张图片
查询organizations
Apollo(阿波罗)分布式配置中心_第16张图片编辑后保存,退出重新登录,则发现部门添加成功

Apollo(阿波罗)分布式配置中心_第17张图片

5.2 添加用户

Apollo(阿波罗)分布式配置中心_第18张图片
Apollo(阿波罗)分布式配置中心_第19张图片Apollo(阿波罗)分布式配置中心_第20张图片

5.3 删除项目

Apollo(阿波罗)分布式配置中心_第21张图片

Apollo(阿波罗)分布式配置中心_第22张图片

5.4 添加命名空间

Apollo(阿波罗)分布式配置中心_第23张图片

Apollo(阿波罗)分布式配置中心_第24张图片添加配置
Apollo(阿波罗)分布式配置中心_第25张图片

测试读取

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);
    }

}

添加虚拟机参数

-Dapp.id=apollo-config -Denv=DEV -Ddev_meta=http://localhost:8080
Apollo(阿波罗)分布式配置中心_第26张图片
读取成功
Apollo(阿波罗)分布式配置中心_第27张图片

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

你可能感兴趣的:(Spring,Cloud,分布式,java,中间件)