广东专业企业网站建设,地图网站开发,wordpress怎么设置seo,护肤品网站建站模板前提介绍
如果要设计开发一套微服务基础架构#xff0c;参数化配置是一个非常重要的点#xff0c;而Netflix也开源了一个叫变色龙Archaius的配置中心客户端#xff0c;而且Archaius可以说是比其他客户端具备更多生产级特性#xff0c;也更灵活。*在NetflixOSS微服务技术栈…前提介绍
如果要设计开发一套微服务基础架构参数化配置是一个非常重要的点而Netflix也开源了一个叫变色龙Archaius的配置中心客户端而且Archaius可以说是比其他客户端具备更多生产级特性也更灵活。*在NetflixOSS微服务技术栈中几乎所有的其它组件(例如Zuul, Hystrix, Eureka, Ribbon等)都依赖于Archaius可以说理解Archaius是理解和使用Netflix其它微服务组件的基础。
Archaius是什么
Netflix Archaius是一个配置管理库其重点是来自多个配置存储的动态属性。它包括一组用于Netflix的Java配置管理API。它主要实现为Apache Commons Configuration库的扩展。提供的主要功能有 注意Netflix只是开源了其配置中心的客户端部分(也就是Archaius)没有开源配套的服务器端。Archaius其实是配置源实现无关的可以对接各种配置中心作为数据源本文后面会介绍Archaius如何和Apollo配置中心进行集成。 Archaius项目的由来
在微服务环境下配置常常需要根据不同的上下文环境进行调整或者说配置应该是多维度的。例如在Netflix上下文维度包括环境(开发、测试和生产)。Netflix希望能够根据发布的环境甚至请求的上下文动态地调整服务的配置让Netflix的整个系统的行为和逻辑变得动态可调配以适应互联网应用快速多变的需求。为此Netflix平台团队开发了配置中心产品团队将这个产品形象地称为变色龙Archaius因为变色龙这种动物能够根据自己所处的环境动态调整身体的颜色。
Archaius在Netflix的用例场景
根据请求上下文开启或关闭某项功能。某个页面缺省显示10个商品在某些情况下可以通过Archaius调整配置只显示5个商品。动态调整Hystrix熔断器的行为。调整服务调用客户端的连接和请求超时参数。如果某个线上服务产生出错告警可以动态调整日志输出级别(粒度可以细到包或者组件级别)这样可以通过详细日志排查问题。问题定位以后再将日志输出级别恢复到默认级别。对于多区域或者多国家部署的应用通过动态配置可以根据不同区域和国家开启不同的功能。可以根据用户的实际访问模式动态调整一些基础中间件的配置例如缓存的存活时间TTL(Time To Live)。数据库访问客户端的连接池配置可以对不同服务配不同的值。例如一个请求频率RPS(Request Per Second)小的服务可以配置较小的连接数而一个请求频率大的服务可以配置较大的连接数。运行期配置的变更可以在不同维度生效例如集群中的单个实例维度多区域部署下的某个区域维度某个服务栈维度或者某个应用集群维度。功能开关(Feature Flag)发布有些功能虽然上线但是并不马上启用而是通过配置开关动态启用这样可以根据情况灵活开启或者关闭某项线上功能。金丝雀发布(Canary Release)新功能上线时让新老集群同时并存一段时间通过配置将到老集群的流量逐步动态调整到新集群如果监控显示无异常则完成新集群的上线如异常则快速切回老集群。
Archaius的技术基础
archaius是netflix开源的动态属性配置框架基于apache commons configuration, 提供在运行时获取配置值的功能。Archaius的核心是可以容纳一个或多个配置的复合配置的概念。每个配置都可以从诸如JDBC、REST接口、xxx.properties文件等配置源中获取。可以选择在运行时对配置源进行轮询以进行动态更改属性的最终值取决于包含该属性的最顶层配置因为是复合配置。即如果一个属性存在于多个配置中则应用程序看到的实际值将是配置层次结构中最顶层插槽中的值当然这种层次结构是可以配置的。
Archaius的架构设计 Archaius实际上是对Apache Common Configuration Library的一个封装和扩展提供了一组基于Java的配置API主要的特性包括 配置可动态调整:动态、类型属性配置支持类型(Int, Long, Boolean等)。高性能和线程安全高吞吐量和线程安全的配置操作提供一个拉(pulling)配置的框架可以从配置源动态拉取变更的配置。一个轮询框架允许用户获取对配置源的属性更改支持回调(callback)机制在配置变更时自动调用。支持JMX MBean可以通过JConsole查看配置和修改配置。
对于愿意使用基于约定的属性文件位置的应用程序(以及大多数web应用程序)提供开箱即用的复合配置这是强大功能之一对于符合配置官网给了一副示例图如下 Achaius的核心是一个称为**组合配置(Composite Configuration)**的概念简单可以理解为一个分层级的配置层级有优先级高优先级的层级的配置会覆盖低优先级的配置。每一个层级可以从某个配置源获取配置例如本地配置文件JDBC数据源远程REST API等。配置源还可以在运行时动态拉取变更例如在上图中持久化数据库配置(Persisted DB Configuration)是指将配置存在关系数据库中相应的配置源会定期从数据库拉取变更)。配置的最终值由顶级配置决定例如如果多个层级都含有某个配置项那么应用最终见到的值是配置层级中最顶层的值。配置分层的顺序是可以调整的。
通过archaius获取配置值有两种方式:
一种是通过ConfigurationManager获取到配置中心实例然后通过propName获取配置值通过ConfigurationManager获取配置另外一种方式是通过DynamicPropertyFactory获取配置项的DynamicProperty wrapper。
Archaius的实现原理
Archaius是什么 Archaius提供了动态修改配置的值的功能在修改配置后不需要重启应用服务。其核心思想就是轮询配置源每一次迭代检测配置是否更改有更改重新更新配置。 底层archaius提供实现了Apache-common-configuration的AbstractConfiguration的具体实现。 ConcurrentMapConfiguration提供将配置项配置值放在ConcurrentHashMap中维护的功能。 DynamicConfiguration提供动态从数据源获取所有配置值的功能通过轮询数据源更新配置值。 DynamicWatchedConfiguration也是提供动态更新配置的功能与DynamicConfiguration不同的是配置更新是数据源有变化时触发的。 DynamicConfiguration是pull方式DynamicWatchedConfiguration是push方式。 ConcurrentCompositeConfiguration使用了组合模式组合不同的AbstractConfiguration实现。对于有多个配置源的配置中心可以使用ConcurrentCompositeConfiguration。对于同一个配置项多个配置源都有配置值的时候取第一个匹配到的配置源的数据。 DynamicPropertyFactory是怎么运行的
DynamicPropertyFactory持有AbstractConfiguration实例。创建DynamicProperty对象时DynamicProperty对象会获取DynamicPropertyFactory持有的AbstractConfiguration实例。DynamicProperty对象会向AbstractConfiguration实例注册DynamicPropertyListener, 当AbstractConfiguration有增删改查变化时会通知到当前的DynamicProperty对象。
当创建的DynamicProperty实例数量比较大的时候这里可能有性能问题。每创建一个任何一个DynamicProperty都会增加一个listener,同时任何一个配置项发生变化都会触发listener。 可能是考虑到生产环境中不会有那么多的配置项变更吧。像zk-config那种对应配置项变更才触发watcher要好一点。 AbstractConfiguration是怎么注入的 archaius仅允许一个AbstractConfiguration的实现类。如果有多个配置源可以使用上面提到的ConcurrentCompositeConfiguration将不同的AbstractConfiguration组合起来。 有以下几种方式注入AbstractConfiguration。
配置archaius.default.configuration.class 指定AbstractConfiguration实现类配置 archaius.default.configuration.factory 指定AbstractConfiguration实例工厂方法类工厂方法类需要实现getInstance方法返回AbstractConfiguration实例调用 ConfigurationManager 的 install(AbstractConfiguration config) 方法调用DynamicPropertyFactory 的 initWithConfigurationSource(AbstractConfiguration config) 方法 以上方法是互斥的只能使用其中的一种一种生效后其他的就不能调用了。 一个简单的例子
Maven依赖配置
dependencygroupIdcom.netflix.archaiusgroupIdartifactIdarchaius-coreartifactIdversion0.7.7version
dependency
复制代码获取配置源 public class DynamicConfigurationSource implements PolledConfigurationSource {public PollResult poll(boolean initial,Object checkPoint) throws Exception {Map map new HashMap();map.put(test,UUID.randomUUID().toString());return PollResult.createFull(map);}
}
复制代码定义调度器
AbstractPollingScheduler scheduler new FixedDelayPollingScheduler(2000,2000,false);
复制代码定义动态配置
DynamicConfiguration configuration new DynamicConfiguration(source,scheduler);
复制代码简单单元测试
.testng.annotations.Testpublic void testArchaius() throws Exception {PolledConfigurationSource source new DynamicConfigurationSource();AbstractPollingScheduler scheduler new FixedDelayPollingScheduler(2000,2000,false);DynamicConfiguration configuration new DynamicConfiguration(source,scheduler);ConfigurationManager.install(configuration);final DynamicStringProperty stringProperty DynamicPropertyFactory.getInstance().getStringProperty(test,nodata);Helpers.subscribePrint(Observable.interval(1,TimeUnit.SECONDS).take(20).doOnNext(new Action1() {public void call(Long aLong) {System.out.println(stringProperty.get());}}),test);TimeUnit.MINUTES.sleep(1);}
复制代码实现
启动轮询任务
public synchronized void startPolling(PolledConfigurationSource source, AbstractPollingScheduler scheduler) {this.scheduler scheduler;this.source source;init(source, scheduler);scheduler.startPolling(source, this);
}
复制代码轮询的Runnable和初始化实现是一致的
PollResult result null;try {result source.poll(false,getNextCheckPoint(checkPoint));checkPoint result.getCheckPoint();fireEvent(EventType.POLL_SUCCESS, result, null);} catch (Throwable e) {log.error(Error getting result from polling source, e);fireEvent(EventType.POLL_FAILURE, null, e);return;}try {populateProperties(result, config);} catch (Throwable e) {log.error(Error occured applying properties, e);}
复制代码注意到会调用source.poll方法即PolledConfigurationSource的polled我们实现的数据源接口可以自定义数据源jdbc,文件scm等 总结 在深入理解Archaius过程中有一个绕不开的障碍便是Apache Commons Configuration由于前者强依赖于后者进行配置管理。正所谓你对Apache Commons Configuration有多了解决定了你对Netflix Archaius的认识有多深。 分享资源 获取以上资源请访问开源项目 点击跳转 文章转载自: http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.lnbcg.cn.gov.cn.lnbcg.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.pclgj.cn.gov.cn.pclgj.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.tqdqc.cn.gov.cn.tqdqc.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.wljzr.cn.gov.cn.wljzr.cn http://www.morning.rjnky.cn.gov.cn.rjnky.cn http://www.morning.yxnfd.cn.gov.cn.yxnfd.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.tpdg.cn.gov.cn.tpdg.cn http://www.morning.wbxr.cn.gov.cn.wbxr.cn http://www.morning.skdrp.cn.gov.cn.skdrp.cn http://www.morning.mtmnk.cn.gov.cn.mtmnk.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.wqgr.cn.gov.cn.wqgr.cn http://www.morning.dsprl.cn.gov.cn.dsprl.cn http://www.morning.snzgg.cn.gov.cn.snzgg.cn http://www.morning.gchqy.cn.gov.cn.gchqy.cn http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn http://www.morning.tpqrc.cn.gov.cn.tpqrc.cn http://www.morning.hsxkq.cn.gov.cn.hsxkq.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.qmnhw.cn.gov.cn.qmnhw.cn http://www.morning.kqrql.cn.gov.cn.kqrql.cn http://www.morning.rcdmp.cn.gov.cn.rcdmp.cn http://www.morning.xknmn.cn.gov.cn.xknmn.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.hcwjls.com.gov.cn.hcwjls.com http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn http://www.morning.rfjmy.cn.gov.cn.rfjmy.cn http://www.morning.jtszm.cn.gov.cn.jtszm.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.rfkyb.cn.gov.cn.rfkyb.cn http://www.morning.yxnfd.cn.gov.cn.yxnfd.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.kbgzj.cn.gov.cn.kbgzj.cn http://www.morning.rpwht.cn.gov.cn.rpwht.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn http://www.morning.fsbns.cn.gov.cn.fsbns.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.krrjb.cn.gov.cn.krrjb.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.qxnlc.cn.gov.cn.qxnlc.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.xjnjb.cn.gov.cn.xjnjb.cn http://www.morning.kflpf.cn.gov.cn.kflpf.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.qdxwf.cn.gov.cn.qdxwf.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.khcpx.cn.gov.cn.khcpx.cn http://www.morning.qrqg.cn.gov.cn.qrqg.cn http://www.morning.gfkb.cn.gov.cn.gfkb.cn http://www.morning.fbxdp.cn.gov.cn.fbxdp.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.dfygx.cn.gov.cn.dfygx.cn http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.ckctj.cn.gov.cn.ckctj.cn http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn http://www.morning.drbwh.cn.gov.cn.drbwh.cn http://www.morning.xznrk.cn.gov.cn.xznrk.cn http://www.morning.qqnp.cn.gov.cn.qqnp.cn http://www.morning.srrrz.cn.gov.cn.srrrz.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.hxlpm.cn.gov.cn.hxlpm.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.zlbjx.cn.gov.cn.zlbjx.cn http://www.morning.yhplt.cn.gov.cn.yhplt.cn http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn