介绍

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

在NetflixOSS微服务技术栈中,几乎所有的其它组件(例如Zuul, Hystrix, Eureka, Ribbon等)都依赖于Archaius,可以说理解Archaius是理解和使用Netflix其它微服务组件的基础。另外,2018.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的总体设计:

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.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。波波2018年在极客时间上的课程《微服务架构和实践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

微服务配置组件变色龙Archaius相关推荐

  1. 深度对比三种主流微服务配置中心

    在撰写这篇技术选型的文章之前,是比较犹豫的.因为,以其中一个开源项目开发者的身份,去写一篇三个开源项目的对比,即便很克制的去客观的比较,也很难有信服力.这就像,既是参赛选手,又想做裁判,观众肯定是不买 ...

  2. Spring Cloud Config统一管理微服务配置

    一Spring Cloud Config背景及简介 # 集中管理的需求:一个使用微服务架构的应用系统可能会包括成百上千个微服务,因此集中管理很有必要 # 不同环境不同配置:例如数据源在不同的环境(开发 ...

  3. apollo修改配置刷新bean_微服务配置中心完全解读

    本文作者:风卿,Nacos 社区 committer. 在撰写这篇技术选型的文章之前,是比较犹豫的.因为,以其中一个开源项目开发者的身份,去写一篇三个开源项目的对比,即便很克制的去客观的比较,也很难有 ...

  4. 七:对微服务配置中心的理解

    微服务专栏地址 专栏:微服务 微服务系列总目录 目录 微服务专栏地址 目录 1. 简介 2. 微服务配置中心是什么 3. 为什么需要微服务配置中心 4. 微服务配置中心实现技术 4.1 网罗的实现技术 ...

  5. Apollo微服务配置中心详解

    Apollo微服务配置中心详解 前言 一.Apollo架构 (一)简介 (二)角色介绍 (三)服务端实现 (四)客服端实现 二.Apollo部署 (一)准备数据库 (二)配置服务 1. 手动部署 (1 ...

  6. 微服务调用组件Feign实战

    文章目录 一.JAVA 项目中如何实现远程接口调用? 二.什么是Feign 2.2 Feign的优势 2.2 Feign的设计架构与底层原理源码 2.3 Ribbon&Feign对比 Ribb ...

  7. 微服务配置中心, 这个方案 Go 里用起来不输 SpringCloud

    微服务架构设计模式里有一条讲到,要设计可配置的服务.把服务从单体架构细分成微服务后,所有配置属性都集中存储在一个位置,更易于管理.这个集中存储管理配置的地方,就是配置中心. 使用配置中心还有一个好处就 ...

  8. 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战

    系列目录 [Spring Cloud Alibaba](一)微服务介绍 及 Nacos注册中心实战 本文目录 系列目录 前言 什么是RPC? Feign和OpenFeign都是什么? HTTP调用 v ...

  9. 微服务配置中心实战:Spring + MyBatis + Druid + Nacos

    转载自  微服务配置中心实战:Spring + MyBatis + Druid + Nacos 很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid ...

最新文章

  1. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )
  2. 京东健康股价创下新高 市值突破6000亿港元
  3. Pandas GroupBy对象
  4. ajax原生为什么else会执行2次,为什么这里的alert会执行2次?
  5. 立创EDA库导入AD18的教程
  6. 多路测温系统C51语言,基于单片机的多路温度检测系统的.docx
  7. GLSL-Compute Shader
  8. iOS系统字体大全,iOS系统中所有的字体
  9. 云点域名-(域名解析、域名转向、二级域名、动态域名)的功能介绍
  10. html 表格选择滚动条,table设置tbody滚动条
  11. [TI TDA4 J721E]开发板网络调试功能及开机自动配置网络
  12. 推荐一组用过好几年的非常稳定的dns
  13. 苹果xr黑屏转圈圈解决方法_苹果xr黑屏转圈打不开也关不掉怎么办
  14. [转]做个男人,做个成熟的男人,做个有城府的男人
  15. JavaSE基础——J2SE概述
  16. 基于参考图像的人脸组成编辑
  17. Autodesk 的 Inventor API培训教材模块
  18. 十进制转二进制转换c语言程序,二进制转十进制c程序_c语言二进制转十进制
  19. 微信小程序-----身份证校验
  20. 西藏 全国计算机二级2021,西藏2021年3月计算机二级考试时间安排

热门文章

  1. CWE 4.7中的新视图 -- 工业控制系统的安全漏洞类别
  2. 视觉进阶|计算机视觉及其后的图神经网络教程(第一部分)
  3. Anderson《空气动力学基础》5th读书笔记 第1记——流动相似性
  4. 烟台市莱山区计算机电脑培训班,烟台邦文电脑培训班|AB软件简介
  5. leetcode系列--112. 路径总和
  6. leetcode系列--454.四数之和Ⅱ
  7. 2021年中国共享住宿发展现状及市场格局分析:市场规模为152亿元[图]
  8. linux下mysql降权处理,Windows下降权MYSQL和apche的运行级别
  9. 去哪儿网机票搜索系统的高并发架构设计(2017-03-20 蒋志伟)
  10. 第十一届全国大学生数学竞赛A类真题+答案+详细讲解+知识点总结