Рубрики
Без рубрики

Как Flexipool поддерживает переименование пакета метрик Dropwizard

Автор оригинала: Vlad Mihalcea.

Пул Flexi в значительной степени зависит от Dropwizard (ранее Codahale) Метрик для мониторинга использования пула соединений . Будучи интегрированным в Dropwizard, имя пакета было обязательно переименовано .

Поэтому вместо com.codahale.metrics в выпуске 4.0.0 будет использоваться имя пакета io.dropwizard.metrics .

Помимо очевидной обратной несовместимости, наиболее сложным аспектом этого изменения является то, что зависимость Maven будет видеть только увеличение версии. Это означает, что вы не сможете включить обе версии в один и тот же модуль Maven, потому что groupId и artifactId не изменятся между изменениями версии 3.x.x и 4.x.x.


     io.dropwizard.metrics
     metrics-core
     ${codahale.metrics.version}



     io.dropwizard.metrics
     metrics-core
     ${dropwizard.metrics.version}

Это изменение можно выполнить в приложении конечного пользователя, так как вам нужно только перейти с одной версии на другую. Фреймворк с открытым исходным кодом, построенный поверх метрик Dropwizard, гораздо сложнее реорганизовать, поскольку вам необходимо поддерживать две несовместимые версии одной и той же библиотеки. В конце концов, вы не хотите заставлять своих клиентов переходить на определенную зависимость от показателей.

К счастью, у пула Flexi с самого начала был свой собственный уровень абстракции показателей. Изоляция фреймворка от внешних зависимостей-это мера безопасности, позволяющая обмениваться зависимостями без особых усилий.

Для поддержки имен пакетов Codahale и Dropwizard метрики Flexipool строятся следующим образом:

Поскольку эти классы не могут находиться в одном jar, существует три модуля, в которых размещена эта иерархия:

  • ядро flexy-пула: определяет абстракцию показателей Flexipool
  • flexy-codahale-метрики: реализует абстракцию метрик Flexipool поверх метрик Codahale
  • flexy-dropwizard-метрики: реализует абстракцию метрик Flexipool поверх метрик Dropwizard

Каждый MetricsFactory зарегистрирован как Поставщик услуг :

public class CodahaleMetricsFactoryService 
    implements MetricsFactoryService {

    public static final String METRICS_CLASS_NAME = 
        "com.codahale.metrics.Metric";

    @Override
    public MetricsFactory load() {
        return ClassLoaderUtils
            .findClass(METRICS_CLASS_NAME) ? 
                CodahaleMetrics.FACTORY : null;
    }
}

public class DropwizardMetricsFactoryService 
    implements MetricsFactoryService {

    public static final String METRICS_CLASS_NAME = 
        "io.dropwizard.metrics.Metric";

    @Override
    public MetricsFactory load() {
        return ClassLoaderUtils
            .findClass(METRICS_CLASS_NAME) ? 
                DropwizardMetrics.FACTORY : null;
    }
}

и службы разрешаются во время выполнения:

private ServiceLoader 
    serviceLoader = ServiceLoader.load(
        MetricsFactoryService.class);

public MetricsFactory resolve() {
    for(MetricsFactoryService service : serviceLoader) {
        MetricsFactory metricsFactory = service.load();
        if(metricsFactory != null) {
            return metricsFactory;
        }
    }
    throw new IllegalStateException(
        "No MetricsFactory could be loaded!"
    );
}

Таким образом, Flexipool может использовать обе реализации метрик, и решение принимается динамически на основе имеющейся в настоящее время библиотеки. Метрики Dropwizard 4.0.0 еще не выпущены, но пул Flexi готов к предстоящим изменениям.