背景
我们有部分服务,从JAVA 切换到 Node.Js,也因此要有一个好用的配置中心,携程的Apollo非常棒,JAVA语言有官方维护的Client,很棒。切换到Node.js虽然有几个开源的实现,但是对我们来说还是不不够完美,简单的几个要求:
- 支持热更新,我可不想每次修改配置都重启服务器
- 最好像Java那样 @value(“mysql.port:3306”)一个简单的装饰器就可以注入配置
- 故障容错能力,比如哪天配置中心挂了,服务还是可以正常启动的,要求配置中心不可用的情况下,主动恢复最近一份配置启动项目。
- 支持Typescript
因此诞生了本项目,
Introduction
- 本项目为携程配置中心框架 Apollo 提供的Node.js版本客户端;
- 客户端连接成功后,会拉取所有配置到本地存储一份,主要是用于 apollo 服务不可用的情况下容错和降级;
- 通过
Http long polling机制实现热更新,客户端会自动修改被注入的属性值,实现无重启修改配置; - 可以通过
getConfigs()函数获取最新的配置; - 故障容错机制,apollo 服务不可用的情况下,客户端会自动恢复最近一份配置启动。
apollo 服务端测试环境:
- host: http://106.54.227.205
- 账号:
apollo - 密码:
admin
Features
- 配置热更新
- 支持装饰器 @value(“mysql.port:3306”)
- 缓存配置到本地
- 灰度发布
- 支持 TypeScript
Install
1 | 复制代码npm i ctrip-apollo-client |
Usage
- 本demo 已经在测试环境创建项目 apolloclient,大家可以直接在本地测试;
- 在配置中心修改user.name值后,无需重启,再次请求,会自动取到最新的值;
- demo 源码。
1 | 复制代码import { CtripApplloClient, value, hotValue } from 'ctrip-apollo-client'; |
API
ApolloClient(options) 构造函数
- returns:
apolloClient - options
- configServerUrl
stringrequiredApollo配置服务的地址 - appId
stringrequired应用的appId - clusterName
string集群名,默认值:default - namespaceList
arrayNamespace的名字,默认值:[application] - configPath
string本地配置文件路径 默认值./config/apolloConfig.json - logger
object日志类 必须实现logger.info(),logger.error()两个方法
- configServerUrl
init(timeoutMs)
初始化配置中心,拉取远端配置到端上,并且缓存一份到文件中,同时开启配置变更监听器来实时同步配置,如果拉取超过 timeoutMs ,或者发生异常,则读取本地缓存的配置文件。如果本地没有缓存配置文件,抛出异常。
- return: Promise
- timeoutMs 超时时间
getConfigs() 获取最新的配置文件
- returns:
object
1 | 复制代码const config = apollo.getConfigs(); |
getValue (namespace = ‘application’) 获取具体的配置字段
- returns:
string - namespace 默认值:
application - field
stringeg:mysql.port:3306分号前面key,如果未配置 3306 作为默认值
1 | 复制代码class User { |
hotValue (namespace = ‘application’) 获取具体的配置字段,封装 getter(热更新)
- returns:
{value} - namespace 默认值:
application - field
string属性位置 eg:mysql.port:3306分号前面key,如果未配置 3306 作为默认值
1 | 复制代码const userName = apollo.hotValue({ field: 'user.name:liuwei' }); |
withValue(target, key, field, namespace)
- returns:
void - target 目标对象
- key 需要注入对象的属性
- field
string属性位置 eg:mysql.port:3306分号前面key,如果未配置 3306 作为默认值 - namespace
string默认值:application
1 | 复制代码class User { |
onChange (callback(object)) 配置变更回调通知
- returns:
void
value(field, namespace) 注入器,只能注入类的属性
- field
string字段属性 - namespace
string
1 | 复制代码import { value } from 'ctrip-apollo-client'; |
Benchmark
一次性注入 [localValue] x 736,896,802 ops/sec ±1.49% (82 runs sampled)
支持热更新 [hotValue] x 2,021,310 ops/sec ±1.28% (87 runs sampled)
热更新默认值 [hotValue default] x 1,581,645 ops/sec ±0.89% (87 runs sampled)
装饰器注入 [decorator] x 2,161,312 ops/sec ±0.96% (87 runs sampled)
原生访问 [dot] x 704,644,395 ops/sec ±1.45% (82 runs sampled)
Fastest is [localValue]
License
项目源码
本文转载自: 掘金