Создавал ли Starter
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Spring Boot Starter: опыт разработки
Да, я создавал свой Spring Boot Starter для внутреннего использования в компании. Расскажу о процессе.
Зачем создавать Starter?
В компании было несколько микросервисов, и каждый заново:
- Настраивал логирование
- Добавлял метрики (Prometheus)
- Конфигурировал трейсинг (Jaeger)
- Делал health checks
- Настраивал безопасность
Зачем повторяться? Создали свой Starter.
Структура Starter
my-company-spring-boot-starter/
├── spring-boot-starter-mycompany/
│ ├── src/main/java/
│ │ └── com/mycompany/starter/
│ │ ├── logging/
│ │ ├── metrics/
│ │ ├── tracing/
│ │ ├── health/
│ │ └── autoconfigure/
│ ├── pom.xml
│ └── application.yml
└── pom.xml
Ключевые компоненты
1. Auto-configuration class
@Configuration @EnableConfigurationProperties(MyCompanyProperties.class) @ConditionalOnMissingBean
public class MyCompanyAutoConfiguration {
@Bean
public LoggingConfigurer loggingConfigurer() {
return new LoggingConfigurer();
}
@Bean
public MetricsRegistrar metricsRegistrar() {
return new MetricsRegistrar();
}
}
2. Properties class
@ConfigurationProperties(prefix = "mycompany")
public class MyCompanyProperties {
private Logging logging = new Logging();
private Metrics metrics = new Metrics();
public static class Logging {
private String level = "INFO";
private boolean includeStackTrace = true;
}
}
3. spring.factories (или @SpringBootApplication для Spring Boot 2.7+)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.mycompany.starter.autoconfigure.MyCompanyAutoConfiguration
Как используется
В микросервисе просто добавляешь зависимость:
<dependency> ``` <groupId>com.mycompany</groupId> <artifactId>spring-boot-starter-mycompany</artifactId> <version>1.0.0</version> ``` </dependency>И вся конфигурация готова. В application.yml:
mycompany: logging:
level: DEBUG
includeStackTrace: true
metrics:
enabled: true
Что дал Starter
- Сокращение кода в 5 микросервисах на 500+ строк
- Единая конфигурация логирования везде
- Одна версия библиотек (Prometheus, Jaeger)
- Consistency в компании
- 10 минут на подключение вместо 2 часов
Проблемы, которые встретили
1. Версионирование
- Starter версия 1.0.0, но разные микросервисы используют разные версии
- Решение: semver (major.minor.patch) и clear changelog
2. Конфликты зависимостей
- Starter требует Jackson 2.14, но проект уже имеет 2.13
- Решение: использовать правильные range версий в pom.xml
3. Когда отключать функционал
@ConditionalOnProperty(name = "mycompany.metrics.enabled", havingValue = "true")
public class MetricsAutoConfiguration { }
4. Тестирование Starter
@SpringBootTest
class MyCompanyStarterTest {
@Test
void autoConfigurationLoadsSuccessfully(@Autowired LoggingConfigurer configurer) {
assertNotNull(configurer);
}
}
Лучшие практики
- Назва должна быть descriptive: spring-boot-starter-mycompany-logging
- Документация: README с примерами
- Версионирование: semver обязателен
- Backward compatibility: не ломай версии при обновлении
- Тесты: покрытие >80%
Publishing Starter
Обычно в компании используют внутренний Artifactory:
<distributionManagement> ``` <repository> <id>company-artifactory</id> <url>https://artifactory.mycompany.com/artifactory/release</url> </repository> ``` </distributionManagement>И в settings.xml:
<server> ``` <id>company-artifactory</id> <username>your-username</username> <password>your-password</password> ``` </server>Вывод
Создание своего Starter — отличный способ:
- Унифицировать конфигурацию
- Сократить boilerplate код
- Обучить других разработчиков лучшим практикам
- Демонстрировать знание Spring Boot internals