给不同用户展示不同信息
我们将带领你使用FeatureProbe的平台创建一个按用户特性控制的开关。然后我们编写一个后端程序,验证后端程序拿不同的用户信息请求FeatureProbe SDK,会拿到不同的结果。
假定我们要实现以下场景:
- 对于『上海』的『钻石』用户,显示『欢迎上海的尊贵客户』
- 对于『北京』的用户(不区分级别),显示『欢迎北京的客户』
- 对于不满足以上两点的用户,显示『欢迎』
在平台创建开关
- 登录我们提供的FeatureProbe演示平台,如果是第一次登录,请输入邮箱。后续可以继续使用你的邮箱访问到属于你的数据。
- 点击
+开关
新建一个开关
- 填入名称和标识
- 选择string类型作为返回值
- 添加3个分组,分别将名称和值填入,值就是我们要返回的三个不同的提示语
- 选择当开关未生效时的默认返回的分组
- 点击
创建并发布
- 点击进入新创建的
tutorial_variation
开关的详情页面
- 点击
+ 增加规则
- 规则中增加两个条件,city是上海,以及rank是钻石
- 返回值选择为variation1(即值为:欢迎上海的尊贵客户)
- 再次点击
+ 增加规则
- 规则中增加条件,city是北京,返回值选择为variation2
- 默认规则的返回值选择为variation3
- 开关状态改为
生效
,点击下方发布
- 点击
确认
,发布开关。
- 此时应当看到
发布成功
的提示
在平台的操作到这里就结束了,开关已经创建成功,并且可以访问了。下面我们介绍怎么在程序中通过SDK拿到这些配置值。
控制后端程序
我们提供一个后端的代码示例,你可以从这里开始体验后端代码如何使用开关。
编写代码
- 按你熟悉的语言,下载并打开相应的后端示例代码
- Java
- Go
- Rust
- Python
- Node.js
git clone https://gitee.com/FeatureProbe/server-sdk-java.git
cd server-sdk-java
用编辑器打开src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java
文件。
git clone https://gitee.com/FeatureProbe/server-sdk-go.git
cd server-sdk-go
用编辑器打开example/main.go
文件。
git clone https://gitee.com/FeatureProbe/server-sdk-rust.git
cd server-sdk-rust
用编辑器打开examples/demo.rs
文件。
git clone https://gitee.com/FeatureProbe/server-sdk-python.git
cd server-sdk-python
用编辑器打开demo.py
文件。
git clone https://github.com/FeatureProbe/server-sdk-node.git
cd server-sdk-node
用编辑器打开example/demo.js
文件。
- 打开FeatureProbe平台项目列表页面, 可以在开关详情页点击
服务
来打开 - 复制
服务端SDK密钥
- 将
服务端SDK密钥
以及FeatureProbe网址
("https://featureprobe.io/server") 填入后端代码相应变量中
- Java
- Go
- Rust
- Python
- Node.js
src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java
private static final String FEATURE_PROBE_SERVER_URL = "https://featureprobe.io/server";
private static final String FEATURE_PROBE_SERVER_SDK_KEY = // 填入 服务端SDK密钥 ;
example/main.go
config := featureprobe.FPConfig{
RemoteUrl: "https://featureprobe.io/server",
ServerSdkKey: // 填入 服务端SDK密钥
RefreshInterval: 5000, // ms
WaitFirstResp: true,
}
examples/demo.rs
let remote_url = "https://featureprobe.io/server";
let server_sdk_key = // 填入 服务端SDK密钥
demo.py
FEATURE_PROBE_SERVER_URL = 'https://featureprobe.io/server'
FEATURE_PROBE_SERVER_SDK_KEY = # 填入 服务端SDK密钥
demo.js
const FEATURE_PROBE_SERVER_URL = 'https://featureprobe.io/server';
const FEATURE_PROBE_SERVER_SDK_KEY = // 填入 服务端SDK密钥
- 加入以下代码,模拟5个用户访问这个开关
- 上海的钻石用户
- 上海的黄金用户
- 北京的钻石用户
- 北京的黄金用户
- 天津的钻石用户
- Java
- Go
- Rust
- Python
- Node.js
src/main/java/com/featureprobe/sdk/example/FeatureProbeDemo.java
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);
FPUser[] users = {
new FPUser().with("city", "上海").with("rank", "钻石"),
new FPUser().with("city", "上海").with("rank", "黄金"),
new FPUser().with("city", "北京").with("rank", "钻石"),
new FPUser().with("city", "北京").with("rank", "黄金"),
new FPUser().with("city", "天津").with("rank", "钻石"),
};
for (FPUser user:users) {
String greeting = fpClient.stringValue("tutorial_variation", user, "欢迎您");
System.out.println(greeting);
}
fpClient.close();
}
example/main.go
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
}
users := []featureprobe.FPUser{
featureprobe.NewUser().With("city", "上海").With("rank", "钻石"),
featureprobe.NewUser().With("city", "上海").With("rank", "黄金"),
featureprobe.NewUser().With("city", "北京").With("rank", "钻石"),
featureprobe.NewUser().With("city", "北京").With("rank", "黄金"),
featureprobe.NewUser().With("city", "天津").With("rank", "钻石"),
}
for _, user := range users {
greeting := fp.StrValue("tutorial_variation", user, "你好啊")
fmt.Println(greeting)
}
fp.Close()
}
examples/demo.rs
#[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),
..Default::default()
};
let fp = match FeatureProbe::new(config) {
Ok(fp) => fp,
Err(e) => {
tracing::error!("{:?}", e);
return;
}
};
let users = [
FPUser::new().with("city", "上海").with("rank", "钻石"),
FPUser::new().with("city", "上海").with("rank", "黄金"),
FPUser::new().with("city", "北京").with("rank", "钻石"),
FPUser::new().with("city", "北京").with("rank", "黄金"),
FPUser::new().with("city", "天津").with("rank", "钻石")
];
for user in users {
let greeting = fp.string_value("tutorial_variation", &user, "你好啊".to_string());
println!("{:?}", greeting);
}
fp.close();
}
demo.py
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='polling',
refresh_interval=3)
with fp.Client(FEATURE_PROBE_SERVER_SDK_KEY, config) as client:
users = [
fp.User().with_attr("city", "上海").with_attr("rank", "钻石"),
fp.User().with_attr("city", "上海").with_attr("rank", "黄金"),
fp.User().with_attr("city", "北京").with_attr("rank", "钻石"),
fp.User().with_attr("city", "北京").with_attr("rank", "黄金"),
fp.User().with_attr("city", "天津").with_attr("rank", "钻石")
]
for user in users:
greeting = client.value('tutorial_variation', user, default="你好")
print(greeting)
demo.js
const fpClient = new featureProbe.FeatureProbe({
remoteUrl: FEATURE_PROBE_SERVER_URL,
serverSdkKey: FEATURE_PROBE_SERVER_SDK_KEY,
refreshInterval: 5000,
});
const users = [
new featureProbe.FPUser().with("city", "上海").with("rank", "钻石"),
new featureProbe.FPUser().with("city", "上海").with("rank", "黄金"),
new featureProbe.FPUser().with("city", "北京").with("rank", "钻石"),
new featureProbe.FPUser().with("city", "北京").with("rank", "黄金"),
new featureProbe.FPUser().with("city", "天津").with("rank", "钻石"),
];
for(let i = 0; i < users.length; i++) {
const greeting = fpClient.stringValue("tutorial_variation", users[i], "你好");
console.log(greeting);
}
提示
用户的属性(例如:所在城市、帐号级别)需要开发者通过其他方式在业务代码中获取到,然后通过With方法传入FeatureProbe SDK。 SDK只负责将规则应用到这些用户上,SDK无法在内部自己推断出用户的属性。
- 运行编辑后的服务端程序
- Java
- Go
- Rust
- Python
- Node.js
mvn package
java -jar ./target/server-sdk-java-1.4.0.jar
go run example/main.go
cargo run --example demo
pip3 install -r requirements.txt
python3 demo.py
node demo.js
验证结果
从命令行log可以看到,对于以下五个测试用户
- 上海的钻石用户
- 上海的黄金用户
- 北京的钻石用户
- 北京的黄金用户
- 天津的钻石用户
应用了规则
- 对于『上海』的『钻石』用户,显示『欢迎上海的尊贵客户』
- 对于『北京』的用户(不区分级别),显示『欢迎北京的客户』
- 对于不满足以上两点的用户,显示『欢迎』
之后,拿到了以下结果
欢迎上海的尊贵客户
欢迎
欢迎北京的客户
欢迎北京的客户
欢迎
可以更改代码,尝试更多用户属性组合,看看log中显示的结果是否符合条件。
控制前端程序
我们提供一个前端的js代码示例,你可以从这里开始体验前端代码如何使用开关。
编写代码
- 下载示例代码
git clone https://gitee.com/FeatureProbe/client-sdk-js.git
cd client-sdk-js
- 打开平台获取client sdk key
信息
点击『服务』Tab,可以进入『服务』列表,获取各类SDK key,以及修改服务和环境信息。
- 打开
example/index.html
填入客户端SDK密钥
以及FeatureProbe网址
("https://featureprobe.io/server")
example/index.html
const fpClient = new featureProbe.FeatureProbe({
remoteUrl: "https://featureprobe.io/server",
clientSdkKey: // Paste client sdk key here,
user,
refreshInterval: 5000,
});
- 模拟『上海』的『钻石』用户访问开关
tutorial_variation
,直接获取开关状态
example/index.html
<script>
const user = new featureProbe.FPUser().with("city", "上海").with("rank", "钻石");
const fpClient = new featureProbe.FeatureProbe({
remoteUrl: "https://featureprobe.io/server",
clientSdkKey: // Paste client sdk key here,
user,
refreshInterval: 5000,
});
fpClient.start();
fpClient.on("ready", function() {
const stringValue = fpClient.stringValue("tutorial_variation", "欢迎");
document.getElementById("string-result").innerText = stringValue;
});
</script>
验证结果
浏览器打开 index.html
, 可以看到对与当前这个『上海』的『钻石』用户,显示了『欢迎上海的尊贵客户』。
string type
FeatureProbe evaluation string type toggle result is : 欢迎上海的尊贵客户
可以回到 index.html
文件,然后更新 with
参数,看看返回值有什么差别。
example/index.html
const user = new featureProbe.FPUser().with("city", "北京").with("rank", "钻石");