变色龙Archaius配置组件

Archaius Configuation Library

Posted by     "杨波" on Sunday, July 8, 2018

TOC

archaius image

介绍

如果我们要设计开发一套微服务基础架构,大家觉得哪个组件是最基础的?基于多年互联网分布式系统的实战经验,我的回答是配置中心以及配套的客户端。之前我在极客时间上的课程《微服务架构和实践160讲》中,已经深度剖析了携程开源的Apollo配置中心,Apollo是自带客户端的,它的客户端不错很灵活,但是实际上Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比Apollo客户端具备更多生产级特性,也更灵活。

在NetflixOSS微服务技术栈中,几乎所有的其它组件(例如Zuul, Hystrix, Eureka, Ribbon等)都依赖于Archaius,可以说理解Archaius是理解和使用Netflix其它微服务组件的基础。另外,7月份我会在《微服务架构和实践160讲》中推出第3个模块:《微服务网关Zuul架构和实践》,Zuul重度依赖Archaius实现灵活的动态配置,如果缺少Archaius的支持,Zuul的生产级特性可以说会大打折扣。基于上述原因,我写这篇文章普及一下Archaius的原理和设计,也为自己的课程做一些必要的铺垫。

注意,Netflix只是开源了其配置中心的客户端部分(也就是Archaius),没有开源配套的服务器端。Archaius其实是配置源实现无关的,可以对接各种配置中心作为数据源,本文后面会介绍Archaius如何和Apollo配置中心进行集成。

Archaius项目的由来

在微服务环境下,配置常常需要根据不同的上下文环境进行调整,或者说配置应该是多维度的。例如在Netflix,上下文维度包括环境(开发、测试和生产),发布区域(美国东区us-east-1,美国西区us-west-1等等),栈(将有依赖关系的应用和服务为了某种目标而隔离起来的一个逻辑概念,例如iPhone App启动栈),等等。

Netflix希望能够根据发布的环境,甚至请求的上下文,动态地调整服务的配置,让Netflix的整个系统的行为和逻辑变得动态可调配,以适应互联网应用快速多变的需求。为此,Netflix平台团队开发了配置中心产品,团队将这个产品形象地称为变色龙Archaius,因为变色龙这种动物能够根据自己所处的环境动态调整身体的颜色。

Archaius在Netflix的用例场景

  • 根据请求上下文开启或关闭某项功能。
  • 某个页面缺省显示10个商品,在某些情况下,可以通过Archaius调整配置,只显示5个商品。
  • 动态调整Hystrix熔断器的行为。
  • 调整服务调用客户端的连接和请求超时参数。
  • 如果某个线上服务产生出错告警,可以动态调整日志输出级别(粒度可以细到包或者组件级别),这样可以通过详细日志排查问题。问题定位以后,再将日志输出级别恢复到默认级别。
  • 对于多区域或者多国家部署的应用,通过动态配置,可以根据不同区域和国家开启不同的功能。
  • 可以根据用户的实际访问模式动态调整一些基础中间件的配置,例如缓存的存活时间TTL(Time To Live)。
  • 数据库访问客户端的连接池配置,可以对不同服务配不同的值。例如,一个请求频率RPS(Request Per Second)小的服务,可以配置较小的连接数,而一个请求频率大的服务,可以配置较大的连接数。
  • 运行期配置的变更可以在不同维度生效,例如集群中的单个实例维度,多区域部署下的某个区域维度,某个服务栈维度,或者某个应用集群维度。
  • 功能开关(Feature Flag)发布,有些功能虽然上线,但是并不马上启用,而是通过配置开关动态启用,这样可以根据情况灵活开启或者关闭某项线上功能。
  • 金丝雀发布(Canary Release),新功能上线时,让新老集群同时并存一段时间,通过配置将到老集群的流量逐步动态调整到新集群,如果监控显示无异常,则完成新集群的上线,如异常,则快速切回老集群。

Archaius的特性和设计

Archaius实际上是对Apache Common Configuration Library的一个封装和扩展,提供了一组基于Java的配置API,主要的特性包括:

  • 配置可动态调整。
  • 配置支持类型(Int, Long, Boolean等)。
  • 高性能和线程安全。
  • 提供一个拉(pulling)配置的框架,可以从配置源动态拉取变更的配置。
  • 支持回调(callback)机制,在配置变更时自动调用。
  • 支持JMX MBean,可以通过JConsole查看配置和修改配置。

下图是Archaius的总体设计:

archaius design

Achaius的核心是一个称为组合配置(Composite Configuration)的概念,简单可以理解为一个分层级的配置,层级有优先级,高优先级的层级的配置会覆盖低优先级的配置。每一个层级可以从某个配置源获取配置,例如本地配置文件,JDBC数据源,远程REST API等。配置源还可以在运行时动态拉取变更,例如在上图中,持久化数据库配置(Persisted DB Configuration)是指将配置存在关系数据库中,相应的配置源会定期从数据库拉取变更)。配置的最终值由顶级配置决定,例如,如果多个层级都含有某个配置项,那么应用最终见到的值是配置层级中最顶层的值。配置分层的顺序是可以调整的。

分级配置案例

假设你开发了一个叫myapp的应用,在本地开发环境,一般你希望用本地配置,不依赖于远程的配置中心,这个时候你只需为应用写一个本地配置文件:

myapp.properties

这个配置文件里头包含myapp的所有缺省配置。

当你的应用开发完成,需要分别部署到测试TEST, UAT和生产PROD环境,如果你希望在不同的环境重载某些缺省值,那么你可以为不同环境分别添加本地配置文件,在相关文件中重载缺省值:

myapp-test.properties
myapp-uat.properties
myapp-prod.properties

例如,在myapp.propertiestimeout配置值是500,在myapp-prod.propertiestimeout配置值是200,那么应用在生产环境中将使用重载值timeout=200,其它没有重载则使用myapp.properties中的缺省值。

在Archaius中,可以通过设置archaius.deployment.environment启动参数,来激活不同环境的配置。

如果你还希望应用上线后,可以通过配置中心动态调整配置值,那么你可以将Achaius和某个配置中心(比如Apollo)进行对接,对接后配置中心中的配置具有最高优先级,其中的配置可以覆盖应用本地配置文件中的配置。例如,应用上线后你发现timeout=200设置太小了,想调大到timeout=1000,可以通过配置中心一键搞定。

Archaius和Apollo配置中心集成

Archaius是一款非常优秀的生产级配置客户端组件,比较可惜的是Netflix没有开源它的配置中心的服务器端,幸好业界已经有Apollo这样优秀的配置中心开源产品。Archaius本身是配置源无关的,它提供的拉(pulling)框架可以支持对接各种数据源,而Apollo本身也正好提供基于HTTP REST的配置拉取接口,使得Archaius和Apollo的对接非常简单。

另外,当你想要使用某些Netflix的组件,比如Zuul网关,它原生是支持Archaius进行动态配置的,如果你又想要使用Apollo配置中心支持集中式动态配置,这个时候你用Apollo客户端去改造Zuul的话,工作量不小。其实不需要这么麻烦,这三者可以简单完美实现集成,如下图所示:

archaius+apollo

集成要点:

  • 通过设置archaius.configurationSource.additionalUrls启动参数,设置为Apollo的配置文件拉取端点,激活Archaius的远程配置数据源。
  • Apollo的配置文件拉取端点为: {config_server_url}/configfiles/{appId}/{clusterName}/{namespaceName},其中:config_server_url是配置中心地址,appId是应用(例如Zuul)在Apollo中的唯一标识,clusterName是应用在Apollo中的集群名,一般用缺省defaultnamespaceName是应用在Apollo中的名字空间,一般用缺省application
  • 注意,对于不同的环境(TEST,UAT,PROD等),Apollo配置中心的地址一般不同
  • Archaius动态拉取配置的周期缺省是60秒,可以调整。

结论

  1. 根据不同上下文动态调整应用的行为逻辑,是现代互联网应用的刚需,配置中心应运而生,它是微服务架构必不可少的组件。
  2. Archaius是Netflix开源的生产级配置中心客户端组件,它的亮点是支持多维度、分层级的和动态的配置。
  3. Archaius可以和Apollo配置中可以简单无缝集成,让很多Netflix的开源组件(Zuul,Hystrix,Ribbon等)可以简单接入Apollo。波波在极客时间上的课程《微服务架构和实践160讲》,7月份会推出第3模块:《微服务网关Zuul架构和实践》,其中会通过实验详细分析Archaius和Apollo的集成,通过Apollo+Archaius实现Zuul网关的动态配置,欢迎大家关注。
  4. 关于Archaius的更多技术细节,可以参考其在github上的站点[附录1],另外拍拍贷框架团队的技术专家尹作龙也写了一篇文章《微服务动态配置组件netflix archaius》[附录2],对Archaius的实现细节、使用案例以及如何与Spring Boot集成进行了深入细致的剖析,欢迎大家学习。

附录

  1. Netflix Archaius
  2. 微服务动态配置组件netflix archaius

comments powered by Disqus