微服务配置组件变色龙Archaius
介绍
如果我们要设计开发一套微服务基础架构,大家觉得哪个组件是最基础的?基于多年互联网分布式系统的实战经验,我的回答是配置中心以及配套的客户端。之前我在极客时间上的课程《微服务架构和实践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.properties
中timeout
配置值是500
,在myapp-prod.properties
中timeout
配置值是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中的集群名,一般用缺省default
,namespaceName
是应用在Apollo中的名字空间,一般用缺省application
。 - 注意,对于不同的环境(TEST,UAT,PROD等),Apollo配置中心的地址一般不同
- Archaius动态拉取配置的周期缺省是60秒,可以调整。
结论
- 根据不同上下文动态调整应用的行为逻辑,是现代互联网应用的刚需,配置中心应运而生,它是微服务架构必不可少的组件。
- Archaius是Netflix开源的生产级配置中心客户端组件,它的亮点是支持多维度、分层级的和动态的配置。
- Archaius可以和Apollo配置中可以简单无缝集成,让很多Netflix的开源组件(Zuul,Hystrix,Ribbon等)可以简单接入Apollo。波波2018年在极客时间上的课程《微服务架构和实践160讲》,7月份推出了第3模块:《微服务网关Zuul架构和实践》,其中会通过实验详细分析Archaius和Apollo的集成,通过Apollo+Archaius实现Zuul网关的动态配置,欢迎大家关注。
- 关于Archaius的更多技术细节,可以参考其在github上的站点[附录1],另外拍拍贷框架团队的技术专家尹作龙也写了一篇文章《微服务动态配置组件netflix archaius》[附录2],对Archaius的实现细节、使用案例以及如何与Spring Boot集成进行了深入细致的剖析,欢迎大家学习。
附录
- Netflix Archaius
- 微服务动态配置组件netflix archaius
微服务配置组件变色龙Archaius相关推荐
- 深度对比三种主流微服务配置中心
在撰写这篇技术选型的文章之前,是比较犹豫的.因为,以其中一个开源项目开发者的身份,去写一篇三个开源项目的对比,即便很克制的去客观的比较,也很难有信服力.这就像,既是参赛选手,又想做裁判,观众肯定是不买 ...
- Spring Cloud Config统一管理微服务配置
一Spring Cloud Config背景及简介 # 集中管理的需求:一个使用微服务架构的应用系统可能会包括成百上千个微服务,因此集中管理很有必要 # 不同环境不同配置:例如数据源在不同的环境(开发 ...
- apollo修改配置刷新bean_微服务配置中心完全解读
本文作者:风卿,Nacos 社区 committer. 在撰写这篇技术选型的文章之前,是比较犹豫的.因为,以其中一个开源项目开发者的身份,去写一篇三个开源项目的对比,即便很克制的去客观的比较,也很难有 ...
- 七:对微服务配置中心的理解
微服务专栏地址 专栏:微服务 微服务系列总目录 目录 微服务专栏地址 目录 1. 简介 2. 微服务配置中心是什么 3. 为什么需要微服务配置中心 4. 微服务配置中心实现技术 4.1 网罗的实现技术 ...
- Apollo微服务配置中心详解
Apollo微服务配置中心详解 前言 一.Apollo架构 (一)简介 (二)角色介绍 (三)服务端实现 (四)客服端实现 二.Apollo部署 (一)准备数据库 (二)配置服务 1. 手动部署 (1 ...
- 微服务调用组件Feign实战
文章目录 一.JAVA 项目中如何实现远程接口调用? 二.什么是Feign 2.2 Feign的优势 2.2 Feign的设计架构与底层原理源码 2.3 Ribbon&Feign对比 Ribb ...
- 微服务配置中心, 这个方案 Go 里用起来不输 SpringCloud
微服务架构设计模式里有一条讲到,要设计可配置的服务.把服务从单体架构细分成微服务后,所有配置属性都集中存储在一个位置,更易于管理.这个集中存储管理配置的地方,就是配置中心. 使用配置中心还有一个好处就 ...
- 【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战
系列目录 [Spring Cloud Alibaba](一)微服务介绍 及 Nacos注册中心实战 本文目录 系列目录 前言 什么是RPC? Feign和OpenFeign都是什么? HTTP调用 v ...
- 微服务配置中心实战:Spring + MyBatis + Druid + Nacos
转载自 微服务配置中心实战:Spring + MyBatis + Druid + Nacos 很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid ...
最新文章
- 线性判别分析LDA的数学原理(二)
- Redis 持久化之RDB和AOF
- wine应用运行后字体都是问号
- 【HTML+CSS网页设计与布局 从入门到精通】第10章-CSS
- java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
- 使用annotation配置hibernate(1)
- HTML5 学习笔记(二)——HTML5新增属性与表单元素
- iCloud “文稿和数据”功能即将关闭,如何将数据迁移到 iCloud 云盘?
- python字符串实例_python 字符串内置方法实例
- java生成dump文件_dump文件生成和分析查看
- 计算机为什么找不到网络打印机,电脑找不到网络打印机怎么办
- 运用java画时钟_使用Swing绘制动态时钟
- Kafka自带的Zookeeper未授权访问漏洞
- 10. Java8新特性-新日期和时间API
- C#技术分享【Word转换成图片和PDF——2种方案】
- Unity 3D学习笔记(5)物体的碰撞/触发检测
- node.js v14.9.0以及v12.18.3两版本 百度网盘下载链接
- 适用于ios5的应用_适用于设计人员和开发人员的10个很棒的iOS应用
- python安装及模块安装
- 永磁同步电机(PMSM)参数辨识(二)
热门文章
- 坑人的Synchronized,请慎用!
- OpenCV系列之轮廓:更多属性 | 二十四
- 预热新增13万新客,诺优能的天猫速度
- Windows脚本格式和Unix脚本格式转换
- 学生拍照上传作业老师在线批改html源码,作业1作业提交与批改系统HTML界面.doc...
- 恒源云(GPUSHARE)_opencv(论文笔记)
- UVALive 3353 - Optimal Bus Route Design(二分图最小权匹配)
- leetcode系列-209.长度最小的子数组
- 图为科技基于边缘计算对智能安防的解决方案
- iOS7.X越狱工具evasi0n7存重大bug 切勿急于越狱