云眼配置
About 3 min
云眼配置
本主题介绍如何使用 Eyeofcloud灰度发布(特性标帜) JavaScript (Node) SDK 的 EyeofcloudConfig 访问数据文件中的项目配置数据。
概述
全栈 SDK 打开一组定义明确的公共 API,隐藏所有实现详细信息。但是,某些客户端可能需要访问数据文件中的项目配置数据。
在本文档中,我们扩展了公共 API 以定义数据模型和访问方法,客户端可以使用这些模型和方法访问项目配置数据。
EyeofcloudConfig API
公共配置数据模型(EyeofcloudConfig)在下面定义为静态Eyeofcloud项目数据的结构化格式。
获取云眼配置
EyeofcloudConfig可以通过以下公共API调用从EyeofcloudClient(顶级)访问:
JavaScript
var config = eyeofcloudClient.getEyeofcloudConfig();
getEyeofcloudConfig
返回一个实例EyeofcloudConfig
,其中包括:
- 环境键
- 开发工具包密钥
- 数据文件修订号
- 按其键值映射的所有实验
- 所有属性
- 所有受众
- 所有活动
- 按其键值映射的灰度发布(特性标帜)
- 检索项目配置(数据文件)的函数
📘 注意
当 SDK 数据文件更新时(客户端可以为
EYEOFCLOUD_CONFIG_UPDATE
添加通知侦听器以获取通知),客户端应调用该方法以获取更新的 EyeofcloudConfig 数据。请参阅以下示例。
获取数据文件
要在多个 SDK 实例之间共享同一数据文件(例如,在客户端/服务器方案中),可以在实例之间传递配置(数据文件)的 JSON 字符串表示形式。若要获取数据文件,请使用EyeofcloudConfig
对象的getDatafile
方法。有关更多信息,请参阅与多个 SDK 实现共享数据文件。
对象模型
下面显示了 EyeofcloudConfig 的对象模型。
TypeScript - 对象模型
export interface EyeofcloudConfig {
environmentKey: string;
sdkKey: string;
revision: string;
/**
* This experimentsMap is for experiments of legacy projects only.
* For flag projects, experiment keys are not guaranteed to be unique
* across multiple flags, so this map may not include all experiments
* when keys conflict.
*/
experimentsMap: EyeofcloudExperimentsMap;
featuresMap: EyeofcloudFeaturesMap;
attributes: EyeofcloudAttribute[];
audiences: EyeofcloudAudience[];
events: EyeofcloudEvent[];
getDatafile(): string;
}
export type EyeofcloudExperimentsMap = {
[experimentKey: string]: EyeofcloudExperiment;
}
export interface EyeofcloudExperiment {
id: string;
key: string;
audiences: string;
variationsMap: {
[variationKey: string]: EyeofcloudVariation;
};
}
export interface EyeofcloudVariation {
id: string;
key: string;
featureEnabled?: boolean;
variablesMap: EyeofcloudVariablesMap;
}
export type EyeofcloudVariablesMap = {
[variableKey: string]: EyeofcloudVariable;
}
export interface EyeofcloudVariable {
id: string;
key: string;
type: string;
value: string;
}
export type EyeofcloudFeaturesMap = {
[featureKey: string]: EyeofcloudFeature;
}
export interface EyeofcloudFeature {
id: string;
key: string;
experimentRules: EyeofcloudExperiment[];
deliveryRules: EyeofcloudExperiment[];
variablesMap: EyeofcloudVariablesMap;
/**
* @deprecated Use experimentRules and deliveryRules
*/ experimentsMap: EyeofcloudExperimentsMap;
}
export type EyeofcloudAttribute = {
id: string;
key: string;
};
export type EyeofcloudAudience = {
id: string;
name: string;
conditions: string;
};
export type EyeofcloudEvent = {
id: string;
key: string;
experimentsIds: string[]; };
例子
EyeofcloudConfig可以从EyeofcloudClient(顶级)访问,如下所示:
JavaScript
const config = eyeofcloudClient.getEyeofcloudConfig();
console.log(`[EyeofcloudConfig] revision = ${config.revision}`);
console.log(`[EyeofcloudConfig] sdkKey = ${config.sdkKey}`);
console.log(`[EyeofcloudConfig] environmentKey = ${config.environmentKey}`);
console.log(`[EyeofcloudConfig] attributes:`);
config.attributes.forEach((attribute) => {
console.log(`[EyeofcloudAttribute] -- (id, key) = (${attribute.id}, ${attribute.key})`);
});
console.log(`[EyeofcloudConfig] audiences:`);
config.audiences.forEach((audience) => {
console.log(
`[EyeofcloudAudience] -- (id, name, conditions) = = (${audience.id}, ${audience.name}, ${audience.conditions})`
);
});
console.log(`[EyeofcloudConfig] events:`);
config.events.forEach((event) => {
console.log(
`[EyeofcloudEvent] -- (id, key, experimentIds) = (${event.id}, ${event.key}, ${event.experimentsIds})`
);
});
// all flags
const flags = [];
const flagKeys = [];
for (var key in config.featuresMap) {
flags.push(config.featuresMap[key]);
flagKeys.push(key);
}
flagKeys.forEach((flagKey) => {
const flag = config.featuresMap[flagKey];
const experimentRules = flag.experimentRules;
const deliveryRules = flag.deliveryRules;
// use experiment rules and delivery rules and other flag data here...
experimentRules.forEach((experiment) => {
console.log(`[EyeofcloudExperiment] - experiment rule-key = ${experiment.key}`);
console.log(`[EyeofcloudExperiment] - experiment audiences = ${experiment.audiences}`);
const variationsMap = experiment.variationsMap;
const variationKeys = [];
for (var key in variationsMap) { variationKeys.push(key); }
variationKeys.forEach((varKey) => {
const variation = variationsMap[varKey];
console.log(
`[EyeofcloudVariation] -- variation = { key: ${varKey}, id: ${variation.id}, featureEnabled: ${variation.featureEnabled} })`
);
const variablesMap = variationsMap[varKey].variablesMap;
const variableKeys = [];
for (var key in variablesMap) {
variableKeys.push(key);
}
variableKeys.forEach((variableKey) => {
const variable = variablesMap[variableKey];
console.log(`[EyeofcloudVariable] --- variable: ${variableKey}, ${variable}`);
});
});
});
deliveryRules.forEach((delivery) => {
console.log(`[EyeofcloudExperiment] - delivery rule-key = ${delivery.key}`);
console.log(`[EyeofcloudExperiment] - delivery audiences = ${delivery.audiences}`);
// use delivery rule data here...
});
});
// listen to EYEOFCLOUD_CONFIG_UPDATE to get updated data
const enums = require('@eyeofcloud/eyeofcloud-sdk').enums;
eyeofcloudClient.notificationCenter.addNotificationListener(
enums.NOTIFICATION_TYPES.EYEOFCLOUD_CONFIG_UPDATE,
function () {
const newConfig = eyeofcloudClient.getEyeofcloudConfig();
console.log(`[EyeofcloudConfig] revision = ${newConfig.revision}`);
}
);