Skip to content

Commit e92733d

Browse files
authored
feat: change engine proxy to use flatbuffer implementation over wasm (#333)
1 parent 47632de commit e92733d

30 files changed

Lines changed: 326 additions & 241 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@ target
4646
**/bin/
4747
.vim/
4848
*.versionsBackup
49+
mise.toml

benches/jmh/unleash-client-benches/pom.xml

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,3 @@
1-
<!--
2-
Copyright (c) 2014, Oracle America, Inc.
3-
All rights reserved.
4-
5-
Redistribution and use in source and binary forms, with or without
6-
modification, are permitted provided that the following conditions are met:
7-
8-
* Redistributions of source code must retain the above copyright notice,
9-
this list of conditions and the following disclaimer.
10-
11-
* Redistributions in binary form must reproduce the above copyright
12-
notice, this list of conditions and the following disclaimer in the
13-
documentation and/or other materials provided with the distribution.
14-
15-
* Neither the name of Oracle nor the names of its contributors may be used
16-
to endorse or promote products derived from this software without
17-
specific prior written permission.
18-
19-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22-
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23-
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24-
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25-
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26-
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27-
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28-
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29-
THE POSSIBILITY OF SUCH DAMAGE.
30-
-->
31-
321
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
332
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
343
<modelVersion>4.0.0</modelVersion>

benches/jmh/unleash-client-benches/src/main/java/io/getunleash/UnleashClientBenchmark.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public void isEnabledWithContext(MyState myState, Blackhole bh) {
5656
bh.consume(myState.unleash.isEnabled("Test.impressionDataPresent", myState.context));
5757
}
5858

59+
5960
@Benchmark
6061
public void getDefaultVariant(MyState myState, Blackhole bh) {
6162
bh.consume(myState.unleash.getVariant("Test.impressionDataPresent"));

examples/cli-example/build.gradle.kts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
plugins {
22
java
33
application
4+
id("com.google.cloud.tools.jib").version("3.4.5")
45
}
56

67
application {
@@ -12,7 +13,36 @@ repositories {
1213
mavenLocal()
1314
}
1415

16+
java {
17+
targetCompatibility = JavaVersion.VERSION_25
18+
sourceCompatibility = JavaVersion.VERSION_25
19+
}
20+
21+
jib {
22+
container {
23+
mainClass = "io.getunleash.example.AdvancedConstraints"
24+
}
25+
from {
26+
image = "gcr.io/distroless/java25-debian13:latest"
27+
platforms {
28+
platform {
29+
architecture = "amd64"
30+
os = "linux"
31+
}
32+
platform {
33+
architecture = "arm64"
34+
os = "linux"
35+
}
36+
}
37+
}
38+
}
39+
1540
dependencies {
16-
implementation("io.getunleash:unleash-client-java:11.1.0")
17-
implementation("ch.qos.logback:logback-classic:1.4.12")
41+
implementation("io.getunleash:unleash-client-java:11.2.0-SNAPSHOT")
42+
implementation("org.slf4j:slf4j-api:2.0.17")
43+
runtimeOnly("org.apache.logging.log4j:log4j-core:2.25.2")
44+
runtimeOnly("org.apache.logging.log4j:log4j-api:2.25.2")
45+
runtimeOnly("org.apache.logging.log4j:log4j-slf4j2-impl:2.25.2")
46+
runtimeOnly("org.apache.logging.log4j:log4j-layout-template-json:2.25.2")
47+
runtimeOnly("com.fasterxml.jackson.core:jackson-databind:2.20.1")
1848
}
-15.9 KB
Binary file not shown.

examples/cli-example/gradlew

Lines changed: 30 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/cli-example/gradlew.bat

Lines changed: 21 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/cli-example/src/main/java/io/getunleash/example/AdvancedConstraints.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,36 @@
44
import io.getunleash.Unleash;
55
import io.getunleash.UnleashContext;
66
import io.getunleash.util.UnleashConfig;
7-
import io.getunleash.event.UnleashReady;
8-
import io.getunleash.event.ClientFeaturesResponse;
9-
import io.getunleash.event.UnleashSubscriber;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
109

1110
public class AdvancedConstraints {
11+
private static final Logger LOGGER = LoggerFactory.getLogger(AdvancedConstraints.class);
1212

1313
public static void main(String[] args) throws InterruptedException {
14+
String callsPerSecondStr = getOrElse("UNLEASH_RPS", "5");
15+
Integer callsPerSecond = Integer.parseInt(callsPerSecondStr);
16+
int sleepInterval = (int) ((1.0 / callsPerSecond) * 1000.0);
17+
String apiToken = getOrElse("UNLEASH_API_TOKEN",
18+
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349");
19+
String apiUrl = getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api");
1420
UnleashConfig config = UnleashConfig.builder()
15-
.appName("client-example.advanced.java")
16-
.customHttpHeader(
17-
"Authorization",
18-
getOrElse("UNLEASH_API_TOKEN",
19-
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349"))
20-
.unleashAPI(getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api"))
21-
.instanceId("java-example")
22-
.synchronousFetchOnInitialisation(true)
23-
.subscriber(new UnleashSubscriber() {
24-
public void onReady(UnleashReady ready) {
25-
System.out.println("Unleash is ready");
26-
}
27-
public void togglesFetched(ClientFeaturesResponse toggleResponse) {
28-
System.out.println("Fetch toggles with status: " + toggleResponse.getStatus());
29-
}
30-
})
31-
.sendMetricsInterval(30).build();
32-
33-
Unleash unleash = new DefaultUnleash(config);
34-
UnleashContext context = UnleashContext.builder()
35-
.addProperty("semver", "1.5.2")
36-
.build();
37-
UnleashContext smallerSemver = UnleashContext.builder()
38-
.addProperty("semver", "1.1.0")
21+
.appName("client-example.advanced.java")
22+
.customHttpHeader(
23+
"Authorization",
24+
apiToken)
25+
.unleashAPI(apiUrl)
26+
.instanceId("java-example")
27+
.synchronousFetchOnInitialisation(true)
3928
.build();
29+
LOGGER.info("Connecting to {}, evaluating at {} rps ({} ms interval)",apiUrl, callsPerSecond, sleepInterval);
30+
Unleash unleash = new DefaultUnleash(config);
4031
while (true) {
41-
unleash.isEnabled("advanced.constraints", context); // expect this to be true
42-
unleash.isEnabled("advanced.constraints", smallerSemver); // expect this to be false
32+
var results = unleash.more().evaluateAllToggles();
33+
var toggle = unleash.isEnabled("openai.chat");
34+
var variant = unleash.getVariant("openai.chat");
35+
LOGGER.info("Got {} toggles and openai.chat enabled {}, variant name: {}, featureEnabled was {} for openai.chat. sleeping {}ms", results.size(), toggle, variant.getName(), variant.isFeatureEnabled(), sleepInterval);
36+
Thread.sleep(sleepInterval);
4337
}
4438
}
4539

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.getunleash.example;
2+
3+
import io.getunleash.DefaultUnleash;
4+
import io.getunleash.Unleash;
5+
import io.getunleash.UnleashContext;
6+
import io.getunleash.util.UnleashConfig;
7+
8+
import static io.getunleash.example.AdvancedConstraints.getOrElse;
9+
10+
public class GetVariant {
11+
public static void main(String[] args) throws InterruptedException {
12+
UnleashConfig config = UnleashConfig.builder()
13+
.appName("client-example.advanced.java")
14+
.customHttpHeader(
15+
"Authorization",
16+
getOrElse("UNLEASH_API_TOKEN",
17+
"*:development.25a06b75248528f8ca93ce179dcdd141aedfb632231e0d21fd8ff349"))
18+
.unleashAPI(getOrElse("UNLEASH_API_URL", "https://app.unleash-hosted.com/demo/api"))
19+
.instanceId("java-example")
20+
.synchronousFetchOnInitialisation(true)
21+
.sendMetricsInterval(30).build();
22+
Unleash unleash = new DefaultUnleash(config);
23+
UnleashContext context = UnleashContext.builder()
24+
.addProperty("semver", "1.5.2")
25+
.build();
26+
UnleashContext smallerSemver = UnleashContext.builder()
27+
.addProperty("semver", "1.1.0")
28+
.build();
29+
while (true) {
30+
unleash.getVariant("advanced.constraints"); // expect this to be true
31+
unleash.getVariant("advanced.constraints", smallerSemver); // expect this to be false
32+
Thread.sleep(1);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)