Skip to content

Latest commit

 

History

History
404 lines (320 loc) · 12.1 KB

File metadata and controls

404 lines (320 loc) · 12.1 KB
sidebar_position 5

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';

使用人群组

人群组是可以在多个开关中共享的人群过滤规则。 我们将带领你使用FeatureProbe的平台创建一个人群组,然后在两个开关中使用这个人群组。并且通过一个后端程序,验证人群组的修改会同时在两个开关中生效。

假定我们要实现以下场景:

  • 有一个由测试人员email组成的白名单,需要在多个开关中使用。以便这组测试人员可以测试多个开关。
  • 这个测试人员白名单需要统一修改,添加的新测试人员可以在多个开关中生效。

在平台创建人群组

  1. 登录我们提供的FeatureProbe演示平台,如果是第一次登录,请输入邮箱。后续可以继续使用你的邮箱访问到属于你的数据。
  2. 点击人群组/+人群组新建一个新的人群

create segment

  1. 填入名称和标识,点击 创建并发布

publish segment

4.从列表中点击新创建的人群组,进入编辑。

segment_list_cn.png

  1. 添加一个规则,选择类型,输入属性email
  • 选择string类型
  • 规则是其中之一
  • 然后输入两个测试人员email
  • 点击发布

tutorial_segment_detail_cn.png 6. 此时还没有开关使用这个『用户组』,这里直接点击下一步,并且确认变更。

tutorial_segment_publish_next_step_cn.png

在开关中使用人群组

下面,我们来到开关列表,创建两个开关都使用以上创建的人群组qa_email

  1. 创建一个返回值为bool型的开关feature1,使用默认配置即可,然后点击创建并发布

tutorial_toggle_create_use_segment_cn.png

  1. 进入开关feature1的编辑页面,状态改为生效,点击+ 增加规则,选择人群组规则

tutorial_toggle_use_segment_add_rule_cn.png

  1. 编辑规则
  • 选择属于人群组
  • 选择测试人员email人群组
  • 为人群组设置返回值variation2
  • 其余返回规则设置返回值variation1

tutorial_toggle_use_segment_rule_detail_cn.png

  1. 发布开关feature1
  2. 重复以上步骤1-4,创建另一个使用相同人群组的开关feature2

代码访问验证人群组

后端代码编写

  1. 按你熟悉的语言,下载并打开相应的后端示例代码
bash:> git clone https://gitee.com/FeatureProbe/server-sdk-java.git
bash:> cd server-sdk-java

用编辑器打开src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java文件。

bash:> git clone https://gitee.com/FeatureProbe/server-sdk-go.git
bash:> cd server-sdk-go

用编辑器打开example/main.go文件。

bash:> git clone https://gitee.com/FeatureProbe/server-sdk-rust.git
bash:> cd server-sdk-rust

用编辑器打开examples/demo.rs文件。

bash:> git clone https://gitee.com/FeatureProbe/server-sdk-python.git
bash:> cd server-sdk-python

用编辑器打开demo.py文件。

  1. 打开FeatureProbe平台项目列表页面, 可以在开关详情页点击服务来打开 project
  2. 复制服务端SDK密钥 sdk key
  3. 服务端SDK密钥以及FeatureProbe网址 ("https://featureprobe.io/server") 填入后端代码相应变量中
    private static final String FEATURE_PROBE_SERVER_URL = "https://featureprobe.io/server";
    private static final String FEATURE_PROBE_SERVER_SDK_KEY = // 填入 服务端SDK密钥 ;
	config := featureprobe.FPConfig{
	    // highlight-start
		RemoteUrl: "https://featureprobe.io/server",
		ServerSdkKey:    // 填入 服务端SDK密钥
		// highlight-end
		RefreshInterval: 5000, // ms
		WaitFirstResp:   true,
	}
    let remote_url = "https://featureprobe.io/server";
    let server_sdk_key = // 填入 服务端SDK密钥
    FEATURE_PROBE_SERVER_URL = 'https://featureprobe.io/server'
    FEATURE_PROBE_SERVER_SDK_KEY = # 填入 服务端SDK密钥
  1. 加入以下代码,模拟3个带email属性的用户访问这2个开关
public static void main(String[] args) throws IOException {

     Logger root = (Logger)LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
     root.setLevel(Level.WARN);

     final FPConfig config = FPConfig.builder()
     .remoteUri(FEATURE_PROBE_SERVER_URL)
     .build();

      // Init FeatureProbe, share this FeatureProbe instance in your project.
      final FeatureProbe fpClient = new FeatureProbe(FEATURE_PROBE_SERVER_SDK_KEY, config);
      
      // highlight-start
      FPUser[] users = {
         new FPUser().with("email", "tester_a@company.com"),
         new FPUser().with("email", "tester_b@company.com"),
         new FPUser().with("email", "tester_c@company.com"),
      };

      for (FPUser user:users) {
         if (fpClient.boolValue("feature1", user, false)) {
            System.out.println(user.getAttr("email") + " see the new feature1");
         } else {
            System.out.println(user.getAttr("email") + " see nothing");
         }
      }

      for (FPUser user:users) {
         if (fpClient.boolValue("feature2", user, false)) {
            System.out.println(user.getAttr("email") + " see the new feature2");
         } else {
            System.out.println(user.getAttr("email") + " see nothing");
         }        
      }
      // highlight-end

      fpClient.close();
}
func main() {
	config := featureprobe.FPConfig{
		RemoteUrl: "https://featureprobe.io/server",
		ServerSdkKey:    // 填入 服务端SDK密钥,
		RefreshInterval: 5000, // ms
		WaitFirstResp:   true,
	}
	fp, err := featureprobe.NewFeatureProbe(config)
	if err != nil {
		fmt.Println(err)
		return
	}
    // highlight-start
	users := []featureprobe.FPUser{
		featureprobe.NewUser().With("email", "tester_a@company.com"),
		featureprobe.NewUser().With("email", "tester_b@company.com"),
		featureprobe.NewUser().With("email", "tester_c@company.com"),
	}

	for _, user := range users {
		if (fp.BoolValue("feature1", user, false)) {
		    fmt.Println(user.Get("email"), "see the new feature1")
		} else {
		    fmt.Println(user.Get("email"), "see nothing")
		}
	}
	
	for _, user := range users {
		if (fp.BoolValue("feature2", user, false)) {
		    fmt.Println(user.Get("email"), "see the new feature2")
		} else {
		    fmt.Println(user.Get("email"), "see nothing")
		}
	}
	// highlight-end
	fp.Close()
}
#[tokio::main]
async fn main() {
    let remote_url = "https://featureprobe.io/server";
    let server_sdk_key = // 填入 服务端SDK密钥;
    let config = FPConfig {
        remote_url: remote_url.to_owned(),
        server_sdk_key: server_sdk_key.to_owned(),
        refresh_interval: Duration::from_millis(2000),
        #[cfg(feature = "use_tokio")]
        http_client: None,
        wait_first_resp: true,
        ..Default::default()
    };

    let fp = match FeatureProbe::new(config) {
        Ok(fp) => fp,
        Err(e) => {
            tracing::error!("{:?}", e);
            return;
        }
    };
  // highlight-start
    let users = [
        FPUser::new().with("email", "tester_a@company.com"),
        FPUser::new().with("email", "tester_b@company.com"),
        FPUser::new().with("email", "tester_c@company.com")
    ];
    for user in users {
        if fp.bool_value("feature1", &user, false) {
           println!("{:?} see the new feature1", user.get("email"));
        } else {
           println!("{:?} see nothing", user.get("email"));
        }
    }
    for user in users {
        if fp.bool_value("feature2", &user, false) {
            println!("{:?} see the new feature2", user.get("email"));
        } else {
            println!("{:?} see nothing", user.get("email"));
        }
    }
    // highlight-end
    fp.close();
}
logging.basicConfig(level=logging.WARNING)

if __name__ == '__main__':
    FEATURE_PROBE_SERVER_URL = 'https://featureprobe.io/server'
    FEATURE_PROBE_SERVER_SDK_KEY = # 填入 服务端SDK密钥;

    config = fp.Config(remote_uri=FEATURE_PROBE_SERVER_URL,  # FeatureProbe server URL
                       sync_mode='pooling',
                       refresh_interval=3)

    with fp.Client(FEATURE_PROBE_SERVER_SDK_KEY, config) as client:
        # highlight-start
        users = [
            fp.User().with_attr("email", "tester_a@company.com"),
            fp.User().with_attr("email", "tester_b@company.com"),
            fp.User().with_attr("email", "tester_c@company.com")
        ]

        for user in users:
            if client.value('feature1', user, default=False):
                print(user['email'] + 'see the new feature1')
            else:
                print(user['email'] + 'see nothing')

        for user in users:
            if client.value('feature2', user, default=False):
                print(user['email'] + 'see the new feature2')
            else:
                print(user['email'] + 'see nothing')
        # highlight-end

:::tip 除了Toggle的规则中显式用到的用户属性需要通过with方法传入SDK,Toggle中所使用的人群组中需要用到的用户属性(例如:email),也需要通过with方法传入FeatureProbe SDK。 :::

运行验证

运行编辑后的服务端程序

bash:> mvn package
bash:> java -jar ./target/server-sdk-java-1.4.0.jar
bash:> go run example/main.go
bash:> cargo run --example demo
bash:> pip3 install -r requirements.txt
bash:> python3 demo.py

查看log验证结果,可以看到人群组中的两个测试email(tester_a和tester_b)能够看到两个新feature,而不在人群组中的email(tester_c)则看不到。

tester_a@company.com see the new feature1
tester_b@company.com see the new feature1
tester_c@company.com see nothing
tester_a@company.com see the new feature2
tester_b@company.com see the new feature2
tester_c@company.com see nothing

更新人群组

下面我们更新一下人群组的规则,然后验证更新结果可以同时在两个toggle上生效。

页面上更新人群组

  1. 进入人群组qa_email的编辑页面
  2. 将email帐号test_b删除,添加email帐号test_c

tutorial_segment_after_update_cn.png

  1. 发布人群组

重新运行程序查看结果

按以上运行方法再次运行程序,查看log

tester_a@company.com see the new feature1
tester_b@company.com see nothing
tester_c@company.com see the new feature1
tester_a@company.com see the new feature2
tester_b@company.com see nothing
tester_c@company.com see the new feature2

可以看到修改在两个开关上都生效了。