Статьи

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

Вступление

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

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

Соревнование

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

01
02
03
04
05
06
07
08
09
10
11
<dependency>
     <groupId>io.dropwizard.metrics</groupId>
     <artifactId>metrics-core</artifactId>
     <version>${codahale.metrics.version}</version>
</dependency>
 
<dependency>
     <groupId>io.dropwizard.metrics</groupId>
     <artifactId>metrics-core</artifactId>
     <version>${dropwizard.metrics.version}</version>
</dependency>

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

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

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

flexypoolmetricscodahaledropwizard

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

  • flexy-pool-core: определяет абстракцию FlexyPool Metrics
  • flexy-codahale-metrics: реализует абстракцию метрик FlexyPool поверх Codahale Matrics
  • flexy-dropwizard-metrics: реализует абстракцию метрик FlexyPool поверх матриц Dropwizard

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;
    }
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
private ServiceLoader<MetricsFactoryService>
    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!"
    );
}

Вывод

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