跳转到内容

Java 快速入门

几分钟之内,你的 Java 服务就会在进程内评估 feature flags——每次检查没有网络跳转,请求路径上没有延迟,一次轮询服务你的进程处理的每一个请求。

零依赖——包括 JSON:SDK 自带一个小型解析器,所以你的依赖树里不会多出任何新东西。它运行在 Java 17 及更高版本上。

SDK 放在 GitHub 上的一个公开仓库里——在发布标签处克隆它、构建它,并把它纳入你的构建——例如作为一个 Gradle included build,或者把 jar 发布到你的内部仓库:

Terminal window
git clone --branch v1.0.0 https://github.com/FortressFlag/FortressFlag_SDK_java
cd FortressFlag_SDK_java && ./gradlew build

这个 SDK 使用服务器密钥(ffs_…),它和移动端与 Web SDK 所携带的客户端密钥恰恰相反:它可以下载你的完整 ruleset,包括定向规则。像对待数据库密码一样对待它——环境变量或机密管理器,绝不进代码,绝不进仓库,绝不进日志。两类密钥,并排对照。

import com.fortressflag.server.Client;
import com.fortressflag.server.Configuration;
import com.fortressflag.server.FortressFlag;
import java.time.Duration;
Client client = FortressFlag.create(
Configuration.builder(System.getenv("FF_SERVER_KEY")).build());
// ^ SDK 唯一会抛出的地方:密钥格式错误,在任何东西开始提供之前。
client.start(Duration.ofSeconds(15)); // 在第一个 ruleset 到达时返回(或到达截止时间)
// ... 你的服务运行;flag 检查现在是内存中的方法调用。

start 永远不会抛出——如果第一次获取不能及时完成,客户端会在它的后台线程上继续尝试,而你的调用方在此期间拿到它们的回退值。轮询器运行在一个守护线程上:它永远不会阻止你的 JVM 退出。

import com.fortressflag.server.Context;
import java.util.Map;
boolean enabled = client.boolValue(
"new-checkout",
new Context(
"user-42", // 你的稳定上下文 key:用户 id、会话 id——由你选择
Map.of("cohort", "beta")),
false); // flag 未知或从未获取到任何东西时的回退值

client.stringValue 和 client.numberValue 的用法相同。上下文 key 是百分比灰度用来分桶的东西——始终传入同一个标识符,每个用户就会得到一个稳定的分组。它是你的数据:SDK 从不验证、存储或记录它。

就是这样——你的服务正在本地评估 flag。一次控制台变更会在大约一分钟内到达每一个进程。

boolValue、stringValue 和 numberValue 总会给出答案,从不抛出——一个 flag 方面的问题绝不能拖垮你的服务。重启后的进程在第一次获取完成之前提供你调用处的回退值(或者在 builder 上设置 cachePath,把最后一个 ruleset 持久化到你选定的文件,重启就能立即从它恢复)。即使密钥被吊销也不会弄坏任何东西:SDK 会继续用它最后下载的 ruleset 评估,直到你交给它一个新密钥。