专业的编程技术博客社区

网站首页 > 博客文章 正文

从0到1,实战Apollo(阿波罗)开源分布式配置中心

baijin 2024-08-22 09:31:18 博客文章 4 ℃ 0 评论

背景

随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……

对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……

在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。

Apollo配置中心应运而生!

2、Apollo简介

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

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

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

3、Apollo特性

  • 统一管理不同环境、不同集群的配置Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。同一份代码部署在不同的集群,可以有不同的配置,比如zk的地址等通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖配置界面支持多语言(中文,English)
  • 配置修改实时生效(热发布)用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。
  • 版本发布管理所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。
  • 灰度发布支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
  • 权限管理、发布审核、操作审计应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。所有的操作都有审计日志,可以方便的追踪问题。
  • 客户端配置信息监控可以方便的看到配置在被哪些实例使用
  • 提供Java和.Net原生客户端提供了Java和.Net的原生客户端,方便应用集成支持Spring Placeholder,Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)同时提供了Http接口,非Java和.Net应用也可以方便的使用
  • 提供开放平台APIApollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,如xml, json,需要对格式做校验。还有一些使用方如DAL,不仅有特定的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制
  • 部署简单配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能减少目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数

4、Apollo的实现方式

如上图所示,简要描述了Apollo客户端的实现原理:

1. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。

2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

2.1)这是一个fallback机制,为了防止推送机制失效导致配置不更新

2.2)客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified

2.3)定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval 来覆盖,单位为分钟。

3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中

4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份

在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置

5.应用程序从Apollo客户端获取最新的配置、订阅配置更新通知

4.1 Apollo服务器端搭建

4.1.1 环境要求

Java 版本要求 1.8 +

MySQL版本要求:5.6.5+

4.1.3 环境搭建

(1) 下载Apollo可以通过官网下载安装包

(2) 配置数据库Apollo服务端共需要两个数据库: ApolloPortalDB 和 ApolloConfigDB ,下载文件后,只需要导入数据库即可。

(3) 配置数据库连接

Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

#apollo config db info

apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?

characterEncoding=utf8

apollo_config_db_username=用户名

apollo_config_db_password=密码(如果没有密码,留空即可)

# apollo portal db info

apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?

characterEncoding=utf8

apollo_portal_db_username=用户名

apollo_portal_db_password=密码(如果没有密码,留空即可)

(4) 启动Apollo配置中心

启动脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。./demo.sh start当看到如下输出后,就说明启动成功了!==== starting service ====

Service logging file is ./service/apollo-service.log

Started [10768]

Waiting for config service startup.......

Config service started. You may visit http://localhost:8080 for service status

now!

Waiting for admin service startup....

Admin service started

==== starting portal ====

Portal logging file is ./portal/apollo-portal.log

Started [10846]

Waiting for portal startup......

Portal started. You can visit http://localhost:8070 now!

(5) 测试通过浏览器打开 http://ip:8070 即可访问Apollo配置中心的前端页面

4.2 Apollo客户器端搭建

(1) 引入依赖Apollo的客户端jar包已经上传到中央仓库,应用在实际使用时只需要按照如下方式引入即可。 <dependency>

<groupId>com.ctrip.framework.apollo</groupId>

<artifactId>apollo-client</artifactId>

<version>1.1.0</version>

</dependency>(2)Spring Boot集成Spring Boot支持通过application.properties/bootstrap.properties来配置,该方式能使配置在更早的阶段注入,比如使用 @ConditionalOnProperty 的场景或者是有一些spring-boot-starter在启动阶段就需要读取配置做一些事情,所以对于Spring Boot环境建议通过以下方式来接入Apollo(需要0.10.0及以上版本)。

使用方式很简单,只需要在application.properties/bootstrap.properties中按照如下样例配置即可。

1. 注入默认 application namespace的配置示例# will inject 'application' namespace in bootstrap phase

apollo.bootstrap.enabled = true

2.注入非默认 application namespace或多个namespace的配置示例apollo.bootstrap.enabled = true

apollo.bootstrap.namespaces = application,FX.apollo,application.yml

3.将Apollo配置加载提到初始化日志系统之前(1.2.0+)从1.2.0版本开始,如果希望把日志相关的配置(如 logging.level.root=info 或 logbackspring.xml 中的参数)也放在Apollo管理,那么可以额外配置

apollo.bootstrap.eagerLoad.enabled=true 来使Apollo的加载顺序放到日志系统加载之前,不过这会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!所以在Apollo代码中使用Slf4j的日志输出便没有任何内容)

配置示例如下:# will inject 'application' namespace in bootstrap phase

apollo.bootstrap.enabled = true

# put apollo initialization before logging system initialization

apollo.bootstrap.eagerLoad.enabled=true

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表