Skip to content

Java SDK

Java SDK для можно. — клиентская библиотека для JVM-приложений. Оценивает флаги локально, синхронно, и интегрируется со Spring Boot через авто-конфигурацию. Совместим с JDK 17+ (артефакт собирается под Java 17), работает в любых JVM-фреймворках.

Установка

Gradle (Kotlin DSL)

kotlin
repositories {
    mavenCentral()
}

dependencies {
    implementation("dev.mozhno:mozhno-client-java:1.1.1")
}

Gradle (Groovy DSL)

groovy
repositories {
    mavenCentral()
}

dependencies {
    implementation 'dev.mozhno:mozhno-client-java:1.1.1'
}

Совет: актуальную версию смотрите на странице релизов.

Системные требования

ТребованиеМинимальная версия
JDK17+
СовместимостьЛюбой JVM-фреймворк (Spring Boot, Quarkus, Micronaut, Vanilla Java)

Конфигурация

Конфигурация создаётся через билдер MozhnoConfig.builder(), затем на её основе создаётся клиент DefaultMozhnoClient. Создавайте один экземпляр клиента и переиспользуйте его во всём приложении:

java
import dev.mozhno.sdk.MozhnoClient;
import dev.mozhno.sdk.MozhnoConfig;
import dev.mozhno.sdk.MozhnoContext;
import dev.mozhno.sdk.DefaultMozhnoClient;

MozhnoConfig config = MozhnoConfig.builder()
    .appName("my-app")
    .instanceId("instance-1")
    .mozhnoUrl("https://mozhno.example.com")
    .apiKey("<api-key>")
    .fetchTogglesInterval(15)
    .sendMetricsInterval(60)
    .environment("production")
    .build();

MozhnoClient client = new DefaultMozhnoClient(config);
client.start();

Параметры билдера

МетодТипОбязательноПо умолчаниюОписание
appName(String)StringДаИдентификатор приложения
instanceId(String)StringДаУникальный идентификатор экземпляра
mozhnoUrl(String)StringДаБазовый URL сервера можно.
apiKey(String)StringДаAPI-ключ окружения
fetchTogglesInterval(int)intНет15 секИнтервал опроса флагов
sendMetricsInterval(int)intНет60 секИнтервал отправки метрик
environment(String)StringНетnullИмя окружения
disableMetrics(boolean)booleanНетfalseОтключить отправку метрик
synchronousFetchOnInitialisation(boolean)booleanНетfalseБлокировать на первичной загрузке правил
stickyAnonId(boolean)booleanНетtrueАвтогенерация стабильного анонимного ID для роллаута
contextProvider(MozhnoContextProvider)НетnullКастомный провайдер контекста
proxy(java.net.Proxy)ProxyНетnullHTTP-прокси

Интеграция со Spring Boot

SDK предоставляет авто-конфигурацию MozhnoAutoConfiguration. Настройка через application.yml:

yaml
mozhno:
  url: https://mozhno.example.com
  api-key: <api-key>
  app-name: my-app
  instance-id: ${random.uuid}
  environment: production
  fetch-toggles-interval: 15
  send-metrics-interval: 60
  sticky-anon-id: true

Клиент автоматически создаётся и доступен как Spring-бин:

java
@Service
public class CheckoutService {

    private final MozhnoClient mozhnoClient;

    public CheckoutService(MozhnoClient mozhnoClient) {
        this.mozhnoClient = mozhnoClient;
    }

    public boolean isNewCheckoutEnabled(String userId) {
        MozhnoContext context = MozhnoContext.builder()
            .userId(userId)
            .addProperty("country", "RU")
            .build();
        return mozhnoClient.isEnabled("new-checkout", context);
    }
}

MozhnoContext

Объект контекста на основе билдера для передачи атрибутов в момент оценки.

java
import dev.mozhno.sdk.MozhnoContext;

MozhnoContext context = MozhnoContext.builder()
    .userId("user-12345")
    .sessionId("session-abc")
    .addProperty("country", "RU")
    .addProperty("plan", "enterprise")
    .addProperty("appVersion", "2.4.1")
    .build();

Все значения атрибутов — строки. Для числовых сравнений задайте contextType: number в правилах таргетинга.

Анонимные пользователи и роллаут

Для процентного роллаута SDK использует userId, затем sessionId как идентификатор корзины. Если в контексте нет ни одного, клиент автоматически генерирует стабильный anonymousId (случайный UUID при старте клиента) и использует его — анонимные запросы распределяются по корзинам равномерно и стабильно для каждого экземпляра приложения. Отключить поведение можно через stickyAnonId(false) (или mozhno.sticky-anon-id: false в Spring) — тогда все анонимные запросы без идентификатора попадут в одну группу, а SDK выведет предупреждение в лог. Подробнее о поведении при обновлении SDK — в гайде по роллауту.

Методы билдера контекста

МетодОписание
userId(String)Идентификатор пользователя (используется для хеширования при процентном роллауте)
sessionId(String)Идентификатор сессии (запасной ключ для хеширования)
appName(String)Имя приложения
environment(String)Имя окружения
addProperty(String key, String value)Произвольный атрибут

Что дальше?

Released under the BSL 1.1 License.