云眼配置

云眼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}`);   
    } 
);
Last update:
Contributors: “zhangweixue”,zhangweixue