Автор оригинала: 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 ServiceLoaderserviceLoader = 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 готов к предстоящим изменениям.