| sidebar_position | 5 |
|---|
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
人群组是可以在多个开关中共享的人群过滤规则。 我们将带领你使用FeatureProbe的平台创建一个人群组,然后在两个开关中使用这个人群组。并且通过一个后端程序,验证人群组的修改会同时在两个开关中生效。
假定我们要实现以下场景:
- 有一个由测试人员email组成的白名单,需要在多个开关中使用。以便这组测试人员可以测试多个开关。
- 这个测试人员白名单需要统一修改,添加的新测试人员可以在多个开关中生效。
- 登录我们提供的FeatureProbe演示平台,如果是第一次登录,请输入邮箱。后续可以继续使用你的邮箱访问到属于你的数据。
- 点击
人群组/+人群组新建一个新的人群
- 填入名称和标识,点击
创建并发布
4.从列表中点击新创建的人群组,进入编辑。
- 添加一个规则,选择类型,输入属性
email,
- 选择
string类型 - 规则
是其中之一 - 然后输入两个测试人员email
- 点击
发布
6. 此时还没有开关使用这个『用户组』,这里直接点击下一步,并且确认变更。
下面,我们来到开关列表,创建两个开关都使用以上创建的人群组qa_email
- 创建一个返回值为bool型的开关
feature1,使用默认配置即可,然后点击创建并发布
- 进入开关
feature1的编辑页面,状态改为生效,点击+ 增加规则,选择人群组规则
- 编辑规则
- 选择
属于人群组 - 选择
测试人员email人群组 - 为人群组设置返回值
variation2 - 其余返回规则设置返回值
variation1
- 发布开关
feature1 - 重复以上步骤1-4,创建另一个使用相同人群组的开关
feature2
- 按你熟悉的语言,下载并打开相应的后端示例代码
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文件。
- 打开FeatureProbe平台项目列表页面, 可以在开关详情页点击
服务来打开
- 复制
服务端SDK密钥
- 将
服务端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密钥- 加入以下代码,模拟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.jarbash:> go run example/main.gobash:> cargo run --example demobash:> 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上生效。
- 进入人群组qa_email的编辑页面
- 将email帐号test_b删除,添加email帐号test_c
- 发布人群组
按以上运行方法再次运行程序,查看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可以看到修改在两个开关上都生效了。







